- •Макросы
- •Техника создания макросов
- •Примечание:
- •Примечание:
- •Редактирование макросов
- •Выполнение макроса с условиями
- •Основные термины языка программирования vba
- •Р ис. 6.1. Окно модуля
- •Раздел описания
- •Создание процедуры
- •Тип данных Хранимые значения Область значений
- •Integer Целое число От -32768 до 32767
- •Условные операторы
- •Операторы цикла
- •Процедура-функция для обработки событий в формах.
- •Примечание:
- •Использование процедуры-функции в отчетах
- •Применение процедур-подпрограмм
- •Выполнение кода vba
- •Примечание:
- •Процедура Вызов
- •Примечание:
Создание процедуры
Для создания процедуры (подпрограммы или функции) в Access 97 предназначена команда Процедура из меню Вставка, которая имеет аналог в
панели инструментов Visual Basic. В результате ее активизации открывается диалоговое окно Вставка процедуры, которое служит для выбора типа процедуры (подпрограмма (Sub) или функция (Function)) и присвоения ей имени
(поле Имя). Подпрограмму или функцию можно создать и другим способом — в ведя в окно модуля инструкцию Sub или Function.
Рис. 6. 4. Диалоговое окно создания процедуры
При создании процедуры можно задать область ее использования с помощью следующих переключателей (Область определения):
— общая (Public) — процедура доступна для всех процедур во всех модулях.
— личная (Private) — процедура доступна для других процедур только в том
модуле, в котором она объявлена.
Если процедуры не используются вне данного модуля, их следует декларировать как личные. При объявлении личной процедуры в первой строке перед ключевым словом Function или Sub вставляется префикс Private:
Private Function Имя ()
ИЛИ
Private Sub Имя ()
В результате установки опции Все локальные переменные считать статическими локальным переменным присваивается тип Static (Статический). В этом случае локальные переменные сохраняются между вызовами. Атрибут Static не влияет на переменные, которые объявлены вне данной процедуры, даже если они используются в процедуре.
Попробуем создать простую процедуру-функцию Предположим, что на основе цен, выраженных в рублях, должны быть автоматически определены и указаны в отдельном поле цены в американских долларах. Мы будем использовать форму Прейскурант цен, содержащую поля Название товара, Цена в рублях и Цена в долларах, которые связаны с соответствующими полями таблицы Товары отношением один к одному.
Р ис. 6. 5.Пример формы
Чтобы решить данную задачу, необходимо создать процедуру, определяющую значение поля USD на основе содержимого поля Цена в рублях:
• Откройте окно модуля и вызовите команду Процедура из меню Вставка или нажмите соответствующую кнопку на панели инструментов. На экране появится диалоговое окно для указания имени создаваемой процедуры.
Р ис. 6. 6. Выбор типа процедуры и указание ее имени
Активизируйте переключатель функция (Function), введите в поле Имя имя функции Рубли_в_Доллары и щелкните на кнопке ОК. Access 97 генерирует заготовку функции (начальный и конечный операторы) с указанным именем. Вам останется ввести операторы, которые будут производить расчеты. Окончательный вариант создаваемой функции должен быть приблизительно таким:
Public Function Рубли_в_Доллары ()
' Пересчет цены в рублях в цену в долларах
Forms! [Прейскурант цен]! [Цена в долларах]= Forms! [Прейскурант цен]! [Цена в рублях]/5.5
End Function
После ввода каждой строки процедуры программа проверяет синтаксис введенного оператора. При обнаружении синтаксической ошибки на экране появляется соответствующее сообщение. Следует учитывать, что возможности синтаксической проверки VBA ограничены. Программа проверяет только корректность написания операторов и не обнаруживает более сложные ошибки, такие как обращение к полю, которого нет. Не обнаруживаются также ошибки в именах формы — они дают о себе знать только при выполнении процедуры.
Примечание:
Режим проверки синтаксиса отменяется путем выключения опции проверка синтаксиса, расположенной на вкладке Модуль диалогового окна Параметры. В этом случае проверка осуществляется только при компилировании.
• Выберите в меню Файл команду Сохранить, чтобы сохранить модуль с созданной функцией Присвойте модулю имя Прейскурантные расчеты.
Примечание:
Имя функции должно начинаться только с букв и не может содержать более 255 символов.
В имени функции наряду с буквами можно использовать цифры и знак подчеркивания, однако в нем не должно быть пробелов, пунктуационных знаков и ключевых слов VBA. Следите за тем, чтобы одно имя дважды не использовалось в одной базе данных.
Тело созданной процедуры состоит из одного оператора присваивания (=). В результате его выполнения вычисляется значение цены в долларах, которое заносится в соответствующее поле формы.
Структурирование программного кода
Автоматически сгенерированные в модуле строки кода обозначают начало (Public Function Имя Функции ()) и конец (End Function) процедуры. Для повышения удобочитаемости кода процедуры, вводимого между ограничительными операторами, применяют приемы структурирования.
Аргументы процедуры
Благодаря аргументам пользователь имеет возможность управлять выполнением процедуры. Аргументы указываются в процессе создания процедуры.
Усложним рассмотренный ранее пример пересчета цен. Значение курса валют зададим как аргумент для функции пересчета. В случае изменения курса валют пользователю не придется редактировать текст процедуры — будет достаточно изменить только аргумент функции при обращении к ней.
При описании процедуры, зависящей от аргументов, имя аргумента принято вводить в скобках за именем процедуры в строке с ключевым словом Function/Sub:
Function Рубли_в_Доллары (Коэффициент)
Формы![Прейскурант цен]!USD=Формы!Прейскурант цен]!Рубли/ Коэффициент
End Function
При вызове такой функции значение аргумента указывается в скобках после имени функции:
=Рубли_в_Доллары(4500)
Пользователь может поставить функции в зависимость от целого ряда аргументов. В этом случае имена аргументов разделяютея запятыми:
Function Имя (Аргумент1, Аргумент2, ...)
Вызов процедуры, которая имеет аргументы, должен сопровождаться заданием значений для всех объявленных аргументов. Эти значения перечисляются в том же порядке, что и аргументы при объявлении, и разделяются запятыми. Если один из аргументов будет пропущен, компилятор выдаст сообщение об ошибке.
В пользовательских функциях или модулях в качестве аргументов могут применяться выражения. Это допускается во многих распространенных встроенных функциях (примеры этих функций приведены в следующей таблице). Такие аргументы вводятся в круглых скобках после имени функции. Например, в функции:
Sum ([Цена] + [Расходы на доставку])
[Цена] + [Расходы на доставку] является аргументом.
Функция Описание
Count Определяет количество маркированных записей
Dlookup Выводит значение поля из записи указанного набора данных
Format Форматирует число
Sum Выводит сумму значений ряда
Для обозначения логических значений в модулях служат зарезервированные слова TRUE (-1) и FALSE (0). Нельзя использовать в качестве логических значений слова Yes, No, On, Off, а также операторы Between, In и Is.
Значение функции
В приведенном примере присвоение полю вычисленного значения выполняется специальным оператором присваивания внутри функции. Обычно функции возвращают вычисленное значение. Пользователь описывает функцию, например Function Глубина(), которая вычисляет и возвращает некоторое значение. Затем он может обратиться к этой функции из любой процедуры, указав имя функции в правой части оператора присваивания:
Объем = 3*2* Глубина ()
При выполнении указанного оператора присваивания будет вызвана функция Глубина(). Чтобы функция вернула определенное значение, оно должно присваиваться имени функции. Например, функция Коэффициент_пересчета (), возвращающая коэффициент пересчета, должна выглядеть следующим образом-Function Коэффициент_лересчета () Коэффициент_пересчета=4500 End Function
Основные операторы VBA
После изучения основных приемов работы с процедурами вы можете попробовать написать функцию или подпрограмму для выполнения более сложных вычислений. Это потребует знания техники программирования на VBA, в том числе основных операторов этого языка.
Переменные и оператор присваивания
Переменные используются для сохранения значений величин, изменяющихся в процессе выполнения программы. Каждая переменная имеет имя, по которому происходит обращение к ней. Правила присвоения имен переменным не отличаются от описанных выше правил для имен полей. Присвоение значения переменной осуществляется посредством оператора присваивания, в котором слева указывается имя переменной, а справа — присваиваемое значение или выражение:
Номер =1
Город = "Новые Васюки"
Температура = 5.9
Синус = Sin (1.3)
Коэффициент = 234 /4*0.5
Переменные могут создаваться VBA автоматически, по мере появления в процедуре (неявное объявление). Переменные, которые не объявляются явно, по умолчанию имеют тип Variant. Внутри такой переменной кроме значения хранится индикатор типа значения.
Неявное объявление переменных допустимо только в случае отсутствия оператора Option Explicit в области описания модуля. Чтобы при создании нового модуля предотвратить появление этого оператора в области описания, следует отключить опцию явное описание переменных на вкладке Модуль диалогового окна Параметры.
Рекомендуется описывать все переменные явно, что позволит избежать появления ошибок, связанных с преобразованием типов данных и с опечатками в именах переменных. Явное описание переменных выполняется с помощью оператора Dim, после которого указываются имя переменной и ее тип:
Function Расчет()
Dim A As Integer
Dim Коэффициент As Single
Dim Результат As Single
A = 1
Коэффициент = 234 / 4 * 0.5
Результат = А / Коэффициент
End Function
В этом примере переменная А объявлена целой (As Integer), а переменные Результат и Коэффициент — действительными переменными единичной длины (As Single). Объявив явно тип некоторой переменной, вы берете на себя обязательство заносить в эту переменную данные только определенного типа (целые числа, текстовые строки, денежные величины), который указан для нее при объявлении. Попытку занести в целую переменную текстовую строку компилятор VBA расценит как ошибку и выдаст соответствующее сообщение.
Если при явном объявлении переменной не указан тип данных, а заданы оператор Dim и ее имя, будет создана переменная типа Variant, которой можно присваивать цепочки символов, числа с плавающей точкой, а также значения даты и времени (совершенно разные типы данных) Access 97 однозначно идентифицирует присваиваемые значения, поскольку наряду с ними он хранит в переменной и признак типа.
Работа с данными типа Variant имеет существенный недостаток: постоянное отслеживание типа хранимого значения занимает много машинного времени. Для сокращения времени, необходимого для выполнения программы, все используемые переменные надлежит декларировать явно, задавая один из стандартных типов данных.