[an error occurred while processing this directive] | |
1-й час. Знакомство с Visual Basic for Applications 3-й час. Работа с элементами управления 4-й час. Переменные и константы 6-й час. Логика условных операторов 7-й час. Циклические вычисления 9-й час. Основные объекты Excel 11-й час. Редактор Visual Basic 15-й час. Автоматизация экранных форм 20-й час. Получение внешних данных |
12-й час. Отладка программВ старинные времена разработки и применения макросов процесс их отладки описывался следующим образом: выполните макрос, если макрос работает не так, как надо, попробуйте определить причину этого. Какое красивое краткое описание длительного и мучительного процесса! В отличие от тех времен, редактор Visual Basic предлагает богатый современный набор инструментов и средств для тестирования и отладки разрабатываемых приложений. В этом часе будут рассмотрены следующие вопросы.
Тестирование и отладка как этап разработки приложенийПредположим, что уже написан код вашей процедуры. Следующий этап в создании любой процедуры - тестирование написанного кода. Тестирование - это процесс выполнения процедуры и исследование всех аспектов ее работы. Например, в процессе тестирования вы должны ввести различные типы данных (конечно, если это предусмотрено в процедуре), щелкнуть на всех командных кнопках, сделать выделение с последующим манипулированием различных диапазонов ячеек и т.п. Цель тестирования - проверить правильность результатов выполнения процедуры и ее реакцию на разнообразные действия пользователя. Если во время работы процедуры получены неверные результаты вычислений, непредвиденная реакция на те или иные действия пользователя, либо вообще произошла остановка выполнения, то это говорит о том, что код процедуры имеет ошибки (bugs). Теперь надо подумать, что вы, как программист, можете сделать для минимизации возможных неполадок в своей процедуре. Я, конечно, понимаю ваше стремление при создании нового проекта сразу приступить к написанию кода. Но если вы прислушались к моим рекомендациям по разработке приложений (см. начало 3-го часа "Работа с элементами управления"), то у вас есть сформулированные и документированные цели и требования к разрабатываемому приложению. В результате вы получаете четкую картину того, что и как должно выполнять приложение. Это, в свою очередь, помогает резко ограничить круг проблем, которые могут возникнуть при выполнении приложения. Также важно с практической точки зрения разграничивать приложения, разрабатываемые "для личного потребления", и приложения, с которым будут работать сторонние пользователи. Требования к приложениям, с которыми будут работать другие пользователи, естественно, значительно выше и на их тестирование и отладку потребуется больше времени. В любом случае, то время, которое вы потратите на анализ и документирование на первом этапе разработки приложения, с лихвой окупится на последующих этапах, в частности на этапе тестирования приложения. Еще одним хорошим средством предотвращения и отслеживания возможных ошибок в программах является поддержка соглашений об именах элементов управления, переменных, констант, объектов и т.д. Все примеры в этой книге удовлетворяют соглашениям об именах. Соглашения об именах элементов управления приведены в 3-м часе "Работа с элементами управления", а соглашения об именах переменных и констант - в 4-м часе "Переменные и константы". Не забудьте также о комментариях в коде ваших процедур. Комментарии помогут разобраться в назначении того или иного фрагмента кода. Кроме того, без понятных комментариев вы не сможете поддерживать ваше приложение в будущем. Выполняя упражнения из этой книги, вы, вероятно, не раз допускали какие-либо ошибки при вводе кода. В этом случае после нажатия клавиши <Enter> вы видели окно с сообщением о синтаксической ошибке (рис. 12.1). По умолчанию редактор Visual Basic отслеживает синтаксические ошибки в коде процедур после нажатия клавиши <Enter>. Это полезное средство, но при желании вы его можете отключить (или восстановить), удалив (или установив) флажок опции Auto Syntax Check (Автоматическая проверка синтаксиса) на вкладке Editor (Редактор) диалогового окна Options (Параметры). Другой тип ошибок называется ошибками выполнения (runtime error). Это такие ошибки, которые приводят к остановке выполнения приложения. Иногда вина за такие ошибки ложится на программиста. Например, вы ввели имя объекта с ошибкой. VBA может обнаружить такую ошибку только во время выполнения программы. Ошибки выполнения также могут быть реакцией на действия пользователя, которые не предусмотрены в программе, например на ввод некорректного значения аргумента функции, которую вы создали. Наконец, существует еще один тип ошибок, который называется логическими ошибками (logic error). VBA не может отследить такой тип ошибок, так как в этом случае обычно нет грамматических и синтаксических ошибок в написании операторов. В этом случае говорят, что нарушена логика выполнения операторов. Далее вы узнаете, что большинство средств отладки направлено именно на поиск и исправление логических ошибок.
Рис. 12.1. Редактор Visual Basic немедленно реагирует на синтаксические ошибки ОтладкаПроцесс локализации и исправления ошибок называется отладкой (debugging). VBA предлагает богатый набор средств отладки. К ним относятся:
Чтобы исследовать процесс отладки на практике, нам необходим какой-нибудь код. Создадим процедуру, содержащую ошибку.
Итак, процедура работает неправильно. Она определенно содержит ошибку, но как найти эту ошибку? На примере этой процедуры мы рассмотрим различные методы отладки. Режим остановаЧтобы отладить процедуру "вручную", даже если у вас есть определенные соображения о том, "где зарыта собака", необходимо просмотреть каждую строку кода. VBA, чтобы локализовать ошибку, предлагает несколько способов остановить выполнение процедуры в определенных точках кода. Это называется перевести процедуру в режим останова. Режим останова временно приостанавливает выполнение процедуры. В этом режиме можно проверить значения переменных и свойств, применить другие средства отладки. Режим останова позволяет выполнить следующие действия.
В нашей процедуре, как вы догадываетесь, ошибка как-то связана с оператором InputBox. Строка, содержащая этот оператор, хороший кандидат для того, чтобы после ее выполнения остановить процедуру. Место в коде программы, где остановится выполнение процедуры, называется точкой останова (breakpoint). Есть несколько способов пометить строку кода точкой останова.
Точку останова можно установить только на строке, содержащей исполняемый код. В строке, содержащей неисполняемый код, установить точку останова нельзя. К неисполняемому коду относятся комментарии, операторы объявления переменных и констант, пустые строки. Когда на строке кода установлена точка останова, то она меняет цвет (в соответствии с текущими установками среды редактора Visual Basic), и на индикаторной панели напротив этой строки появляется большая точка (рис. 12.2).
Рис. 12.2. В окне кода точку останова найти нетрудно Удалить точки останова можно точно теми же описанными выше способами, что и установить. Если в коде установлены несколько точек останова, чтобы удалить их все за один раз, выполните команду Debug > Clear All Breakpoint (Отладка > Удалить все точки останова) или нажмите комбинацию клавиш <Ctrl+Shift+F9>. В нашей экспериментальной процедуре Ошибка точку останова надо установить после строки, содержащей оператор InputBox. Для этого выполните следующие действия.
Конечно, можно установить больше одной точки останова - столько, сколько считаете нужным. Теперь выполним процедуру Ошибка и посмотрим, какой эффект произведет точка останова.
Рис. 12.3. Когда при выполнении процедура достигает точки останова, открывается окно редактора Visual Basic
Рис. 12.4. Быстрый просмотр значений переменных Теперь процедура находится в режиме останова, и есть возможность узнать значение, которое в данный момент приняла переменная response. Самый простой путь сделать это - поместить указатель мыши на имя переменной. Появится маленькое окошко, показывающее текущее значение переменной (рис. 12.4). Таким же образом можно просмотреть значения других переменных и свойств, которые вас интересуют. Просмотр значений переменных - это самое наименьшее, что вы можете сделать для поиска и устранения ошибок. Конечно, существуют и другие способы просмотра значений переменных и свойств. В следующем разделе мы познакомимся с окном Immediate, которое позволяет не только просматривать значения переменных и свойств, но и изменять их. Использование окна ImmediateОкно быстрого выполнения Immediate, показанное в нижней части рис. 12.5, предоставляет доступ ко всем переменным и свойствам, используемым в процедуре. С помощью этого окна можно решать различные задачи, включая следующие.
Рис. 12.5. Окно Immediate обычно располагается под окном кода Просмотр значений в окне ImmediateКак было показано ранее, можно просмотреть текущие значения переменных в режиме останова, поместив указатель мыши на имя переменной. Другой путь просмотра значений переменных и свойств - окно Immediate. Для этого также предусмотрено несколько способов. Во-первых, в окне Immediate можно ввести слово Print (Печать) или знак вопроса (?), а затем - имя переменной или свойства. Во-вторых, можно ввести непосредственно в процедуру оператор Debug.Print, который будет показывать в окне Immediate значения заданных переменных. Ниже мы рассмотрим оба эти способа. Сначала испробуем способ со словом Print (или, что то же самое, со знаком вопроса).
Для вывода значения переменной или свойства можно ввести слово Print или знак вопроса - результат будет одинаков. Если вы хотите выполнить оператор, который был ранее введен в окно Immediate (например, оператор Print для просмотра значений), установите курсор в строку с этим оператором и нажмите <Enter>.
Рис. 12.6. Просмотр значения переменной в окне Immediate В предыдущем примере для получения доступа к окну Immediate мы установили точку останова, которая переводила процедуру в режим останова. Затем получали в полное распоряжение окно Immediate. Но если по каким-либо причинам вы не хотите останавливать выполнение процедуры, но хотите знать значения переменных или свойств во время выполнения, то необходимо использовать оператор Debug.Print. Этот оператор вставляется непосредственно в код процедуры и выводит соответствующий текст в окно Immediate во время ее выполнения. Чтобы воспользоваться этим оператором в процедуре Ошибка, сделайте следующее.
В окне Immediate вы увидите две строки текста (рис. 12.7). Первая строка появилась во время первого выполнения процедуры, вторая – при повторном выполнении.
Рис. 12.7. Оператор Debug.Print пишет историю изменения значения переменной Пошаговое выполнение программВ большинстве случаев при отладке проверяется логика выполнения процедуры, поэтому необходимо отслеживать порядок исполнения строк кода. Это особенно необходимо при проверке работы операторов If и Select. Для этого применяется особый режим выполнения программ - пошаговое выполнение, когда программа останавливается после исполнения каждой строки кода. Существует два режима пошагового выполнения: Step Into (Тотальное пошаговое выполнение) и Step Over (Пошаговое выполнение с перешагиванием через процедуры). Оба режима позволяют пошагово выполнять весь код процедуры и отслеживать значения переменных и свойств. Есть и различия между этими режимами. Если отлаживается процедура, которая вызывает другие процедуры, и вы не хотите их выполнять в пошаговом режиме, то используется режим Step Over. В этом режиме вызываемые процедуры выполняются в обычном режиме, а не пошагово. Если вы хотите просмотреть в пошаговом режиме и вызываемые процедуры, то применяется режим Step Into. Обычно в пошаговом режиме выполняется не вся процедура. Чаще точка останова устанавливается в том месте кода процедуры, которое вызывает сомнение. Затем процедура выполняется, доходит до точки останова, останавливается, а далее применяется пошаговый режим. Покажем, как выполняется пошаговый режим на примере нашей процедуры Ошибка.
Рис. 12.8. В пошаговом режиме на выполняемый оператор указывает стрелка на индикаторной панели
Наблюдение за переменнымиVisual Basic предлагает еще один способ отслеживания значений переменных и свойств, который называется наблюдением за выражениями. Наблюдаемые выражения (watch expressions) - это любые определенные пользователем выражения Visual Basic, позволяющие просматривать значения многих переменных или выражений. Конечно, наблюдаемые выражения должны быть корректными с точки зрения языка VBA. Существует три режима наблюдения за выражениями, которые задаются выбором соответствующих переключателей в диалоговом окне Add Watch (Добавление наблюдаемых выражений) (рис. 12.9).
Используем в качестве наблюдаемого выражения переменную response.
Рис. 12.9. В этом диалоговом окне задаются режимы наблюдения за выражениями
Если хотите быстро создать наблюдаемое выражение, выделите нужное выражение (например, имя переменной) в окне кода и выполните команду Debug > Quick Watch (Отладка > Быстрое наблюдение) либо нажмите комбинацию клавиш <Shift+F9>. Наблюдение в этом случае будет проводиться в режиме Watch Expression, т.е. без вмешательства в ход выполнения процедуры.
Рис. 12.10. Окно Watches показывает значения всех наблюдаемых выражений Теперь, когда мы разобрались с ошибками, можно удалить наблюдаемые выражения. Для этого сделайте следующее.
Рис. 12.11. Это окно используется для редактирования и удаления наблюдаемых выражений Исправление ошибокПришло время исправить ошибку в процедуре Ошибка. Вы уже поняли, что метод InputBox при щелчке на кнопке Отмена возвращает значение False, а не пустую строку, как мы первоначально ошибочно предполагали. Код исправленной процедуры показан в листинге 12.1. Листинг 12.1. Исправленная процедура Ошибка
Протестируйте еще раз эту процедуру, чтобы убедиться в том, что она работает так, как задумано. РезюмеВ этом часе мы рассмотрели многочисленные и разнообразные средства тестирования и отладки приложений, предоставляемых VBA. Овладеть этими средствами необходимо любому программисту и разработчику приложений. Вопросы и ответыВопрос. Как можно выполнить только часть процедуры? Ответ. Установите точки останова в те строки кода, начиная с которых вы хотите остановить или приостановить выполнение процедуры. Вопрос. Почему лучше использовать наблюдаемые выражения вместо оператора Print в окне Immediate? Ответ. Преимущество наблюдаемых выражений перед просмотром в окне Immediate заключается в том, что их можно задать перед началом выполнения процедуры и они будут автоматически отслежены без прерывания самого процесса выполнения процедуры. Кроме того, можно одновременно задать несколько отслеживаемых выражений. ПрактикумС помощью тестов и упражнений вы проверите, насколько хорошо усвоили изложенный материал. Ответы на вопросы смотрите в Приложении. Тесты
УпражнениеСоздайте следующую процедуру:
Выполните процедуру и введите Ny в окно ввода. Используйте средства отладки и тестирования, описанные в этом часе, чтобы найти и исправить ошибки в процедуре. |
[an error occurred while processing this directive] |