Опубликован: 25.03.2009 | Уровень: для всех | Доступ: свободно | ВУЗ: Институт управления, бизнеса и права
Лекция 7:

Массивы, циклы, принятие решений

< Лекция 6 || Лекция 7: 123 || Лекция 8 >

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 информацией о границах массива.

Сообщение о размерностях массива

Рис. 7.1. Сообщение о размерностях массива

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.)

Таблица 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 - для сравнения объектных переменных.

< Лекция 6 || Лекция 7: 123 || Лекция 8 >
Евгений Ушаков
Евгений Ушаков

Добрый день! Поясните, пожалуйста, 3000 р. стоит документ об окончании курса. Если он не нужен, то можно учиться бесплатно?

Александр Новиков
Александр Новиков

Добрый день! Очень нужен справочник по объектам VBA c описание их методов и свойств.

Кто-нибудь знает, где можно приобрести?

(Он конечно есть в VBA - Object browser, но не очень удобный)