Файл: Освой самостоятельно программирование для MS Access 2002 за 24 часа [П.Киммел].pdf
ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 21.10.2020
Просмотров: 7934
Скачиваний: 25

содержит код, обрабатывающий введенное значение; в данном случае оно просто высве-
чивается на экране с помощью процедуры
Далее
получает воз-
можность ввести новое имя. Выражение Wend, расположенное в строке 7, заставляет
компилятор вернуться к строке 4 программы и вновь проверить результат условного вы-
ражения. Если пользователь щелкнет на кнопке Cancel (Отмена) либо введет строку ну-
левой длины, выполнение цикла прервется, и управление будет передано строке, сле-
дующей за Wend. В противном случае строки кода 4 и 5 будут выполняться циклически.
Помните о том, что ваш код должен корректно обрабатывать обе ситуации
и истинности, и ложности результата вычисления условного выражения.
Легко составить такое условие, при котором цикл W h i l e .
Wend будет выпол-
няться бесконечно. Условное выражение вычисляется в начале цикла, и когда резуль-
тат становится равным False, выполнение цикла завершается. Но если в качестве ус-
ловия задать такое выражение, как, скажем, 1 = 1,
результат будет всегда оста-
ваться равным True. Ниже приведен пример бесконечного цикла.
Sub
While (1)
MsgBox "Это бесконечный
Wend
End Sub
Если вы попытаетесь выполнить данную процедуру, для остановки вы-
полнения кода нажмите <Ctrl+Break>. Используйте эту комбинацию
клавиш при работе в Access в случае, если какой-либо процесс окажется
бесконечным.
В языке
предусмотрены специальные способы выхода из бесконечных циклов —
мы расскажем о них в разделе "Средства прерывания циклов", завершающем эту главу.
Другие виды условных циклов
Помимо управляющей структуры While . . . Wend, в вашем распоряже-
нии имеются и другие средства организации циклических вычислений.
Одно из них — конструкция Do ... Loop, которая может применяться в
двух формах. Первая из них предполагает проверку условия в начале
цикла, а другая — в конце него. Так выглядит синтаксис цикла Do
Loop с начальной проверкой условия:
Do
I
условное выражение]
одна или несколько строк кода
Loop
Условное выражение, подлежащее тестированию, расположено в начале цикла, и кон-
струкция действует почти так же, как и ранее рассмотренная структура While
. Wend.
Если применяется служебное слово While, сходство обеих структур становится полным.
Служебное слово Until предполагает задание обратного по смыслу условного вы-
ражения — если с Do While использовалось, скажем, выражение на основе оператора
сравнения
больше
(>), то в конструкции Do Until, выполняющей те же действия,
придется употребить оператор
меньше или равно
час. Программирование управляющих структур 95

Поскольку условное выражение находится в начале цикла, не исключена си-
туация, что код внутри цикла не выполнится ни разу. При использовании
второй формы цикла Do
Loop, с проверкой условия в конце, код будет
гарантированно выполнен, по меньшей мере, один раз. Синтаксис конструк-
ции с последующим тестированием условного выражения выглядит так:
Do
Loop
' одна или несколько строк кода
I
условное выражение]
Как и ранее, допускается применять служебные слова While либо Until. При ис-
пользовании Until не забудьте о необходимости "обращения" условного выражения.
В принципе, варианты применения while или Until равнозначны — выбор того и
иного из них зависит только от вас.
Рассматривая конструкцию While . . . Wend, мы говорили, что результатом вы-
числения условия может быть как булево значение, так и величина типа Integer. To
же справедливо и в отношении циклов формата Do ... Loop. Если вы намереваетесь
тестировать целочисленные значения, имейте в виду, что 0 равносилен False, а лю-
бые ненулевые значения — True. Приведенный ниже листинг 5.5 представляет собой
исправленный вариант листинга 5.4 и решает ту же задачу.
Листинг 5.5. Пример использования Do ... Until
Sub
)
Dim User
Do
User =
имя
пользователей
User )
MsgBox "Добавление пользователя" & User,
Loop Until
= 0)
End Sub
Между двумя вариантами процедур, представленных в листингах 5.4 и 5.5, имеется
ряд различий. Прежде всего, примите к сведению, что в листинге 5.5 функция InputBox
вызывается только один раз. Но теперь возникает новая проблема — необходим допол-
нительный код, который гарантирует, что в строке 5, выполняющей обработку введен-
ного имени, не будет приниматься во внимание последовательность нулевой длины. Ус-
ловие из строки 4 листинга 5.4 переместилось в строку 5 листинга 5.5, но теперь здесь
применяется оператор равенства — ведь мы воспользовались служебным словом Until.
Применяя Until, не забудьте о необходимости "обращения" условного выраже-
ния. В листинге 5.6 приведен несколько усовершенствованный вариант цикла Do
Loop, учитывающий возможные ошибки при вводе данных.
Листинг 5.6. Исправленный вариант процедуры листинга 5.5
Sub
)
Dim User
Do
User =
имя
пользователей
User )
If (Len( User ) > 0) Then
MsgBox "Добавление пользователя" & User, vblnformation
End If
Loop Until
User ) = 0)
End Sub
90
Часть II. Основы конструирования программ

После ввода дополнительного контролирующего условия код стал намного более безо-
пасным, поскольку он исключает возможность обработки имени нулевой длины. Обратите
внимание: программы, представленные в листингах 5.4 и 5.6, функционально идентичны.
Итерационные циклы
Вы уже ознакомились с управляющими структурами вида
End If, While
. . . Wend и Do
Loop. В двух последних, циклических, в качестве условия завер-
шения используется логическое и — реже — целочисленное выражение. Но довольно
часто встречаются задачи, когда необходимо знать и задавать точное количество шагов
выполнения одного и того же блока кода. В подобных ситуациях активно применяют-
ся структуры данных в виде массивов и коллекций.
Новый термин
Новый термин
Массивом
называется непрерывная последовательность ячеек памяти, ад-
ресуемая по имени. Доступ к элементам массива осуществляется по зна-
чению целочисленного индекса.
Коллекция —
это определяемый пользователем тип данных. Пользователем
в данном случае считается программист, создающий код на языке Access
Коллекции подобны массивам, но они обладают некоторыми допол-
нительными возможностями, выходящими за пределы совокупности мето-
дов обычной адресации элементов данных. Подробнее о коллекциях и спо-
собах их применения см. главу "6-й час. Управление базами данных".
Язык VBA поддерживает еще одно средство организации циклов. Речь идет о кон-
струкции For .
Next, используемой в тех случаях, когда число шагов выполнения
одного и того же блока кода (итераций) заранее известно. Управляющая структура
For
Next в своей самой простой форме описывается следующим выражением:
For Индекс =
То ВерхяяГраница
одна или несколько строк кода
Next [Индекс]
Обязательные атрибуты первой строки конструкции
слова For, To и знак
равенства (=). Запись For
Next следует понимать так: целочисленной переменной Ин-
декс цикла присваивается начальное значение НижняяГраница; после этого выполняются
строки кода, расположенные ниже, до строки со словом Next; далее текущее значение пере-
менной Индекс увеличивается на единицу и сравнивается с величиной ВерхняяГраница; ес-
ли граница не превышена, строки цикла выполняются в очередной раз; в противном случае
цикл завершается. В качестве величин НижняяГраница и ВерхняяГраница могут использо-
ваться литеральные значения, именованные константы, а также арифметические выражения
либо
выполнения функций типа Integer. (В приведенном ниже разделе
"Функции
и
рассмотрены специальные средства языка
облегчающие
задание нижних и верхних границ изменения переменной цикла.) Последняя строка кода
цикла содержит служебное слово Next, за которым допускается указывать наименование пе-
ременной, используемой в качестве индекса. Несмотря на то, что идентификатором пере-
менной в данном случае можно пренебречь, для облегчения восприятия кода программы все
же рекомендуется задавать его, поскольку итерационные циклы, как и иные управляющие
структуры, могут
вложенными, и задача сопоставления строк For и Next значительно
упрощается, если после Next указано наименование переменной цикла.
Между начальной и конечной строками конструкции For . . . Next может быть
размещен любой код. Степень его сложности определяется условиями задачи и вы-
бранным методом ее решения. Впрочем, чем более простым окажется код, тем лучше;
старайтесь выносить блоки кода, решающие отдельные подзадачи, за пределы управ-
ляющих структур и оформляйте их в виде процедур или функций. (Подробнее о
5-й час. Программирование управляющих структур

функциях речь пойдет на 8-м занятии.) Листинг 5.7 содержит пример использования
структуры For .
Next; нетрудно заметить его сходство с "текстом листинга 5.5.
Листинг 5.7. Пример цикла
Next
Sub
)
Dim
As String
Dim I As Integer
For I = 1 to 10
Users
=
"Имя пользователя" )
Next I
End Sub
"Введите имя
Для наименований массивов рекомендуется использовать существительные
множественного числа, как это сделано в строке 2 листинга 5.7.
Процедура AddUsers предполагает ввод в точности десяти имен пользователей (в
предыдущих примерах это число не ограничивалось). Строка 2 содержит объявление
массива Users, каждый элемент которого представляет собой переменную типа
String. В строке 3 объявлена целочисленная переменная цикла I. Строки 4 и 6 огра-
ничивают конструкцию цикла For .
Next, а строка 5, предписывающая ввод дан-
ных, будет повторена указанное число раз (10). На каждом шаге цикла очередному
элементу массива, адресуемому индексной переменной I, присваивается значение,
введенное пользователем в диалоговом окне. На рис. 5.3 приведено окно Locals, ото-
бражающее содержимое массива Users после его заполнения.
Be
УК
да,
Is*
fflmte»
0 •
к л
•
К
1
:
|
о
•'
.- j
|
As
I Аз
J
Tc 10
'
-
-
• i
••
•
•
-
-
-
-
-
Locals
Visual Basic отображает содержимое массива,
заполненного пользователем
98
Часть II. Основы конструирования программ

Прямая и обратная итерации
Структура For
Next предполагает возможность выполнения прямой
и обратной итераций. Этой цели служит слово step — часть конструк-
ции, позволяющая задавать как положительное, так и отрицательное зна-
чение шага (интервала)
переменной цикла.
For Индекс =
То ВерхяяГраница Step Шаг
' одна или несколько строк кода
A Next [Индекс]
Выражение синтаксиса почти не изменилось. Единственное отличие состоит в том,
что в конец строки For
То добавлено служебное слово Step, за которым следует
значение
приращения переменной цикла. В качестве величины Шаг могут ис-
пользоваться целочисленные литералы, именованные константы, переменные и
арифметические выражения. Теперь цикл может выполняться даже в том случае, если
значение выражения ВерхняяГраница меньше значения.НижняяГраница — достаточ-
но после слова step задать отрицательную величину. Листинг 5.8 служит примером
цикла с отрицательным шагом изменения индекса.
Листинг 5.8. Пример цикла
Next с отрицательным шагом изменения индекса
Sub
)
Dim
As String
Dim I As Integer
For I = 10 to 1 Step -1
Users (I) =
"имя пользователя". )
Next I
End Sub
имя
Код листинга 5.8 отличается от предыдущего примера только содержимым строки 4.
Теперь массив Users заполняется в обратном порядке, начиная с 10-го элемента.
Функции Lbound и Ubound
Во многих случаях количество элементов массива или коллекции заранее известно,
но существуют ситуации, когда в момент написания кода (или его исполнения) такая
информация недоступна. В реальности трудно представить пример точного и заведомо
неизменного количества итераций цикла, использующего массивы (коллекции) данных.
Код должен быть гибким — с этим трудно поспорить, — и поэтому создатели Ac-
cess и VBA предусмотрительно предоставили в распоряжение программистов специ-
альные функции — LBound и Ubound. Lbound возвращает номер первого значимого
элемента указанного массива, a Ubound — последнего.
Мы вновь обратимся к знакомому примеру, связанному с заполнением массива
имен пользователей в диалоговом режиме, — листинг 5.9 представляет вариант кода, в
котором применены функции LBound и Ubound.
Листинг 5.9. Пример использования функций Lbound и Ubound
1: Sub AddUsers ( )
2: Dim
As String
3 : Dim I As
4: For I =
Users ) to
Users ) Step -1
5-й час. Программирование управляющих структур
99