If [условия]
Then [условные операторы]
[Else операторы else]
End If
Для выполнения этой инструкции необходимо наличие хотя бы одного условия. Если условия истинны, выполняются условные операторы; в противном случае – операторы else. Инструкция должна заканчиваться строкой End If. Таблица 12.4
Программирование приложений с помощью VBA
Что может делать пользователь с помощью VBA? Ответ очень прост: все. К сожалению, ни в одной книге нельзя рассмотреть все вероятные сферы программирования, в которых вы найдете применение возможностям VBA. Поэтому ограничимся тем, что нас непосредственно интересует, – созданием БД.
Когда мы формируем новую базу данных, то хотим сделать ее удобной для пользователей. Однако у каждого из них свои взгляды на эти удобства, и нередко сервис базы данных приходится дорабатывать. Примеры, которыми мы будем иллюстрировать использование VBA, взяты именно из этой области.
Практическая логика подсказывает: если какую-то задачу можно решить штатными средствами Access 2002 (стандартные запросы, макросы), то так и следует поступить. Обращение к VBA оправдано тогда, когда средства, заложенные в Access, либо не позволяют добиться нужного результата, либо предлагают сложное и громоздкое решение.
Предупреждение дублирования записей при вводе их из формы
В главе 11 мы обсуждали вопрос об очистке базы данных от повторяющихся записей, которые попали в таблицы, и выяснили, что этот механизм может работать и в профилактическом режиме, предотвращая попадание дубликатов при вводе записей.
А теперь покажем, как решить ту же задачу средствами VBA.
Сначала решим, как будет запускаться создаваемая нами программа. Очевидно, что проверка на наличие дубликатов должна проводиться не только для определенного поля, но и для комбинации полей. Естественно, тестирование начинается с того момента, когда в проверяемое поле вводится какая-либо информация, иначе просто нечего тестировать. Следовательно, надо «привязать» создаваемую программу к какому-либо свойству проверяемого поля. Например, возьмем поле Название фирмы. Откройте окно его свойств, где есть несколько подходящих для нашей цели параметров: После обновления, Нажать клавишу, Изменение, Потеря фокуса и др. Выберите свойство Потеря фокуса и щелкните по строке, которая ему соответствует. Теперь активизируйте кнопку
Откроется окно Построитель. В нем вы можете выбрать один из трех вариантов обработки свойства (см. рис. 12.4):
• построитель выражений;
• построитель макросов;
• построитель программ.
Рис. 12.4
О построителе выражений мы поговорим несколько позже; построитель макросов – это конструктор, уже рассмотренный в предыдущей главе. Наконец, построитель программ открывает окно модуля, которое было выведено на рис. 12.2, хотя и содержало другую информацию. Чтобы начать создание процедуры, выберите именно эту третью опцию. Тогда в окне свойств поля Название_фирмы_ установится режим Процедура обработки событий, как показано на рис. 12.5, и откроется окно модуля (см. рис. 12.6). Оно примечательно следующим.
Рис. 12.5
Рис. 12.6
Хотя процедуры еще нет и вы даже не приступили к ее созданию, в этом окне по умолчанию уже появятся операторы, обязательные для будущей программы.
Это:
• Private Sub Название_фирмы_LostFocus ();
• End Sub.
Первый оператор – имя процедуры Sub, которое автоматически присваивается ей в соответствии с именем поля и свойством (последние объединяются символом подчеркивания). Область действия процедуры (Private) – данный модуль класса (форма Фирмы). Второй оператор, End Sub, закрывает процедуру.
Дальше начинается заполнение создаваемой процедуры конкретными операторами.
Обработка ошибок выполнения
При программировании приложения необходимо учитывать и возможность возникновения ошибок, и их вероятные последствия. Ошибки появляются по одной из следующих причин:
• во время работы приложения некоторые действия могут войти в противоречие со стандартами программы. Например, при попытке открыть таблицу, которая была удалена пользователем, возникнет ошибка;
• сама программа может содержать логические ошибки, то есть в ней заложена недопустимая операция, к примеру деление на нуль. Это приводит к неожиданным последствиям.
Если механизм обработки ошибок не применяется, то при возникновении ошибки VBA прервет выполнение программы и выведет сообщение об ошибке, не определяя ее типа. Такой результат работы для нас неприемлем. Поэтому следует включать в программу процедуры обработки для всех ошибок.
Добавляя процедуру обработки, следует учитывать способ передачи управления процедуре при возникновении ошибки. Первое, что надо сделать для задания маршрута передачи управления, – это подключить обработчик ошибок путем включения некоторой формы инструкции On Error в процедуру. Инструкция On Error передает управление процедуре обработки события данной ошибки.
Если подключен обработчик, то при возникновении ошибки в процедуре VBA не выводит обычного сообщения. Вместо этого управление передается в обработчик (если он присутствует), который сразу же активизируется. В активном обработчике ошибок может определяться тип ошибки и осуществляться произвольная обработка.
Обработчик ошибок определяет, какие действия будут выполняться при возникновении ошибки в процедуре. Например, может быть завершено выполнение процедуры или исправлены условия и произведен повторный запуск. Инструкции On Error и Resume определяют способ передачи управления при возникновении ошибки.
Инструкция On Error
Эта инструкция служит для подключения и отключения процедуры обработки ошибок. Если такая процедура подключена, то при возникновении ошибки ей передается управление.
Есть три формы инструкции On Error:
• On Error GoTo метка;
• On Error GoTo 0;
• On Error Resume Next.
Первая форма подключает процедуру обработки ошибок начиная с той строки, на которой находится. Поэтому подключить обработчик следует перед первой строкой, которая может содержать ошибку. Активный обработчик при возникновении ошибки передаст управление строке, которая задана после слова метка.
Строка, указанная в качестве аргумента метка, и будет первой строкой процедуры обработки ошибок. Например, приведенная ниже инструкция определяет, что при возникновении ошибки управление передается процедуре под названием Err_Hазвание_фирмы_LostFocus_Click:
On Error GoTo Err_Название_фирмы_LostFocus_Click
При этом сама процедура Err_Hазвание_фирмы_LostFocus_Click может размещаться где угодно (но обычно в конце процедуры), важно, чтобы строка, определяющая вариант процедуры обработки ошибок, была введена перед началом процедуры, так как ошибки могут возникнуть только в ее операторах.
Инструкция On Error GoTo 0 отключает обработку ошибок внутри процедуры. Даже если строка с номером 0 существует, она не запустит программу обработки ошибок. Если инструкции On Error GoTo 0 в процедуре нет, то обработка ошибок отключается автоматически, как только программа завершится.
Если вы выбираете форму On Error Resume Next, то строка, вызвавшая ошибку, пропускается и управление передается следующей строке. Выполнение программы не прерывается. Удобство этой инструкции состоит в том, что она позволяет проверять свойства объекта Err сразу за строкой, в которой ожидается возникновение ошибки, а также устранять ошибки внутри самой процедуры, без помощи обработчика.
Из трех перечисленных форм инструкции On Error целесообразно выбрать первую – On Error GoTo метка – и вставить ее в текст процедуры непосредственно после оператора с названием процедуры. Синтаксис самой процедуры стандартен:
Err_Название_фирмы_LostFocus_Click: MsgBox Err.Description
Последний оператор позволяет вывести сообщение об ошибке с указанием ее типа и обычно задается в конце текста основной процедуры. Инструкция Resume
Инструкция Resume возвращает управление из обработчика ошибок в процедуру. Эту инструкцию следует включать в обработчик, если необходимо передать управление в определенную строку процедуры (см. ниже). Однако инструкция Resume не является обязательной: если она отсутствует, то процедура может завершиться, когда обработчик выполнит свои функции.
Есть три формы инструкции Resume:
• Resume или Resume 0 – возвращает управление строке, при выполнении которой произошла ошибка;
• Resume Next – возвращает управление той строке, которая непосредственно следует за строкой, вызвавшей ошибку;
• Resume метка – передает управление строке, которая задана в качестве значения аргумента метка. Он содержит номер строки или метку.
Инструкции Resume и Resume 0 обычно применяются, когда пользователю необходимо внести исправления. Например, система запросила имя таблицы для открытия, а вы ввели название несуществующего объекта. В таком случае запрос можно повторить и продолжить выполнение программы с инструкции, вызвавшей ошибку, внеся исправления.