Опубликован: 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 >
Евгений Ушаков
Евгений Ушаков

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

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

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

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

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