Кузин А.В., Левонисова С.В. Базы данных (5-е издание, 2012) (1084448), страница 21
Текст из файла (страница 21)
Теперьвместо объекта Database из библиотеки DAO для работы с базойданных или проектом Access можно использовать объектыCurrentProject, CurrentData, CodeProject и CodeData из библиотеки Access.Пары объектов CurrentProject, CodeProject и CurrentD ata,CodeData имеют одинаковые свойства и методы. Отличие объектов107CurrentProject и CurrentData от CodeProject и CodeData подобноотличию друг от друга объектов, возвращаемых методами CurrentDbи CodeDb.
Объекты CurrentProject и CurrentData соответствуют текущей базе данных, а объекты CodeProject и CodeData — базе данных, в которой выполняется (и содержится) код VBA, содержащий ссылки на эти объекты.3.2.2. Процедуры и функции VBAОсновными компонентами программы на VBA являются процедуры и функции, которые представляют собой фрагменты программного кода, заключенные между операторами Sub и End Subили между Function и End Function. Например:Sub <имяПроцедуры> (<аргумент1 >, <аргумент2>,...)<onepaTopVisualBasicl><onepaTopVisualBasic2>End SubФункция отличается от процедуры тем, что ее имя выступаеттакже в качестве переменной и используется для возвращениязначения в точку вызова функции. Например:Function <имяФункции> (<аргумент1>, <аргумент2>,...)<onepaTopVisualBasicl><onepaTopVisualBasic2><имяФункции> = <возвращаемоеЗначение>End FunctionДля того чтобы использовать процедуру или функцию, необходимо их вызвать.
Процедуру с непустым списком аргументовможно вызвать только из другой процедуры или функции, использовав ее имя со списком фактических значений аргументов вкачестве одного из операторов VBA. Функцию же можно вызватьне только с помощью отдельного оператора VBA, но и поместивее имя со списком фактических значений аргументов прямо вформулу или выражение в программе на VBA, или, например,прямо в формулу в вычисляемых полях запросов, форм и отчетовAccess. Процедура с пустым списком аргументов (так называемыйкомандный макрос) может быть вызвана не только из другой процедуры или функции, но и с помощью комбинации клавиш быстрого вызова, команд раскрывающихся меню или кнопок панелейинструментов.
Можно также связать такую процедуру с выполнением самых различных событий, например, с открытием формыили отчета, с щелчком мышью по кнопке в форме, с воздействием на элементы управления форм, в частности на элементы управления ActiveX. Такие процедуры называют процедурами обработки событий. Функции или процедуры, нуждающиеся в передаче им аргументов, таким способом вызвать нельзя. Если вызываемая процедура имеет уникальное имя и находится в том же модуле, что и вызывающая процедура, то для ее вызова достаточноуказать это имя и затем задать список фактических значений аргументов, не заключая его в скобки.
Второй способ вызова процедуры состоит в использовании оператора Call. В этом случае сначалауказывают оператор Call, потом имя процедуры, а затем списокпараметров, обязательно заключенный в скобки. Функцию можновызывать так же, как и процедуру, но гораздо чаше применяетсядругой, специфический способ ее вызова: использование ее имени с заключенным в скобки списком параметров в правой частиоператора присваивания.Пример 3.1.
Вызов процедуры под именем myFl с передачей ей двухаргументов (константы и выражения):myFl 7, i + 2илиCall myFl(7, i + 2).Пример 3.2. Вызов функций Left и Mid и использование возвращаемого ими значения в выражении:yStr = Left (у, 1) & Mid (у, 2, 1) .Допустимы два различных способа передачи переменных процедуре или функции: по ссылке и по значению.Если переменная передается по ссылке, то это означает, чтопроцедуре или функции будет передан адрес этой переменной впамяти.
При этом вызываемая процедура может изменить значение фактического параметра.Если же фактический параметр передается по значению, товызываемая процедура или функция получает только значение фактического параметра, но не саму переменную, используемую вкачестве этого параметра. Все изменения полученного значенияфактического параметра (если они выполняются вызываемой процедурой) не сказываются на значении его переменной.Способ передачи параметров переменных процедуре или функции указывается при описании ее аргументов (формальных параметров).
Имени аргумента может предшествовать явный описательспособа передачи (ByRef — задает передачу по ссылке, a ByVal —по значению). Если же явное указание способа передачи парамет109ра отсутствует, то по умолчанию подразумевается передача поссылке.Пример 3.3. Передача параметров переменных процедуре:Sub Main ()а = 10b = 20с = 30Call Example 1 (а, b, с)Call MsgBox(a)Call MsgBox(b)Call MsgBox(c)End SubSub Example 1 (x, ByVal y, ByRef z)x= x+ 1y= y+ 1z= z+ 1Call MsgBox(x)Call MsgBox(y)Call MsgBox(z)End SubВспомогательная процедура Example 1 использует в качестве формальных аргументов три переменные, описанные по-разному. Далее в телеэтой процедуры каждый из аргументов увеличивается на единицу, а затем их значения выводятся на экран с помощью функции MsgBox.
Основная процедура Main устанавливает значения переменных а, b и с, азатем передает их в качестве фактических аргументов процедуре Example 1.При этом первый аргумент передается по ссылке (действует умолчание),второй по значению, а третий снова по ссылке. После возврата из процедуры Example 1 основная процедура также выводит на экран значениятрех переменных, передававшихся в качестве аргументов.Всего на экран выводится шесть значений: сначала числа 11, 21 и 31(все значения увеличены на единицу и выводятся процедурой Example 1);затем числа 11, 20 и 31 (которые выводятся процедурой Main, причемпеременные, переданные по ссылке, увеличены, а переменная, переданная по значению, нет).Программа может состоять (и обычно состоит) из многих процедур и функций, которые могут располагаться в одном или нескольких модулях, группирующихся в проекты.
При этом в одномпроекте могут мирно сосуществовать несколько различных программ, использующих общие модули или процедуры.Каждая из процедур, находящихся в одном модуле, должнаиметь уникальное имя, однако в проекте может содержаться несколько различных модулей.
Обычно рекомендуется использоватьтолько уникальные имена процедур в одном проекте, но допус110гимы и исключения. В том случае, если в проекте содержится несколько различных процедур с одним и тем же именем, следуетдля уточнения имени использовать при вызове процедуры следующий синтаксис:<имяМодуля>.<имяПроцедуры>Если при этом имя модуля состоит из нескольких слов, следует заключить это имя в квадратные скобки. Например, если модуль называется Графические процедуры, а процедура — График,вызов может выглядеть следующим образом:[Графические процедуры].ГрафикДопускается также использование процедур, расположенных ив других проектах.
При этом может потребоваться еще один уровень уточнения имени:<имяПроекта>.<имяМодуля>.<имяПроцедуры>3.2.3. Переменный, константы и типы данныхКак и в других языках программирования, в VBA для хранениявременных значений, передачи параметров и проведения вычислений используются переменные.Обычно перед использованием переменной производится ееобъявление (определение имен переменных, которые будут использоваться в программе) и объявление типа данных, для хранения которых предназначена эта переменная.В VBA, как и в обычном языке Basic, для этого используетсяоператор Dim.
Синтаксис этого оператора имеет следующий вид:Dim <имяПеременной> [As <типДанных>]В VBA действуют следующие правила именования переменных.Имя не может быть длиннее 255 символов.Имя должно начинаться с буквы, за которой могут следоватьбуквы, цифры или нижняя черта.Имя не должно содержать пробелов, знаков препинания илиспециальных символов, за исключением самого последнего знака.В конце к имени переменной может быть добавлен один изследующих шести специальных символов — описателей типа данных: !, #, $, %, &, @. Эти символы не являются частью именипеременной, т.е. если в программе используются одновременноимена string 1$ и string 1, то они относятся к одной и той же строковой переменной.
Нельзя использовать одно и то же имя переменной с разными символами определения типа данных или од111новременно явное описание типа данных и не соответствующийэтому типу данных специальный символ.Кроме того, не допускается использование в качестве именпеременных ключевых слов VBA и имен стандартных объектов.Допускается использование в именах переменных букв не тольколатинского алфавита, но и кириллицы, что может оказаться удобным для русских пользователей: при желании можно давать переменным имена на русском языке.Пример 3.4. Описание переменных:Dim i As Integer, j As IntegerDim x As DoubleВ VBA имеется оператор Option Explicit.
Если начать модуль сэтого оператора (он должен быть расположен в самом начале модуля до начала первой процедуры), то VBA будет требовать обязательного объявления переменных в этом модуле и генерироватьсообщения об ошибке всякий раз, как встретит необъявленнуюпеременную.Краткий перечень используемых типов данных VBA дан втабл. 3.2.Т а б л и ц а 3.2Типы данных VBAТип данныхОписаниеArrayМассив переменных; для ссылки на конкретный элемент массива используется индекс. Требуемая памятьзависит от размеров массиваBooleanПринимает одно из двух логических значений: True(Истина) и False (Ложь). Требуемая память 2 байтByteЧисло без знака от 0 до 255.
Требуемая память 1 байтCurrencyИспользуется для денежных вычислений с фиксированным числом знаков после десятичной запятойв тех случаях, когда важно избежать возможных ошибок округления. Диапазон возможных значений:от -922 337 203 685 477,5808 до 922 337 203 685 477,5807.Требуемая память 8 байт.Символ определения по умолчанию @DateИспользуется для хранения дат.