Поиск по сайту:


«VBA Понятие макроса, создание, отладка, использование среды для отладки программ»

Файл: 4 КБ
Поделиться:

5.1 Понятие макроса
5.2 Создание
5.3 Отладка, использование среды для отладки программ
5.4 Обработка ошибок выполнения



5.1 Понятие макроса

Макрос - процедура на внутреннем языке приложения, в которой записаны действия пользователя приложения. В программах Word, Excel и PowerPoint макрос записывается на VBA. В Access макросы создаются с помощью собственного языка макросов, а не записываются автоматически, и к тому же не являются процедурами VBA.

5.2 Создание

Прежде чем записать макрос, требуется продумать свои действия, то есть составить алгоритм. Особое внимание следует уделить таким положениям:
 Какие условия должны выполняться при запуске макроса (какой файл должен быть открыт, где должен находиться курсор, в каком режиме должно работать приложение).
 Какие действия должен выполнять макрос.
 Какие действия необходимо проделать при завершении работы макроса.
Чтобы начать запись макроса, необходимо:
 Активизировать приложение
 Открыть документы, используемые при записи макроса
 Выбрать команду Сервис\Макрос
 Выбрать команду Начать запись. Выводится диалоговое окно Запись макроса
 Ввести имя записываемого макроса в поле Имя макроса
 Выбрать в списке Макрос доступен для документ, в который требуется поместить макрос
 Нажать ОК, чтобы начать запись
После этого записываются все выполняемые в приложении действия
По завершении выполнения требуемых действий необходимо:
 Нажать на панели инструментов Остановка записи кнопку Остановить запись
 или выбрать команду Сервис\Макрос\Остановить запись
Вновь созданный макрос содержится в документе, который был активным при запуске макроса. При записи документа на диск макрос сохраняется вместе с проектом.
Для выполнения записанного макроса необходимо:
 Выбрать команду Сервис\Макрос\Макросы. Выводится диалоговое окно Макрос.
 Выбрать имя требуемого макроса
 Нажать кнопку Выполнить для запуска макроса.
Для редактирования записанного макроса необходимо:
 Выбрать команду Сервис\Макрос\Макросы. Выводится диалоговое окно Макрос.
 Выбрать имя требуемого макроса
 Нажать кнопку Изменить. Макрос выводится в окне редактора Visual Basic for Applications..

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

Поскольку идеальных программистов не существует, в большинстве систем разработки программ имеются инструменты, с помощью которых можно решить проблемы, возникающие в процессе программирования. В VBA также есть средства, которые позволяют либо исключить ошибки при разработке, либо задать обработку ошибок при выполнении программ.
Отладка программ - это проверка и внесение исправлений в программу при ее разработке. Отладка позволяет идентифицировать ошибки, допущенные при программировании (синтаксические - ошибки в выражениях и именах, и логические - в логике работы программы).
Обработка ошибок - это задание реакции на ошибки, которые возникают при выполнении программы. Их причиной могут быть как ошибки программиста, так и внешние факторы - отсутствие нужных файлов, отказы аппаратуры, неправильные действия пользователя.
Типы ошибок. Ошибки в программе делятся на три категории:
Ошибки компиляции - возникают, когда компилятор не может интерпретировать введенный текст. Некоторые ошибки компиляции обнаруживаются при вводе, а другие - перед выполнением программы. Такие ошибки легко определить и исправить, поскольку VBA выявляет их автоматически, а сами ошибки очевидны.
Примечание. VBA автоматически компилирует программу каждый раз при запуске на выполнение после внесения изменений. Можно также запустить компиляцию командой Отладка\Компилировать.
Ошибки выполнения - возникают при выполнении программы после успешной компиляции. Их причиной обычно является отсутствие данных или неправильная информация, введенная пользователем. Такие ошибки идентифицируются VBA с указанием инструкции, при выполнении которой произошла ошибка. Для исправления таких ошибок обычно приходится выводить значения переменных или другие данные, которые влияют на успешное выполнение программы.
Логические ошибки трудно заметить и устранить. Они не приводят к прекращению компиляции или выполнения, однако являются причиной того, что программа не выдает желаемых результатов. Выявление таких ошибок производят путем тщательной проверки с помощью средств отладки VBA.
Средства отладки. В VBA имеется большое количество средств, предназначенных для отладки программ. К ним относятся: использование оператора Option Explicit, пошаговое выполнение программы, работа в режиме прерывания, использование точек останова, вывод значений переменных.
Использование Option Explicit. Данный оператор описания требует явного задания переменных в программах. При его использовании возникает ошибка компиляции при неправильном написании имени переменной или использовании неописанной переменной. Кроме того, явное описание переменных позволяет обойтись без использования типа данных Variant и связанных с его использованием ошибок при неявном приведении типов данных.
Пошаговое выполнение программы. Этот режим служит для локализации ошибок в теле программы. Для его запуска используются команды меню, клавиатура или панель инструментов Отладка, отображаемая командой Вид\Панели инструментов\Отладка. В меню и на панели инструментов имеются четыре команды (кнопки) для выполнения программы в пошаговом режиме.
 Команда Отладка\Шаг с заходом (клавиша F8) позволяет выполнить одну строку программы и перейти к следующей. Если следующая строка - вызов процедуры, то происходит переход к первому выполняемому оператору этой процедуры.
 Команда Отладка\Шаг с обходом (клавиши Shift+F8) также выполняет одну строку программы, но если строкой является вызов процедуры, то она выполняется как одна инструкция. Данная команда используется, если известно, что эта процедура работает правильно.
 Команда Отладка\Шаг с выходом (клавиши Ctrl+Shift+F8) заканчивает выполнение текущей процедуры и останавливается на следующей после вызова текущей процедуры инструкции в вызывающей подпрограмме.
 Команда Отладка\Выполнить до текущей позиции (клавиши Ctrl+F8) выполняет программу от текущей до выбранной инструкции. Перед выбором данной команды требуется установить курсор в окне модуля на требуемую позицию.
Работа в режиме прерывания. Переход в данный режим выполняется:
 При нажатии кнопки Отладка в окне сообщения об ошибке выполнения.
 При прерывании работы программы нажатием клавиш Ctrl+Break. Текущая строка программы выделяется в окне модуля.
 По достижении точки останова.
 По достижении оператора Stop.
 При пошаговом выполнении программы.
В режиме прерывания можно:
 Вывести значение переменной.
 Вычислить выражение в окне отладки.
 Сбросить программу
 Выполнить программу в пошаговом режиме.
 Продолжить выполнение программы.
Для выхода из режима прерывания используется команда Запуск\Сброс.
Использование точек останова. Точка останова - это строка в процедуре, на которой приостанавливается выполнение программы. Все команды, находящиеся выше точки останова, выполняются с обычной скоростью, а по достижении контрольной точки программа переходит в режим прерывания. Затем можно отлаживать процедуру в пошаговом режиме, либо использовать различные способы вывода значений переменных. Кроме того, имеется возможность остановить выполнение или сбросить процедуру командами меню Запуск или кнопками панели инструментов Отладка. В одном проекте можно задать несколько точек останова, причем в различных процедурах.
Чтобы установить или снять точку останова, используется команда Отладка\Точка останова или клавиша F9, либо кнопка Точка останова панели инструментов Отладка. Можно также установить или снять точку останова, щелкнув левой кнопкой мыши на полосе индикатора против требуемой строки. Точка останова отмечается коричневой жирной точкой на полосе индикатора, а сама строка выделяется коричневым цветом.
Чтобы быстро удалить все точки останова открытого проекта, используется команда Отладка\Снать все точки останова или комбинация клавиш Ctrl+Shift+F9. Для данной команды не предусмотрена кнопка на панели инструментов Отладка.
Вывод значений переменных. При наличии тестового примера вывод значений переменных позволяет сравнить ожидаемые и полученные значения переменных. Для отображения значений переменных в режиме прерывания необходимо:
 При установленном флажке Подсказки значений переменных в окне Сервис\Параметры достаточно переместить указатель мыши на требуемую переменную для отображения имени и значения переменной во всплывающей подсказке.
 Выбрать команду Отладка\Контрольное значение (нажать клавиши Shift+F9) для вывода диалогового окна Контрольное значение. При этом курсор должен находиться возле переменной, значение которой надо контролировать. В окне Контрольное значение отображается контекст (имя модуля и процедуры), выделенное выражение (переменная) и кнопки Добавить и Отмена. При нажатии кнопки Добавить откроется окно Контрольные значения, содержащее имена переменных (выражения), их значения, тип данных и контекст.
 Для добавления других контрольных значений используется команда Отладка\Добавить контрольное значение.
 Выбрать команду Вид\Окно локальных переменных. Откроется окно Локальные переменные, в котором в режиме прерывания отображаются имена, значения и типы всех переменных модуля.
 Выбрать команду Вид\Окно отладки. В нем немедленно выполняется введенная в него инструкция, обычно операция отображения значения выражения вида Print имя, или операция присваивания значения переменной. Выполняемая программа также может выводить информацию в это окно с помощью выражения Debug.Print имя переменной.
Для отображения значений переменных в режиме нормальной работы необходимо ввести в тело программы вызов функции MsgBox (сообщение, [кнопки, заголовок]). Эта функция отображает диалоговое окно, содержащее сообщение длиной до 1024 символов, в которое с помощью операции конкатенации можно включить значение переменных, а также (необязательно) кнопки для реакции на отображения окна (по умолчанию только кнопка ОК) и заголовок окна (строковое выражение). Пример:
MsgBox "Значение val=" & val
Заметим, что VBA не имеет встроенных функций ввода/вывода в документ. Поэтому для вывода значений выражений и переменных в активный документ приходится создавать пользовательские процедуры. Например, для вывода значения в ячейку рабочего листа "Лист1" активной книги Excel приходится записывать в модуле и вызывать процедуру вида:
Sub out(name As String, val As Variant)
Лист1.Range(name).Value = val
End Sub
Здесь name - координаты ячейки, записанные в кавычках, а val - имя выводимой переменной.
Для ввода значений переменных в программу применяют функцию InputBox(сообщение[, заголовок] [, значение по умолчанию] [, координата x] [, координата y]). Эта функция отображает диалоговое окно, содержащее окно ввода, кнопки ОК и Отмена, сообщение (подсказку для ввода) и (необязательно) заголовок окна, значение, вводимое по умолчанию, координаты окна по горизонтали и вертикали в твиках. Заметим, что функция InputBox всегда (даже при нажатии кнопки Отмена) возвращает значение строкового типа, поэтому вызов ее должен иметь вид:
name = InputBox("Введи адрес ячейки", "Ввод", "a1", 100, 200)
Для преобразования введенного значения к нужному типу данных используются функции явного приведения типа, такие как CDbl(выражение), CInt(выражение), CLng(выражение), CSng(выражение), CVar(выражение), CStr(выражение).
Для ввода значений переменных из активного документа приходится создавать пользовательские процедуры. Например, для ввода значения из ячейки рабочего листа "Лист1" активной книги Excel приходится записывать в модуле и вызывать процедуру вида:
Sub read(name As String, val As Variant)
val = Лист1.Range(name).Value
End Sub
Здесь name - координаты ячейки, записанные в кавычках, а val - имя вводимой переменной.

5.4 Обработка ошибок выполнения

Как уже отмечалось выше, одной из основных проблем являются ошибки выполнения. Эти ошибки возникают при попытке произвести недопустимую операцию, например, при открытии несуществующего файла, делении на ноль, или при обработке неправильно введенных пользователем данных.
Так или иначе, при возникновении ошибки выполнение программы прерывается и выводится сообщение. К сожалению, это сообщение несет мало полезной информации, поскольку в нем указывается только недопустимая операция, а не причина возникновения ошибки. Еще хуже то, что программа не выполняется до конца и не произведены все необходимые действия.
Пользователь может без всякого умысла произвести действия, которые нанесут непоправимый вред данным. Следовательно, необходимо каким-то образом оградить себя от возникновения подобных ситуаций.
При программировании имеются два подхода:
 Предотвращение ошибочных ситуаций.
 Обработка ошибки с помощью специальной процедуры.
При разработке программ рекомендуется по возможности предотвращать возникновение ошибочных ситуаций. Начиная создание алгоритма макроса, следует ответить на ряд вопросов, например:
 Существует ли файл, который требуется открыть?
 Находится ли курсор в требуемой для выполнения макроса позиции?
Перехватываемые ошибки.
Перехват используется в том случае, когда предотвратить возникновение ошибочных ситуаций невозможно. Полный список перехватываемых ошибок приводится в разделе системы справочной информации Visual Basic "Перехватываемые ошибки" (Trappable Errors). Ниже описываются только некоторые из них.
КОД СООБЩЕНИЕ
3	Инструкция Return без Gosub
6	Переполнение
7	Не хватает памяти
9				Индекс выходит за пределы допустимого диапазона
11	Деление на 0
18	Произошло прерывание, вызванное пользователем
35	Процедура Sub, Function или Property не определена
53	Файл не найден
61	Переполнение диска
71	Диск не готов
91	Не задана объектная переменная блока With
97	Невозможен вызов процедуры Friend для объекта, не являющегося экземпляром определяющего класса
335	Невозможен доступ к системному реестру
368	Истек срок данного системного файла. Программе требуется файл более новой версии
402	Сначала необходимо закрыть самую верхнюю модальную форму
422	Свойство не найдено
440	Ошибка программирования объектов
448	Именованный аргумент не найден
482	Ошибка принтера
31032	Невозможно создать внедренный объект
Очевидно, что ни одно из показанных сообщений не дает пользователю исчерпывающих сведений о причине возникновения ошибки. Профессионал может точно определить проблему, используя систему справочной информации, а человеку, который захочет, например, написать письмо или ввести данные в отчет с помощью разрабатываемого приложения, такие сообщения непонятны. Предотвращая возникновение ошибок или перехватывая их, можно исключить вывод стандартных сообщений. Вместо них появляется возможность либо отобразить собственную подсказку, либо попытаться исправить положение с помощью макроса. Ниже объясняется, как перехватить ошибку.
Перехват ошибок.
Обработка ошибок выполнения в VBA называется перехватом ошибки. Правильно разработав подпрограмму обработки ошибок, можно задать отклик на многие возможные ошибки. Наиболее важно, чтобы ошибка не остановила выполнение процедуры. При этом пользователь может даже не заметить, что произошла ошибка.
Система перехвата ошибок включает следующие компоненты:
 Инструкция On Error устанавливает перехват ошибки. Она сообщает процедуре, что делать, если произошла ошибка, обычно передавая управление подпрограмме обработки ошибки.
 Подпрограмма обработки ошибки - это часть выполняемой процедуры, которая используется для обработки ошибок. Обычно в ней определяется тип возникшей ошибки, а затем производятся соответствующие действия. Начало подпрограммы обработки идентифицируется меткой.
 Объект Err содержит информацию о возникшей ошибке. Подобно любому объекту он имеет свои свойства, включая номер и описание ошибки.
 Инструкция Resume позволяет процедуре продолжить операции после обработки ошибки.
 Инструкция Exit позволяет выйти из процедуры, не выполняя оставшийся код. Данная инструкция используется очень часто, поскольку если ошибок не возникло, то не следует исполнять подпрограмму обработки ошибки.
Общие сведения о перехвате ошибок.
Общее правило перехвата ошибок можно пояснить на примере следующей процедуры:
Sub MyProcedure ()
On Error GoTo MyErrorHandler
'…
' Обычные действия, при выполнении каждого из
' которых может произойти ошибка
'…
Exit Sub ' Выход для обхода подпрограммы обработки ошибки
MyErrorHandler:
'…
' Подпрограмма обработки ошибки
'…
Resume
End Sub
Инструкция On Error устанавливает перехват ошибки для невыполненной части макроса, указывая на подпрограмму обработки ошибки. В макросе может быть несколько инструкций On Error, каждая из которых определяет разные процедуры обработки. В предыдущем примере при возникновении ошибки управление передается инструкции с меткой MyErrorHandler.
Инструкция On Error имеет три формы:
 Инструкция On Error GoTo метка позволяет передать управление подпрограмме обработки ошибки, которая идентифицируется меткой.
 Инструкция On Error Resume Next позволяет игнорировать ошибку и продолжить выполнение со следующей инструкции после той, при исполнении которой возникла ошибка. Если ошибка вызывает возникновение других ошибок, то лучше не применять данную форму инструкции On Error.
Для определение типа ошибки и выполнения, соответствующих ей действий имеется возможность получить значение свойства Number объекта Err.
 Инструкция On Error GoTo 0 отключает обработку ошибок для данной процедуры. Данная инструкция обычно указывается после первых двух форм инструкции On Error ниже строк, в которых могут возникнуть ошибки. Поскольку подпрограмма обработки уже сыграла свою роль, можно не перехватывать ошибки.
В любом случае инструкция On Error устанавливает обработку ошибок только в той процедуре, в которой она указана.
Инструкцию On Error можно указывать произвольное число раз, изменяя способ обработки ошибок.
Sub MySub ()
'…
On Error GoTo MyHandler
'…
OnError Resume Next
'…
On Error GoTo 0
'…
MyHandler:
'…
Resume
End Sub
Метка, которая помечает начало подпрограммы обработки ошибок, является параметром инструкции GoTo. Меткой является любое допустимое имя, оно располагается в самом начале строки, а сразу за ней ставится (:).
Обратите внимание, что в инструкции GoTo двоеточие не используется, т.к. оно не является частью имени. Двоеточие только идентифицирует метку.
Инструкция Resume указывается в конце подпрограммы обработки ошибок после выполнения всех требуемых действий. Она возобновляет исполнение процедуры, в которой возникла ошибка.
Совет.
Инструкцию Resume можно использовать только в подпрограмме обработки ошибки. В противном случае возникает ошибка.
Инструкция Resume имеет три формы:
 Инструкция Resume Next передает управление инструкции, которая следует за той, в которой возникла ошибка. Предполагается, что подпрограмма обработки устранила последствия ошибки.
 Инструкция Resume или Resume 0 передает управление инструкции, в которой возникла ошибка, и VBA производит попытку выполнять эту строку снова. Предполагается, что подпрограмма обработки устранила причины, которые вызвали ошибку, и теперь инструкцию можно выполнить без ошибки.
 Инструкция Resume метка передает управление инструкции, идентифицированной указанной меткой.
Инструкция Resume является необязательной. Если требуется завершить выполнение процедуры после обработки ошибки, то можно опустить эту инструкцию.
Обратите внимание на следующее правило: каждая процедура должна иметь только одну точку выхода, чтобы обеспечить выполнение некоторых вспомогательных действий перед своим завершением. Передавая управление хотя бы на метку подпрограммы выхода, можно гарантировать, что требуемые действия производятся всегда. Кроме того, по мере возрастания длины и сложности процедур данное правило приобретает все большее и большее значение.
Инструкция Exit используется для того, чтобы не выполнять подпрограмму обработки ошибки, если ошибка не возникла. Поскольку подпрограмма обработки является частью процедуры, то она будет исполняться если не выйти из макроса.
Инструкция Exit имеет пять форм, указывающих на блок, из которого требуется выйти:
Exit Sub
Exit Function
Exit Do
Exit For
Exit Property
В процедурах, в которых имеется подпрограмма обработки ошибки, обычно используются инструкции Exit Sub или Exit Function в зависимости от типа выполняемой процедуры.
Объект Err и подпрограмма обработки ошибки.
Во многих ситуациях имеется большое число потенциальных ошибок, а подпрограмма обработки должна выполнять определенные действия в зависимости от возникшей ошибки. С помощью объекта Err можно во время выполнения процедуры выявить тип ошибки. Обратите внимание, что если подпрограммы обработки не имеется, то выводится стандартное сообщение.
Объект Err - глобальный объект, который содержит информацию о последней возникшей ошибке. Подобно любому другому объекту он имеет свойства и методы. Используя свойства объекта Err и выполняя его методы можно сообщить подпрограмме обработки характер произошедшей ошибки.
Объект Err имеет шесть свойств:
 Свойство Number - номер возникшей ошибки.
 Свойство Source - имя проекта Visual Basic, в котором произошла ошибка.
 Свойство Description - строка, соответствующая номеру ошибки. Некоторые ошибки, включая заданные пользователем ошибки, не имеют описания и тогда строка имеет значение "Ошибка, определяемая приложением" или "Ошибка, определяемая объектом".
 Свойство HelpFile - полное имя файла справки Visual Basic, включая диск и путь.
 Свойство HelpContext - идентификационный номер в справке Visual Basic, соответствующий возникшей ошибке.
 Свойство LastDLLError содержит код системной ошибки для последнего вызова библиотеки динамической компоновки. Используется только в 32-разрядных системах Microsoft Windows и доступно только для чтения.
Обычно, чтобы произвести определенные действия в зависимости от типа возникшей ошибки, требуется просто проверить значение свойства Number. Для этого используется любая логическая инструкция, например, блок If..Else..End If или Select Case..End Select. Блок Select Case..End Select удобнее, т.к. в него проще добавить дополнительное условие.
Заданным по умолчанию свойством объекта Err является свойство Number, поэтому нижеприведенные инструкции эквивалентны:
Select Case Err.Number
Select Case Err
Использование полного синтаксиса упрощает понимание программы. Сокращенный синтаксис совместим только в одну сторону с предыдущими версиями Visual Basic и WordBasic, в которых вместо объекта Err применялась функция Err. Объект Err имеет два метода:
 Метод Raise позволяет генерировать ошибку во время выполнения программы. Данный метод используется для проверки подпрограммы обработки ошибки, которую требуется перехватить. Кроме того, с его помощью можно создать для приложения собственные ошибки, указав их номер и описание.
При задании собственных ошибок необходимо сложить номер ошибки с константой vbObjectError. Таким образом, можно гарантировать, что номер не совпадает с номером стандартной ошибки Visual Basic. Приведем пример, в котором создается новая ошибка:
Err.Raise vbObjectError + 1, "MyProject.MyObject", "Служащего с таким именем в данном отделе не имеется"
 Метод Clear сбрасывает значения всех свойств объекта Err. Данный метод используется после того, как обработана ошибка и необходимо продолжить выполнение.
Примечание.
В ранних версиях Visual Basic и других языках Basic для создания ошибок использовалась инструкция Error. В целях обеспечения инструкция Error имеется и в новом Visual Basic, однако, во всех вновь создаваемых программах рекомендуется применять объект Err.