Оператор While...Wend
Данный оператор является частным случаем оператора
DO ... Loop.
While условие БлокОператоров
Wend
БлокОператоров выполняется, пока условие истинно. По сути этот оператор является атавизмом, оставленным для совместимости программных продуктов предыдущих версий.
Оператор For Each...Next
Последний из рассматриваемых нами операторов - это оператор цикла по структуре. Сразу предупредим, что в данном разделе рассматривается лишь урезанная возможность этого оператора.
Итак, представьте, что необходимо вычислить сумму элементов массива, диапазон изменения индексов которого может со временем измениться, даже более того, может измениться его размерность - а программа содержит очень много процедур, в которых входит суммирование массива. Ни один из вышеприведенных циклов использовать нельзя, поскольку, как только изменится размерность, вам придется переписывать эти циклы. Решением является оператор For Each... Next. В этом операторе отсутствует счетчик, а тело цикла выполняется для каждого элемента в массиве.
For Each элемент In группа [блокОператоров1]
[Exit For]
[блокОператоров2] Next [элемент]
Здесь элемент - это переменная, пробегающая значения элементов массива. Под группой мы пока будем понимать только массив. Элемент обязан быть переменой типа variant. А дальше все знакомо. Работа цикла происходит следующим об-
73
разом: блок операторов выполняется, пока переменная элемент не пробежит все элементы массива.
В следующем примере представим, что мы не знаем точного количества магазинов, они могут присоединиться или, наоборот, отказаться от услуг, но (в данном случае) мы хотим подсчитать, сколько всего поступило заявок издательству. Тогда с использованием объявления динамических массивов и оператора For Each.. .Next данная проблема решается без затруднений. Заметьте, что не надо менять цикл, даже если вы исправите размерность массива, например, на shops (25, 2) (заявки на две книги одновременно).
Листинг. Использование цикла For Each. . .Next Sub ex2()
Dim shops() As Integer Dim shop As Variant Dim sum As Integer ReDim shops(1 To 25)
'Инициализация sum = 0
For Each shop In shops sum = sum + shop Next
MsgBox(sum) End Sub
74
5. СТРУКТУРА ПРОГРАММЫ
Мы рассмотрели те элементарные "кирпичики" (операторы и выражения), из которых строится программа.
В VBA поддерживается следующая структура программы. На высшем уровне иерархии стоит приложение, далее идут проекты, связанные с фактическими документами этого приложения, на третьем уровне находятся модули (модули приложения, модули пользователя, модули класса, модули форм и модули ссылок). И на последнем уровне находятся процедуры и функции этих модулей.
Структура программы VBA представлена на рис. 5.1. Программирование на VBA можно рассматривать, как
управление обьектами приложения. Если упростить иерархическую архитектуру, то в Excel это выглядит так:
Application Workbook
........
Worksheets
......
Cell
.....
То есть главный обьект - приложение. В приложении могут быть несколько книг (Workbook), внутри которых находятся листы (Worksheets) и листы разбиты на ячейки (Cell).
Данная структуризация программ полностью удовлетворяет принципам структурного и модульного программирования.
5.1. Модульное программирование
Модульное программирование - это способ разработки программ, при котором программа разбивается на относительно независимые составные части - программные модули. При этом каждый модуль может разрабатываться, программироваться, транслироваться и тестироваться независимо от других.
75
Приложение
Проект 1
Модуль 1
Declarations
Процедура 1
Процедура 2
…
Процедура N
Модуль 2
…
Модуль N1
Проект 2
…
Проект N2
Рис. 5.1. Структура программы VBA
Все системы программирования в той или иной форме поддерживают понятие модуля. В разных системах програм-
76
мирования модули называются и определяются по-разному: подпрограмма, функция, класс, модуль, компонента и т. д. Как правило, модульная структура допускает вложение модулей или ссылки между модулями (или то и другое), поэтому каждый модуль в отдельности может быть сделан обозримым для программиста. Таким образом, модульное программирование является непосредственной реализацией принципа "разделяй и властвуй" в программировании.
Кроме непосредственной структуризации текста программы на модули в системах программирования навешивается еще множество дополнительных функций: сокращение объема кода, инкрементальная компиляция, ограничение областей действия, раннее (статическое) и позднее (динамическое) связывание, инкапсуляция данных и пр.
5.2. Составляющие программы
Итак, модуль - это часть программы, оформленная в виде, допускающем ее независимую трансляцию. Модуль в свою очередь состоит из двух разделов: раздел объявлений (Declarations) и раздел процедур и функций. В разделе Declarations описываются глобальные переменные, типы, определенные пользователем, и перечисляемые типы. В следующем же разделе описываются процедуры и функции. Процедура - минимальная семантически законченная программная конструкция, допускающая выполнение. В конце концов, просто так операторы не выполняются и не пишутся - они находятся в описании процедур и функций.
Область видимости - это область программы, где имя переменной видимо, а значит, возможен доступ к ее значению. Области видимости VBA мы схематично изобразили на рис.5.2.
Существует три уровня видимости и пять способов объявления.
1.Процедура (область видимости - только та процедура,
вкоторой переменная объявлена).
77