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

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

< Лекция 6 || Лекция 7: 123 || Лекция 8 >
Аннотация: Лекция посвящена описанию основных программных конструкций VBA. Здесь будет освещена работа с массивами, циклами, операторами принятия решений. Так же в этой лекции мы поговорим о работе с внешними файлами.

7.1. Массивы

Решим простую задачу: ввести в ответ на вопросы программы фамилии сотрудников. Если фамилий немного - 5 или 10 - использование переменных, с которыми вы уже знакомы, вполне оправдано. Программа будет состоять из нескольких строк такого вида:

a = InputBox("Введите фамилию сотрудника").

Как быть, если нужно работать со списком из 20 фамилий? А если их будет 50, 1000 или их количество должно быть определено в ходе выполнения программы?

Для обработки больших объемов информации использовать переменные неудобно. Что же делать? Ответ прост: использовать массивы.

Массив - это именованный набор индексированных ячеек. Ячейки так же называют элементами или индексированными переменными.

У каждого массива 5 основных характеристик: имя, размерность, число элементов, номер первого элемента и тип элементов.

  • Имя - правила именования массивов аналогичны правилам именования переменных.

  • Размерность - одномерные массивы напоминают одну строку таблицы, каждая ячейка которой содержит какие-то данные. Многомерные массивы имеют больше измерений. Их можно сравнивать с таблицами, имеющими множество строк и столбцов и с наборами таблиц.

  • Нумерация элементов подчиняется следующим правилам:

    • По умолчанию нумерация элементов массива начинается с 0. Первый по счету элемент получит индекс 0, второй - 1 и т.д.
    • В объявлении отдельного массива можно явно указать индекс его первого и последнего элемента, разделив их ключевым словом To.
    • Если вы хотите, чтобы индексы всех массивов начинались с 1, добавьте в раздел объявлений модуля (вне процедур, функций и обработчиков событий) команду Option Base 1.
  • Тип - подчиняется тем же правилам, которые мы ранее рассмотрели для переменных. Если пользователь не указал его явно, массив получит тип по умолчанию - Variant. Это требует больше системных ресурсов, но позволяет обрабатывать значения различных типов.

Не всегда количество элементов и размерность массива известны до начала работы программы. VBA умеет работать с динамическими массивами, параметры которых можно менять в ходе выполнения программы. О них мы поговорим ниже.

7.2. Одномерные массивы

07-01-Одномерный массив.docm- пример к п. 7.2.

Для объявления массивов используют оператор Dim. Объявить массив можно двумя способами. Первый заключается в указании общего количества элементов. Например, так:

Dim MyArrayA(30) As Single

Объявленный массив MyArrayА содержит 31 элемент (с индексами от 0 до 30) типа Single. Поскольку нумерация явно не задана, элементы получат индексы по обычным правилам.

Можно объявить массив и другим способом:

Dim MyArrayB(1 To 25)

Массив MyArrayB содержит 25 элементов. Границы нумерации заданы явно - первый элемент получит индекс 1, второй - 2 и т.д. Тип не указан - в массиве можно хранить любые данные.

Работа с элементами массива ничем не отличается от работы с переменными. Давайте решим следующую задачу:

  1. Объявить одномерный массив на 3 элемента
  2. Внести в первый элемент число 5 в программе, во второй - запросив значение с помощью окна ввода
  3. Вычислить в третьем элементе массива произведение значений, хранящихся в первом и втором элементах.
  4. Вывести полученное значение в окне сообщения.

Решение задачи приведено в листинге 7.1.

Dim A(2)
A(0) = 5
A(1) = InputBox("Введите значение второго элемента")
A(2) = A(0) * A(1)
MsgBox A(2)
Листинг 7.1. Работа с массивом

В конце работы программы, если на вопрос о вводе числа мы введем число 2, массив A будет иметь такой вид - табл. 7.1.

Таблица 7.1. Массив А после работы программы
Индекс 0 1 2
Значение 5 2 10

Как видите, серьезное отличие массивов от переменных - использование индексов для работы с различными элементами массива. Однако, можно заметить, что эта задача легко решается с использованием переменных, без массивов.

Возможно, сейчас вы еще не вполне осознаете полезность массивов. Если сейчас вы напишите программу для ручного ввода данных в несколько элементов массива, она получится такой же громоздкой, как раньше. Так чем же массивы лучше? Ответ на этот вопрос кроется в использовании циклов.

7.3. Циклы

Циклы позволяют выполнять одни и те же команды много раз. В табл. 7.2. собрана информация об основных видах циклов.

Таблица 7.2. Виды циклов
Название цикла Вид
For - Next С фиксированным количеством повторов. Выполняется заданное количество раз
While - Wend С предусловием. Если не верно условие, заданное на входе в цикл, может не выполниться ни разу
Do - Loop С постусловием. Выполняется по меньшей мере один раз.

7.4. Цикл For - Next

07-02-Цикл For-Next.docm - пример к п. 7.4.

Решим задачу: вывести цифры от 1 до 10 в окнах сообщений. Ее можно решить и без использования циклов, написав 10 строк такого вида: MsgBox ("1"). А вот конструкция For - Next позволяет делать то же самое гораздо изящнее. В листинге 7.2. вы можете найти решение задачи.

For i = 1 To 10
        MsgBox (i)
    Next i
Листинг 7.2. Вывод цифр от 1 до 10 в цикле

Ключевое слово For задает начало цикла. После него следует переменная i, которая увеличивается при каждом проходе цикла. В ходе работы конструкции For - Next значение i изменяется от 1 до 10.

Начальное значение счетчика устанавливается при входе в цикл. Мы просто приравниваем i какому-либо числу. Конечное значение переменной задается после ключевого слова To. Переменная i доступна внутри цикла - ведь именно ее мы выводим в окне сообщения.

Ключевое слово Next с указанием переменной, к которой оно относится, закрывает цикл.

В качестве первого и последнего значения счетчика цикла можно использовать какую-нибудь переменную. Она может быть определена в ходе выполнения программы, но до входа в конструкцию For - Next.

Вы могли заметить, что переменная цикла меняется с приращением 1. Это приращение можно задать в явном виде с помощью ключевого слова Step. В листинге 7.3. вы можете видеть пример оператора For - Next, выводящего нечетные числа в диапазоне от 1 до 10.

For i = 1 To 10 Step 2
        MsgBox (i)
    Next i
Листинг 7.3. Вывод нечетных цифр в диапазоне от 1 до 10 в цикле

С помощью ключевого слова Step можно создать не только возрастающий, но и убывающий счетчик. Для этого в Step надо указать отрицательное число и проследить за тем, чтобы первое значение переменной цикла было больше последнего. Например, так: For i=10 to 1 Step -1. Первое значение переменной в таком цикле будет равняться 10, второе - 9 и т.д. - до 1.

Теперь перейдем к совместному использованию циклов и массивов. Напишем программу, которая предлагает пользователю ввести 10 фамилий, сохраняет их в массиве, а потом выводит в окнах сообщений.

Готовая программа приведена в листинге 7.4.

Dim MyArray(9) 
For i = 0 To 9 
MyArray(i) = InputBox("Введите фамилию №" & i + 1)
Next i 
For i = 0 To 9 'Начало еще одного цикла
MsgBox ("Фамилия №" & (i + 1) & " " & MyArray(i)) 
Next i 'Конец цикла
Листинг 7.4. Ввод и вывод 10 фамилий

Обсудив цикл типа For-Next, продолжим разговор о массивах. На очереди - многомерные массивы.

7.5. Многомерные массивы

07-03-Многомерные массивы.docm - пример к п. 7.5.

Многомерные массивы имеют несколько измерений. Чаще всего применяются двумерные массивы (матрицы). Матрицу можно представить в виде обычной таблицы с несколькими строками и столбцами.

Для того чтобы объявить двумерный массив, нужно воспользоваться командой Dim с указанием размерности каждого из измерений. Остальные правила объявления таких массивов и работы с ними аналогичны таковым для одномерных массивов. Например, мы можем указать лишь размеры измерения массива:

Dim MyArrayA(10, 1) As Single

Массив MyArrayА содержит 11 строк и 2 столбца типа Single.

Можно в явном виде задать границы размерностей:

Dim MyArrayB(1 To 25, 1 To 5)

Массив MyArrayB содержит 25 строк и 5 столбцов. Границы нумерации заданы явно. Тип не указан - в массиве можно хранить любые данные.

В листинге 7.5. приведен пример программы, которая объявляет двумерный массив 5х2 и предлагает ввести в него фамилии и номера телефонов сотрудников.

Dim MyArray(1 To 5, 1 To 2)
For i = 1 To 5
    MyArray(i, 1) = InputBox("Введите фамилию №" & i)
    MyArray(i, 2) = InputBox("Введите Телефон №" & i)
Next i
Листинг 7.5. Работа с массивом размерностью 5х2

В табл. 7.3. вы можете видеть массив MyArray после заполнения его фамилиями и номерами телефонов. В MyArray (1,1) мы внесли фамилию "Иванов", в MyArray (1,2) - телефон Иванова 898989898 и т.д.

Таблица 7.3. Заполненный массив MyArray
Индекс 1 2
1 Иванов 898989898
2 Петров 343434343
3 Сидоров 565656565
4 Александров 121111212
5 Маринин 545454544

Эта программа очень похожа на те, которые мы писали для работы с одномерными массивами. В цикле, тело которого повторяется 5 раз, мы поочередно запрашиваем фамилию и номер телефона.

Один цикл неудобно использовать для работы с массивами больших размерностей. Нетрудно представить себе, какой громоздкой получится решение задачи копирования одной матрицы 100х100 в другую такую же. Кстати, при обработке данных в Microsoft Excel вам постоянно придется обращаться с большими двумерными матрицами. К счастью, существует механизм вложенных циклов, который помогает решать подобные задачи.

7.6. Вложенные циклы For-Next

07-04-Вложенные циклы.docm - пример к п. 7.6.

Принцип работы вложенных циклов кроется в их названии. Все очень просто - один цикл вкладывается в другой. Например, для заполнения массива 10х10 случайными целыми числами от 1 до 10 можно написать такую программу (листинг 7.6.)

Dim MyArray(1 To 10, 1 To 10)
For i = 1 To 10
    For j = 1 To 10
        MyArray(i, j) = Int(Rnd(1) * 10)
    Next j
Next i
Листинг 7.6. Работа с массивом 10х10

Внешний цикл ( i ) выполняется один раз, после чего внутренний ( j ) - десять раз. За один проход внешнего цикла внутренний выполняет десять - заполняется первая строка массива (с индексами от 1,1 до 1,10) и т.д.

< Лекция 6 || Лекция 7: 123 || Лекция 8 >
Евгений Ушаков
Евгений Ушаков
О стоимости курса
Александр Новиков
Александр Новиков
Справочник по объектам VBA
Дмитрий Василяга
Дмитрий Василяга
Россия, Новосибирск