Ключ к отладке программы кроется в режиме паузы VBA. Режим паузы - это временная остановка выполнения программы на некотором операторе в программном коде. Поскольку в этом случае программа еще ''живет", вы получаете возможность проверить текущие значения всех ее переменных. Кроме того, начиная с этого момента, вы получаете возможность использовать команды Step, чтобы продолжить выполнение программы в пошаговом режиме, по одному оператору за шаг, и наблюдать за соответствующими изменениями значений переменных при этом будет видно, получают переменные ожидаемые значения или нет.
Подробности такой работы с переменными и командами Step будут рассматриваться в этой главе позже.
На рис. 9.1 показан вид окна редактирования VBA-процедуры в режиме паузы. Если не считать желтой подсветки строки и стрелки на поле слева, указывающей на оператор, который должен выполняться следующим, то это окно редактора Visual Basic выглядит практически так же, как и при обычном редактировании программного кода.
Рис. 9.1. Процедура VBA в режиме паузы
На самом деле, в режиме паузы вы можете редактировать свой программный код прямо во время выполнения программы, внося изменения и добавляя совершенно новые строки программного кода по необходимости или по своему желанию. Это предусмотрено не для забавы - это очень удобное средство отладки, преимуществами которого нужно обязательно научиться пользоваться (подробнее об этом - ниже, в разделе "Добавление и редактирование программного кода в режиме паузы").
Вход в режим паузы
Имеется целый ряд возможностей для перевода программы в режим паузы, который можно сравнить со стоп-кадром анимации.
* Запуск программы сразу в режиме паузы с помощью команды Step Into (см. ниже раздел "Сквозь программу по шагам").
* Назначение точки останова строке программного кода. После того как программа при выполнении дойдет до оператора, с которым связана точка останова, выполнение прервется, и программа перейдет в режим паузы.
* Помещение в программный код оператора Stop. После выполнения этого оператора программа переходит в режим паузы, приготовившись продолжить выполнение с оператора, следующего за оператором Stop.
* Щелчок на кнопке Break (Пауза), выбор Run=Break из меню или нажатие комбинации клавиш
* Создание контролируемых переменных типа Break When Value Is True (стоп при значении Истина) или Break When Value Changes (стоп при изменении значения). Тогда программа перейдет в режим паузы, как только значение контролируемой перемен1 ной станет равным True или как только ее значение изменится.
По-другому программа может перейти в режим паузы, когда возникает ошибка выполнения. VBA отображает диалоговое окно с описанием возникшей ошибки (рис. 9.2). В этом окне щелчок на кнопке End (Закончить) останавливает выполнение программы совсем, а щелчок на кнопке Debug (Отладка) переводит выполнение программы в режим паузы. На вкладке General (Общие) диалогового окна Tools=Options вам предоставляются некоторые возможности для выбора круга тех ошибок, появление которых должно останавливать выполнение программы.
Рис. 9.2. Диалоговое окно, сообщающее об ошибке выполнения
Размещение точек останова в программе
Если есть подозрение, что ошибка содержится в каком-то конкретном сегменте программного кода, поместите точку останова как раз перед этим сегментом. На рис. 9.3 видно, как редактор Visual Basic представляет точку останова на экране - в виде довольно жирной точки на полях в окне редактирования.
Рис. 9.3. При назначении точки останова редактор Visual Basic подсвечивает строку программного кода, перед которой должно остановиться выполнение программы
После того как точка останова размещена, вы имеете возможность выполнить программу на полной скорости вплоть до этой точки, пропустив отладку той части программного кода, которая (как вы надеетесь) не содержит ошибок. Когда VBA доберется до оператора, которому назначена точка останова, выполнение программы приостановится. В режиме паузы вы сможете проверить значения переменных и с помощью команд Step проследить за тем, как эти значения меняются при последовательном выполнении каждого из операторов в подозрительном блоке.