При пошаговом выполнении кода можно выполнить блок кода целиком до того места, где находится курсор. Такая опция полезна при работе в пошаговом режиме, когда необходимо перейти к следующему разделу кода. Одним из примеров может служить цикл. Проверив цикл несколько раз в пошаговом режиме, чтобы убедиться в его правильной работе, можно перевести курсор в конец цикла и выбрать в меню команду Debug | Run to Cursor (Отладка | Выполнить до курсора) или нажать клавиши Ctrl+F8.
Set Next Statement
При пошаговом выполнении кода можно установить следующий оператор, который необходимо выполнить. Для этого нужно щелкнуть правой кнопкой мыши на той строке кода, которую необходимо выполнить следующей. Затем в контекстном меню следует выбрать пункт Set Next Statement (Установить следующий оператор).
Продолжение выполнения кода
После тестирования кода в пошаговом режиме можно продолжить выполнение кода с нормальной скоростью. Для этого в меню необходимо выбрать команду Run | Continue (Выполнить | Продолжить) или нажать клавишу F5.
|
|
Повторное выполнение кода
После обнаружения и исправления ошибки в пошаговом режиме можно выполнить код повторно, не останавливаясь и не перезапуская приложение. Желтая стрелка на левой границе показывает, какой оператор кода будет выполнен следующим. Можно щелкнуть на желтой стрелке, перетащить се вверх к предыдущей строке кода и выполнить код повторно.
Определение значений переменных
При отладке приложения значение переменной можно определить, если задержать указатель мыши над соответствующей переменной, находясь в режиме прерывания (рис. 8).
РИСУНОК 8. Определение значения переменной в режиме прерываний.
Для получения значения переменной можно также воспользоваться окном Immediate. Например, следующий текст, введенный в окне отладки, возвращает значение переменной с именем strName:
? strName
Использование технологии IntelliSense при отладке
При возникновении программной ошибки и обнаружении некорректной строки кода можно проверить синтаксис с помощью IntelliSense. Технология IntelliSense упрощает разработку, предлагая возможные свойства и методы объектов по мере ввода кода. Например, после ввода имени объекта (например, Recordset или Application) можно ввести точку и проверить, использовано ли правильное имя и написание данного свойства или метода. Если в раскрывающемся списке свойство или метод не отображается, возможно, это говорит о том, что синтаксис не верен.
Использование окна Locals
Окно Locals (Переменные) отображает выражения, значения и типы всех переменных, находящихся в области видимости (рис. 9). Чтобы открыть окно переменных, необходимо в меню выбрать команду View Locals Window (Вид | Окно переменных).
|
|
РИСУНОК 9. Окно Locals отображает переменные в текущей области видимости
СОВЕТ
Окно Locals можно использовать для изменения значения переменных. Для этого необходимо дважды щелкнуть на значении переменной и ввести новое значение.
Использование окна Watch
Окно Watch (Наблюдение) можно использовать для оценки выражений во время выполнения приложения. Например, если необходимо увидеть все места, где меняется значение переменной strName, можно воспользоваться окном наблюдения.
Сначала необходимо выбрать в меню пункты Debug | Add Watch (Отладка | Добавить для просмотра). В диалоговом окне Add Watch необходимо ввести выражение, за которым нужно установить наблюдение (например, strName = "Smith"). Кроме того, в диалоговом окне нужно указать, следует ли оценивать данное выражение в определенных процедурах, модулях или во всем приложении (рис. 10). Здесь же нужно указать Watch Type (Тип наблюдения):
• Watch Expression — отслеживать выражение
• Break When the Value is True — остановить выполнение кода в режиме прерываний, если выражение истинно
• Break When Value Changes — остановить выполнение кода в режиме прерываний, когда значение выражения изменяется
РИСУНОК 10. Использование Оии-югового окна Add Watch для установки наблюдения за выражением.
Для быстрой установки наблюдения за выражением можно выделить выражение в тексте кода. Затем в меню необходимо выбрать команду Debug | Quick Watch (Отладка | Быстрый просмотр) или нажать клавиши Shifi+F9. В диалоговом окне Quick Watch необходимо щелкнуть на кнопке Add (Добавить) (рис. 11)
РИСУНОК 11. Использование диалогового окна Quick Watch
Просмотр в окне Call Stack
Приложение может включать процедуры, которые вызывают другие процедуры, а те, в свою очередь, вызывают третьи процедуры и т.д. При отладке приложения можно попасть в безвыходную ситуацию или запутаться в списке выполненных процедур. В таких случаях можно воспользоваться окном Call Stack (Вызов стека).
Окно вызова стека можно представлять себе следующим образом. При выполнении кода точка наблюдения передвигается в будущее. Call Stack представляет собой окно истории. Оно показывает, какие процедуры уже были выполнены (рис. 12). Чтобы открыть окно Call Stack, необходимо в меню выбрать команду View | Call Stack (Вид | Вызов стека) или использовать комбинацию клавиш Ctrl+L.
РИСУНОК 12. Окно Call Stack используется для отображения списка выполненных процедур
СОВЕТ
Для перехода к определенной процедуре можно выбрать ее в окне Call Stack и щелкнуть на кнопке Show (Показать) (или просто дважды щелкнуть на процедуре).
Использование условной компиляции
Работа с единственной версией приложения представляется гораздо более удобным подходом, чем создание нескольких версий. Предположим, имеется приложение, которое используется несколькими отделами. Большая часть приложения является общей и может использоваться всеми отделами, но небольшие блоки кода должны быть приспособлены под нужды каждого отдела. Если принято решение создать несколько версий, обновление и поддержка всех версий может оказаться непосильной задачей. Каждый новый блок общего кода необходимо добавлять во все версии. Кроме того, большое количество версий усложняет работу с приложением и затрудняет его распространение.
Гораздо удобнее создать единственную версию приложения, которая по-разному выполняется при разных обстоятельствах. Можно выбрать, какая часть кода в приложении компилируется или выполняется в зависимости от обстоятельств.
В качестве примера допустим, что в Лос-Анджелесском отделении предприятия должна выполняться некоторая часть кода, которая не выполняется ни в одном из других отделений. Во-первых, необходимо выбрать константу для данного отделения, например, LA. Константу нужно ввести как аргумент условной компиляции для приложения. В редакторе Visual Basic в меню необходимо выбрать команду Tools | Apllication's Properties (Сервис | Свойства приложения). Откроется диалоговое окно Project Properties (Свойства проекта). Нужно выбрать вкладку General (Общие). В поле Conditional Compilation Arguments (Аргументы условной компиляции) необходимо ввести LA = -I. Данное выражение позволяет установить константу равной True.
|
|
Теперь можно ввести код, который выполняется только для версии LA приложения. Для этого необходимо записать код в конструктив условной компиляции. Например:
#If LA Than
' Данный код выполнятся в IA-версии приложения.
#End If
Кроме того, условная компиляция может оказаться полезным средством отладки. Если необходимо часто комментировать разделы кода, нужно установить аргумент условной компиляции fComment = -1. Данный флаг комментария теперь можно использовать в конструктиве условной компиляции для комментирования разделов кода:
#If fComment Then
' Выполняется данный код.
#End If
Создание надежного кода
Не существует способа, который позволил бы избежать отладки приложений. Однако, если придерживаться следующих указаний, можно увеличить степень надежности кода и устранить ошибки.
Объявление переменных в отдельных строках кода
Гораздо проще проверить, объявлена ли переменная, просматривая переменные, записанные в отдельных строках кода, а не в одной длинной текстовой строке. Кроме того, данный подход позволяет избежать проигрыша в скорости.
СОВЕТ
Кроме того, группировка объявляемых переменных по типу данных также упрощает обращение к переменным.
Объявление переменных в минимальной области действия
Рекомендуется как можно чаще использовать локальные переменные. Это не только предотвращает возникновение проблем, связанных с областью действия, но и повышает скорость выполнения приложений.
Использование специфических типов данных
Рекомендуется всегда объявлять тип данных и использовать наименьший по занимаемому объему тип данных. Если тип данных не объявлять, используется тип Variant. Это не только неэффективно из-за дополнительных требований к ресурсам, но и может стать причиной появления программных ошибок, поскольку любой тип данных можно присвоить переменной типа Variant. Например, если переменная должна хранить только числа и при этом использован тип Variant, может возникнуть ошибка, когда с переменной используются данные, отличные от чисел, или объекты.
|
|
Разрушение объектных переменных
Разрушение объектных переменных позволяет уменьшить вероятность ошибок ресурсов. Если существует объектная переменная с именем objWord, необходимо разрушить ее в конце процедуры с помощью выражения Set objWord = Nothing.
Использование зарезервированного слова TypeOf
Часто можно передавать элементы управления в общую процедуру. Например, можно передать список и поле со списком в общую процедуру, которая загружает значения с помощью метода Addltem. Если передавать элемент управления, который не является ни списком, ни полем со списком (например, командная кнопка), возникнет ошибка, поскольку данный элемент управления не содержит метод Addltem. В процедуре для проверки типа элемента управления и устранения ошибки используется зарезервированное слово TypeOf.
Использование ключевого слова Me вместо Screen.ActiveForm и Screen.ActiveControl
При отладке приложения ключевым окном является окно Immediate. Таким образом, методы Screen.ActiveForm и Screen.ActiveControl не будут работать. Вместо них для обращения к текущей форме используется ключевое слово Me.
Использование обработчика ошибок
При возникновении ошибки обработчик ошибок может помочь сэкономить время и обнаружить оператор, ставший причиной сбоя, выдать информацию о типе ошибки, номере строки и т.д. Более подробная информация об обработчике ошибок приведена в статье «Профессиональная обработка ошибок».
Использование Option Explicit
Рекомендуется производить явное объявление всех переменных, использовав опцию Option Explicit в начале каждого модуля. По умолчанию эту опцию можно установить, выбрав опцию программы Require Variable Declaration (Требовать объявления переменных). Объявляя все переменные, можно избежать ошибок, связанных с неправильным написанием имен переменных.
Отсчет с 0 или 1?
В VBA для одних элементов отсчет начинается с 0, а для других — с I. Например, массивы начинают отсчет с 0, а множества — с 1. Если неизвестно, с какого значения начинается нумерация, это необходимо обязательно выяснить. Неправильная догадка может стать причиной ошибки.
Немедленное исправление ошибок
При разработке приложения часто возникает искушение проигнорировать ошибку. Например, разработчик создает новые свойства приложения и наталкивается на ошибку в другой части приложения. Лучше всего остановиться и исправить ошибку. Это достаточно тяжело, потому что основное внимание занято новой разработкой. Однако позже данную ошибку будет труднее обнаружить и воспроизвести. Необходимо взять за железное правило — при нахождении ошибки немедленно исправлять ее.