Добрый день! Поясните, пожалуйста, 3000 р. стоит документ об окончании курса. Если он не нужен, то можно учиться бесплатно? |
Массивы, циклы, принятие решений
7.7. Динамические массивы
07-05-Динамические массивы.docm - пример к п. 7.7.
Когда вы используете массив, не всегда известно заранее, сколько элементов он будет иметь. В такой ситуации можно объявить массив, который содержит заведомо больше элементов, чем может понадобиться, но это приведет к нерациональному использованию системных ресурсов. Что же делать? Динамические массивы - вот достойный ответ на этот вопрос.
Решим задачу. Программа просит пользователя ввести количество сотрудников, которое сохраняет в переменной ArraySize, а потом создает массив, одна из размерностей которого равняется ArraySize.
Чтобы воспользоваться динамическим массивом, сначала нужно объявить пустой массив, например, командой Dim MyArray(), а потом задать размерность массива командой ReDim (листинге 7.7.)
Dim MyArray() ArraySize = InputBox("Введите количество сотрудников") ReDim MyArray(1 To ArraySize, 1 To 2)Листинг 7.7. Работа с динамическим массивом
В итоге, если на вопрос программы о количестве сотрудников мы ввели число 15, будет создан двумерный массив размерностью 15х2.
Если в программе возникла ситуация, когда последней размерности объявленного и заполненного массива не хватает для хранения данных, вы можете увеличить его командой ReDim с ключевым словом Preserve. Благодаря ему данные, внесенные ранее в массив, будут сохранены. Например, для добавления двух дополнительных столбцов в динамический массив из листинга 7.7. нужно использовать такую команду:
ReDim Preserve MyArray(1 To ArraySize, 1 To 4)
7.8. Дополнительные команды работы с массивами
07-06-Дополнительные команды.docm - пример к п. 7.8.
Для работы с массивами вы можете использовать еще некоторые команды.
Array (Список аргументов)- позволяет быстро заполнять массив. Например, в листинге 7.8. массив MyArray заполняется числами 1, 2, 6, 9 и 19, после чего первый элемент массива выводится в окне сообщения.
Dim MyArray MyArray = Array(1, 2, 6, 9, 19) MsgBox MyArray(0)Листинг 7.8. Работа с оператором Array
IsArray (Имя переменной) - возвращает True если переменная является массивом. Например, в листинге 7.9. мы объявляем две переменные - одну из них как массив, вторую - как обычную переменную. Далее мы используем оператор IsArray для проверки того, является ли переменная массивом. После чего программа выводит соответствующее сообщение. Здесь мы использовали оператор сравнения If, подробности о котором мы рассмотрим ниже.
Dim MyArray(10) Dim MyArr If IsArray(MyArray) Then _ MsgBox ("Переменная MyArray - массив") _ Else MsgBox ("Переменная MyArray - не массив") If IsArray(MyArr) Then _ MsgBox ("Переменная MyArr - массив") _ Else MsgBox ("Переменна MyArr - не массив")Листинг 7.9. Работа с функцией IsArray
LBound (Имя Массива, Размерность) - возвращает нижнюю границу для указанной размерности массива.
UBound (Имя Массива, Размерность) - возвращает верхнюю границу для указанной размерности массива.
Рассмотрим пример. Создадим динамический двумерный массив, размерности которого заданы с помощью генератора случайных чисел. После этого с помощью операторов LBound и UBound узнаем размерности массива и выведем их в окнах сообщений. Далее - используем двойной цикл для заполнения массива случайными числами (листинг 7.10.)
Dim MyArray() ReDim MyArray(Int(Rnd * 5 + 5), Int(Rnd * 5 + 5)) MsgBox ("Двумерный массив MyArray:" + Chr(13) + _ "Первая размерность:" + _ Str(LBound(MyArray, 1)) + " -" + _ Str(UBound(MyArray, 1)) + Chr(13) + _ "Вторая размерность:" + _ Str(LBound(MyArray, 2)) + " -" + _ Str(UBound(MyArray, 2))) For i = LBound(MyArray, 1) To UBound(MyArray, 1) For j = LBound(MyArray, 2) To UBound(MyArray, 2) MyArray(i, j) = Int(Rnd * 100) Next j Next iЛистинг 7.10. Работа с функциями LBound и UBound
В нашем случае команда LBound для обеих размерностей массива возвращает 0 так как по умолчанию нумерация элементов массива начинается с 0. А вот Ubound возвращает границу каждой из размерностей, которая установлена случайным образом с помощью оператора ReDim. На рис. 7.1. вы можете видеть окно сообщения c информацией о границах массива.
Erase Имя_массива - очистить массив. Элементы обычных массивов, содержащих числовые данные, обнуляются. Если мы применим команду Erase к массиву строк - каждый его элемент будет хранить строку нулевой длины (""). Применяя команду Erase к динамическому массиву, мы очищаем память, выделенную этому массиву командой ReDim. Причем, для повторного использования динамического массива, придется снова устанавливать его размерности. Если команда Erase применяется к объектному массиву, в каждый его элемент записывается специальное значение Nothing, которое означает пустую ссылку на объект.
Теперь, когда мы обсудили циклы For-Next и работу с массивами, поговорим о других типах циклов.
7.9. Цикл с предусловием
07-07-Цикл с предусловием.docm - пример к п. 7.9.
Как вы уже знаете, цикл с предусловием While - Wend выполняется до тех пор, пока условие, указанное на входе, верно.
В листинге 7.11. представлено решение такой задачи: выводить на экран случайные числа от 0 до 20 до тех пор, пока не будет выведено число больше 10.
А = 1 While А < 10 А = Int(Rnd() * 20) MsgBox А WendЛистинг 7.11. Вывод случайных чисел в цикле While - Wend
Сначала мы приравниваем переменной А число 1. Проверка при входе в цикл находит, что А меньше 10 и запускает первый проход. Переменной А приравнивается целое случайное число, это число выводится в окне сообщения. Дальше следует новая проверка - если A все еще меньше 10 - все повторяется снова. Если A больше или равно 10 - число не выводится, после чего выполнение цикла прекращается.
Теперь рассмотрим цикл с постусловием.
7.10. Цикл с постусловием
07-08-Цикл с постусловием.docm - пример к п. 7.10.
Цикл Do-Loop While выполняется до тех пор, пока значение на выходе из цикла не верно. Подобные циклы используют, например, для проверки правильности ввода каких-либо данных пользователем. Если данные введены неверно - цикл выполняется снова.
Аналогично действует цикл Do-Loop Until - он будет выполняться до тех пор, пока условие цикла неверно (то есть равно False ).
В листинге 7.12. вы можете найти пример такого цикла. Здесь пользователю предлагается ввести какое-нибудь число. Если введено не число (то есть функция IsNumeric возвратит False ), программа выведет окно ввода снова.
Dim var_A Do var_A = InputBox("Введите число") Loop Until IsNumeric(var_A)Листинг 7.12. Проверка ввода в цикле с постусловием
7.11. Принятие решений: If-Then-Else
07-09-If-Then-Else.docm - пример к п. 7.11.
Программы на VBA умеют принимать решения - для этого существуют операторы условного перехода. Они объединены в конструкцию If - Then - Else.
В этой конструкции могут быть использованы следующие операторы сравнения (табл. 7.4.)
Оператор | Описание |
---|---|
= | Равно |
<> | Не равно |
> | Больше |
< | Меньше |
>= | Больше или равно |
<= | Меньше или равно |
Like | Сравнение строки с шаблоном |
Is | Сравнение объектов |
Напишем простую программу (листинг 7.13.), которая спрашивает у пользователя его возраст. Если введенный возраст меньше 18 - программа должна вывести надпись "Вам менее 18 лет", если больше или равен 18 - надпись "Вам 18 или больше".
a = InputBox("Введите ваш возраст") If a < 18 Then MsgBox ("Вам меньше 18") If a >= 18 Then MsgBox ("Вам 18 или больше")Листинг 7.13. Оператор If - Then
Здесь представлен оператор в простейшем виде - проверка условия и выполнение однострочной команды. А что если нужно выполнить не одну команду, а несколько? Для этого служит команда End If (листинг 7.14.)
a = InputBox("Введите ваш возраст") If a < 18 Then MsgBox ("Вам меньше 18") MsgBox ("Вам не следует смотреть этот фильм") End If If a >= 18 Then MsgBox ("Добро пожаловать")Листинг 7.14. Использование команды End If
Здесь программа выводит два сообщения, если пользователю меньше 18 лет.
Оператор может иметь вид If - Then - Else (листинг 7.15). Благодаря ему два оператора If - Then из листинга 7.13. можно объединить в один.
a = InputBox("Введите ваш возраст") If a < 18 Then MsgBox ("Вам меньше 18") _ Else MsgBox ("Вам больше 18")Листинг 7.15. Использование команды Else
Применение команды Else так же позволяет исполнять многострочные команды. Например, вот так - листинг 7.16.
a = InputBox("Введите ваш возраст") If a < 18 Then MsgBox ("Вам меньше 18") MsgBox ("Вам не следует смотреть этот фильм") Else MsgBox ("Вам больше 18") MsgBox ("Добро пожаловать") End IfЛистинг 7.16. Выполнение многострочных команд
В операторе If возможно использование сложных условий. Например, вы просите пользователя ввести имя и пароль. Если они соответствуют данным, хранящимся в системе, программа выводит приветствие, иначе - сообщает о том, что пользователь ввел неправильные сведения. Очевидно, что нам нужно проверить два условия, причем важно, чтобы и то и другое выполнялось. Для этого можно воспользоваться логическим оператором And, который трактуется как "И". Конструкция с And выглядит так - листинг 7.17.
UserName = InputBox("Введите имя пользователя") UserPass = InputBox("Введите ваш пароль") If UserName = "Александр" And UserPass = "12345" Then MsgBox ("Добро пожаловать в систему") Else MsgBox ("Неверное имя пользователя или пароль") End IfЛистинг 7.17. Использование And
Словесно вышеприведенную конструкцию можно описать так: " Если имя равно Александр и пароль равен 12345…".
Логический оператор Or (переводится как "Или") позволяет принять положительное решение, если выполняется хотя бы одно из условий. Например, нам нужно узнать имя пользователя, и если оно соответствует одному из имен, зарегистрированных в системе, вывести приветствие, иначе - вывести информацию об отсутствии в системе такого пользователя - листинг. 7.18.
UserName = InputBox("Введите имя пользователя") If UserName = "Александр" Or UserName = "Сергей" Or _ UserName = "Николай" Then MsgBox ("Добро пожаловать в систему, " & UserName) Else MsgBox ("В системе нет такого пользователя!") End IfЛистинг 7.18. Использование Or
And и Or можно использовать вместе. Оператор Not (Не) позволяет задавать условия с отрицанием. Например, вы можете пропустить в систему всех пользователей кроме пользователя с именем "Владимир".
Для проверки дополнительных условий можно использовать оператор If - Then - Else.
Выше, в табл. 7.4., есть пара необычных операторов - Like для сравнения строк с шаблоном, и Is - для сравнения объектных переменных.