Файл: Освой самостоятельно программирование для MS Access 2002 за 24 часа [П.Киммел].pdf

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 21.10.2020

Просмотров: 7934

Скачиваний: 25

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
background image

содержит код, обрабатывающий введенное значение; в данном случае оно просто высве-
чивается на экране с помощью процедуры

 Далее

 получает воз-

можность ввести новое имя. Выражение 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


background image

Поскольку условное выражение находится в начале цикла, не исключена си-

туация, что код внутри цикла не выполнится ни разу. При использовании

второй формы цикла 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. Основы конструирования программ


background image

После ввода дополнительного контролирующего условия код стал намного более безо-

пасным, поскольку он исключает возможность обработки имени нулевой длины. Обратите

внимание: программы, представленные в листингах 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-й час. Программирование управляющих структур


background image

функциях речь пойдет на 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. Основы конструирования программ


background image

Прямая и обратная итерации

Структура 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