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

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

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

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

Добавлен: 21.10.2020

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

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

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

5:

 =

 "Введите имя

"имя пользователя" )

6: Next I

 End Sub

Обратите внимание — единственное отличие кода листинга 5.9 от преды-

дущих примеров состоит в том, что литеральные значения, задающие ниж-

нюю и верхнюю границы изменения переменной цикла (и индекса масси-
ва) заменены вызовами функций

 и

 Каждой из них в каче-

стве параметра передается имя массива Users. Теперь становится вполне

I понятным общий синтаксис вызова этих функций:

 )

 ИмяМассива )

Каждая из функций возвращает целочисленное значение. Замените ИмяМассива

идентификатором реального массива, который используется в программе, — и вы по-
лучите гибкий код, который не будет зависеть от количества элементов массива.

Раньше говорилось о том, что использования литеральных значений следует — на-

сколько это возможно в конкретной ситуации — избегать. Профессиональные про-

граммисты в шутку называют литералы

 магическими

 имея в виду их способ-

ность к преподнесению "сюрпризов" в самый неожиданный момент. Если все же
вместо вызова функций Lbound и Ubound вы указываете постоянные значения, при-
меняйте именованные константы, а не литералы.

Циклическая обработка данных

Конструкция For Each специально предусмотрена для циклической об-

работки данных, хранящихся в виде массивов или коллекций. Более под-

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

структуры For Each применительно к массивам. Синтаксис конструкции

For Each не зависит от того, с каким объектом данных — массивом или

коллекцией — вы работаете. Он выглядит следующим образом:

Dim Элемент As Variant

For Each Элемент In ИмяМассива

' одна или несколько строк кода

Next Элемент

В описание синтаксиса специально включено объявление переменной Элемент,

поскольку конструкция For Each должна — это обязательное требование — ссылать-
ся на переменную типа Variant. На каждом шаге цикла переменной Элемент при-

сваивается значение очередного элемента массива, а в следующих строках у вас появ-

ляется возможность обработки этой переменной — вы словно явно ссылаетесь на

конкретный элемент массива. Строка Next Элемент заставляет компилятор перейти к
очередному элементу массива и присвоить его значение указанной переменной. Лис-

тинг

 служит примером кода, предназначенного для отображения содержимого

каждого элемента массива типа String в окне сообщения.

Листинг 5.10. Пример цикла For Each

1: Sub

 ( )

2: Dim

 As String

 = "Иван"

100

Часть II. Основы конструирования программ


background image

 = "Петр"

 = "Федор"

Dim User As Variant

For Each User In Users

 User

Next User

End Sub

По умолчанию в Access

 нумерация элементов массивов начинается с

нуля. Таким образом, если в объявлении массива содержится число п, в нем
насчитывается

 элемент. Вам, однако, предоставлена возможность

выбора границы отсчета с помощью директивы Option Base n, где в
качестве п допускается указывать одно из двух значений — 0 или

 Строку

 Base n необходимо располагать в самом начале текста модуля.

I Строки 2-5 листинга

 содержат

 объявления символьного

I массива Users и инициализации его элементов. В строке 6 объявлена

переменная User типа Variant, предназначенная для использования в
конструкции For Each. Строки 7-9 предусматривают циклическое про-
хождение по всем элементам

 на каждом шаге которого значение

очередного элемента (подчеркиваем,

 элемента,

 а не

 присваива-

ется переменной User и выводится в окне сообщения, открываемом с
помощью стандартной процедуры MsgBox.

Средства прерывания циклов

В практике программирования встречаются ситуации, когда необходимо покинуть

цикл до его естественного завершения. Такое случается, если, например, по условиям
задачи невозможно построить тестовое выражение, позволяющее корректно завер-
шить выполнение цикла. Язык VBA предлагает для подобной цели специальную ин-
струкцию, обозначаемую служебным словом Exit. Она дает возможность выйти из

цикла в любой момент, когда это необходимо. Существует две формы инструкции
принудительного прерывания циклов:

Exit For
Exit Do

Первая, Exit For, как легко догадаться, используется внутри циклов вида For

. . . Next, а вторая, Exit Do, — в циклах Do

 Loop. Наличие средства прерыва-

ния цикла дает основания предпочесть конструкцию Do

 Loop аналогичной ей

управляющей структуре  W h i l e . . . Wend, лишенной подобной возможности.

Далее вновь обратимся к примеру, приведенному в листинге 5.7. Внутри цикла ис-

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

маем, что решение можно усовершенствовать. Соответствующий исправленный вари-
ант кода приведен в листинге

Листинг

 Пример использования инструкции прерывания цикла

 Sub

 }

2 : Dim User As String

 Do

4: User =

 имя

"Добавление пользователей

 User )

5: If

 User ) = 0) Then Exit Do

5-й час. Программирование управляющих структур

101


background image

End Sub

 "Добавлен пользователь

Loop Until (Len( User ) = 0)

&

 User,

В конец строки 5 добавлена инструкция Exit Do. Если пользователь введет пустое

имя либо щелкнет на кнопке Cancel (Отмена) диалогового окна, вызываемого функцией

InputBox, выполнение цикла будет принудительно прервано. Итак, объем кода умень-

шился на одну строку, и теперь в случае ввода пустого имени выполняется только одна
проверка, а не две, как раньше. (В принципе, в строке 7 условие Len (User) = 0 можно
заменить литеральной булевой (True) или целочисленной (1) константой, поскольку
выход из бесконечного цикла гарантируется инструкцией Exit Do. —

 Прим.

В 1995 году я провел исследование, в результате которого было установлено,

что значение средней стоимости строки кода коммерческих программных
проектов колеблется от $5 до $8. Есть все основания предполагать, что за
прошедший период оно существенно выросло. На первый взгляд может
показаться — чем больше строк я напишу, тем больше заработаю. Это

мнение, однако, небесспорно — разумное и обоснованное уменьшение
объема программы с лихвой окупит издержки, связанные с
сопровождением избыточного и неэффективного кода. (Приведенные

цифры отвечают реалиям рынка США. Автор, видимо, не предполагал, что

для не избалованного жизнью русскоязычного читателя-профессионала эта

информация может представлять

 особый

 интерес. —

 Прим. перев.)

Использование функции Switch

Функция Switch в качестве параметра использует разделенный запятыми список

пар, сравнивает переданное значение с элементами списка и возвращает парное зна-
чение. Пример использования данной функции приведен в листинге

Листинг 5.12. Пример использования функции Switch

1: Sub

 )

2: Dim

 As String: Dim MatchUp As  V a r i a n t

3 : ProductName =

4: "Введите название программы

 Visual Basic,

 "Соответствие программы языку

6: MatchUp

 Switch (ProductName = "Access",

7: ProductName

 Basic",  " V i s u a l Basic",

8: ProductName

 "Object

 >= 0,

9 : MsgBox MatchUp

 Sub

В этой программе пользователь вводит значение переменной ProductName, которое

передается в подпрограмму и для которого находится соответствующая пара. В функцию

Switch передаются три пары: ProductName

 "Access", ProductName

 Ba-

sic", ProductName

 Если ProductName содержит одно из данных значений,

функция Switch возвращает соответствующую ему пару. Например, если в окне ввода
указать "Access", функция Switch вернет значение

 Указанная функция возвра-

щает значение типа Variant, что позволяет использовать ее с самыми разными данными.

102

Часть II. Основы конструирования программ


background image

Резюме

На этом занятии мы рассмотрели разнообразные средства языка Access VBA, пред-

назначенные для организации циклических вычислений. Конструкции  W h i l e . . .
Wend, Do

 Loop и For . . . Next позволяют выполнять один и тот же блок кода

столько раз, сколько это необходимо или обусловлено текущим состоянием обрабаты-
ваемых данных. Выражение

 дает возможность изменять порядок вычислений в за-

висимости от результата тестирования заданного условия. Не забывайте о том, что

ваш код должен корректно обрабатывать все возможные ситуации.

Чтобы сделать примеры более конкретными и наглядными, автор книги ознакомил

вас с несколькими дополнительными приемами, конструкциями и объектами — бес-
конечными циклами, средствами их принудительного прерывания, массивами, кол-

лекциями и встроенными функциями Access VBA. Я обещаю научить вас программи-
рованию — только не ленитесь прочесть эту книгу и испытать на практике все то, о

чем узнаете. (Зачем далеко ходить — выполните задания, которые приведены ниже!)

Вопросы и ответы

Вопрос. В каких случаях целесообразно использовать вложенные циклы For

 Next?

Ответ.

 Вложенные циклы For

 Next оказываются весьма полезны в тех случа-

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

Вопрос. Какую из циклических конструкций следует предпочесть —

 while . . . wend

или Do While

 Loop?

Ответ.

 While . . . Wend поддерживается в языке из соображений обратной со-

вместимости со старыми приложениями. Более предпочтительна конструкция Do
While

 Loop.

Вопрос. Вы упомянули о нескольких полезных встроенных функциях VBA. Как озна-

комиться с остальными?

Ответ.

 Файлы оперативной справочной системы Access содержат немало нужных

примеров, но зачастую в них бывает трудно отыскать именно то, что требуется в данный
момент. Наилучший способ знакомства со всем многообразием стандартных процедур и
функций Access VBA — изучение больших "кусков" реального эффективного кода.

Вопрос. Что лучше — коллекция или массив?
Ответ.

 Вопрос не совсем корректен, ибо полезными в конкретном случае могут

оказаться и коллекции, и массивы. Создавая совершенно новый проект, вы, видимо,

предпочтете обратиться к коллекциям. Об этой мощной и эффективной структуре
данных мы расскажем в следующей главе.

Задания

Ниже приведены тестовые задания и упражнения, которые помогут вам самостоя-

тельно проверить уровень освоения материала, изложенного в этой главе. Ответы на

вопросы вы найдете в приложении.

 час. Программирование управляющих структур


background image

Тесты

1. Как определить цикл для обработки элементов массива произвольной длины?

2. Если необходим такой цикл, код которого должен выполняться по меньшей мере

один раз, какую конструкцию вы выберете?

3. Как убедиться, что код выражения

 работает верно?

4. Для каких целей предназначена инструкция Exit For?

5. Что представляют собой средства прерывания циклов? При каких

их следует использовать?

1. Применив средства оперативной справки Microsoft Visual Basic, отыщите информа-

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

 имя-фамилия.

2.

 Обратившись к системе оперативной справки, найдите сведения о

 функции Iff.

Приведите конкретный пример ее использования.

3. Объявите объект коллекции и примените конструкцию For Each для отображения

содержимого каждого элемента коллекции с помощью процедуры MsgBox.

 Часть II. Основы конструирования программ