Отладка макросов и пользовательских функций

•    Отладка программ при их разработке

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

Если вы успешно усвоили материал трех предыдущих глав, вы уже  имеете некоторое представление о работе с языком Visual Basic for Applications (VBA) и, возможно, хотели бы  углубить  свои  знания.   Хорошим  способом  совершенствоваться  в  любом  языке программирования является изучение текстов программ и экспериментирование с ними. Выполняя каждодневную работу в Excel,  проанализируйте ваши действия и подумайте, нельзя  ли  их  автоматизировать.  Когда  вы  найдете  такие  действия,  включите  запись макроса, а затем внимательно изучите получившийся код. Если в  тексте  макроса вам встретятся  незнакомые  ключевые  слова,  воспользуйтесь  справкой  VBA.  Когда  текст макроса станет для вас понятным, попробуйте сделать его более эффективным. Сначала удалите  те инструкции, которые кажутся вам излишними, и убедитесь, что их удаление действительно не влияет на работу макроса. Затем отыщите  инструкции, выделяющие диапазоны  или  другие  объекты,  и   попытайтесь,  где  это  возможно,  обойтись  без выделения, заменив эти инструкции другими.

При увеличении размеров и сложности создаваемых макросов и  функций иногда они просто не будут работать или будут давать совсем не тот результат, которого вы ожидали. С  подобными  проблемами  сталкиваются  не  только  начинающие  программисты,  но  и опытные «гуру». К счастью, при создании языка и редактора VBA разработчики встроили в них набор средств, облегчающих поиск и устранение  ошибок.  Эти средства и будут рассмотрены в данной главе.

Средства работы с ошибками делятся на два класса. Первый класс используется на стадии разработки, то есть во время создания и  редактирования программного кода, а второй класс — на стадии выполнения программы.

Отладка программ при их разработке

Средства   времени  разработки  редактора  VBA  дают   возможность   исправлять  синтаксические ошибки в инструкциях языка, а также обнаруживать неправильно записанные имена переменных. Кроме того,  редактор позволяет выполнять макрос или функцию в пошаговом режиме, демонстрируя изменение значений переменных.

Обнаружение синтаксических ошибок

При  вводе  некорректной  формулы  Excel  отказывается  принять  ее,   выдавая  предупреждение. Компилятор VBA (системный компонент, преобразующий инструкции VBA в машинный код) ведет себя аналогично по отношению к инструкциям. Например, если вы забыли  поставить  круглые  скобки  там,  где они  требуются,  компилятор  среагирует  на ошибку  сразу,  как  только  вы  нажмете  клавишу  Enter:  будет  выдано  пояснительное сообщение, а строка, содержащая ошибку, — выделена цветом (но умолчанию красным).

Но некоторые ошибки компилятор не в состоянии перехватить до  момента выполнения макроса или функции. Так, если вы введете код   <

With Selection.Border

.Weight = xlThin

.LineStyle = xlAutomatic

и  попробуете выполнить его в таком виде (без завершающей инструкции  End With),-то получите следующее сообщение:

Макрос  сгенерировал некую  ошибку выполнения 438  и   перешел  в  режим останова потому,  что  инструкция  For  Each  предполагает  работу  с  массивом или  семейством объектов, в то время как диаграмма не является ни тем ни другим (диапазон в терминах объектной  модели —   семейство  ячеек).  Автор  процедуры  LakhsCrores  мгновенно установит    причину данной   ошибки и     исправит ее,   однако    недоумение    других пользователей здесь вполне обоснованно.

Для того чтобы избавить  себя и  других от получения подобных  малоинформативных сообщений об ошибках, включите в макрос инструкцию On Error GoTo. Эта инструкция должна предшествовать фрагменту кода, потенциально представляющему собой источник ошибки во время  исполнения, и  записывается в виде On Error GoTo label, где label — имя  метки, указывающей на блок обработки ошибок. Если пользователь  столкнется с некорректной   работой   макроса,   инструкция On  Error   GoTo  передаст  управление обработчику ошибок. Применим ее к макросу LakhsCrores:

Sub  LakhsCroresQ Dim cell   as  Object

‘  Обработка ошибки,   вызванной некорректным выделением

On Error Goto Errorhandler

For  Each cell   In Selection

If Abs(cell.Value)   >  10000000 Then cell.NumberFormat =  "#"",""##"",""##"",""###" Elself

Abs(cell.Value)  >  100000 Then

cell.NumberFormat =  "#"",""##"",""###" End  If Next cell

‘   Инструкция Exit Sub обеспечивает  обычное  завершение

‘  макроса,   если ошибки  не  произошло

Exit  Sub

‘   Обработчик ошибок

Errorhandler:

MsgBox  "Необходимо выделить диапазон рабочего листа" End  Sub

Здесь при возникновении  ошибки управление  передается той инструкции,  на  которую указывает метка Errorhandler. После имени метки всегда следует двоеточие, а после него на этой же строке не должны присутствовать другие символы.

Перед обработчиком ошибок располагается инструкция перехода, в  данном  случае Exit Sub, которая обеспечивает возврат из  макроса при  нормальном завершении.  Если же произойдет сбой,  пользователь   получит   информативное сообщение, а  не  безликую ошибку 438.

Хотя  мы  справились  с  некорректным  выделением, это  далеко  не  все   принятые во внимание  проблемы.  Например, макрос  безошибочно  выполнится лишь тогда,  когда внутри выделенного диапазона содержатся исключительно  числа. Если же окажется, что диапазон помимо чисел  хранит  другие данные,  например ошибочное значение #Н/Д (#NA), то при выполнении макроса произойдет другая ошибка с номером 13, связанная с несоответствием  типов. Это означает, что такой обработчик ошибок не сумеет выручить нас в данной ситуации.

Нужно несколько усложнить алгоритм обработки ошибки и привлечь к рассмотрению ее идентификационный код. Значением свойства Number объекта Err всегда является номер последней ошибки времени выполнения  (0 при нормальном завершении).  Зная это, мы можем изменить обработчик так, чтобы отслеживались обе ошибки:

ErrorHandler:

If  Err.Number = 438 Then

MsgBox   "Необходимо выделить диапазон  рабочего листа"

Else

MsgBox   "Выделенный диапазон  не должен  содержать  значений ошибок"

End  If

Если же представить, что в данной ситуации могут произойти и другие неизвестные нам ошибки, то мы можем переписать обработчик следующим образом:

ErrorHandler:

If Err.Number = 438 Then

MsgBox "Необходимо выделить диапазон рабочего листа"

Else Else

MsgBox "Выделенный диапазон не должен содержать значений ‘Н/Д’" MsgBox "Неизвестная ошибка!"

End If

Конечно, и  такой обработчик не является совершенным, но все-таки он  берет в расчет основные потенциальные неприятности.

Все рассмотренные выше варианты создавались с целью заменить сообщение об ошибке VBA на более информативное, объясняющее пользователю причину сбоя в работе. Далее выполнение процедуры заканчивалось.

Возможно,   в   некоторых   ситуациях вы   захотите  вместо   завершения    процедуры продолжить ее выполнение. Тогда используйте инструкцию Resume или Resume Next. Первая передает управление инструкции, вызвавшей ошибку, а вторая — следующей за иструкцией —  источником   ошибки. Если вы  уверены,  что  возможные  ошибки не являются  критическими  для  работы  программы,  просто  игнорируйте   их  с  помощью инструкции   On  Error  Resume  Next.   Перепишем  макрос   LakhsCrores  с   учетом изложенного:

Sub LakhsCrores() Dim cell as Object

‘ Игнорируем любые ошибки выполнения

On Error Resume Next

For Each cell In Selection

If Abs(cell.Value) > 10000000 Then cell.NumberFormat = "#"",""##"",""##"",""###"

Elself Abs(cell.Value) > 100000 Then cell.NumberFormat = "#"",""##"",’"###"

End If Next cell End Sub

Теперь,   если  пользователь   выделит  диаграмму и    запустит  макрос,   ошибка  будет проигнорирована и макрос вообще не выполнит никаких действий. Если же пользователь выделит диапазон, содержащий одно  или  несколько  значений #Н/Д,  макрос  просто пропустит все ячейки,  которые  не сумеет отформатировать. Опять же без каких-либо сообщений. Подобное  решение является  идеальным для  программы  данного  уровня сложности.

Разумеется,  при использовании   инструкции  On  Error  Resume  Next  вы   полностью отключаете контроль ошибок выполнения со стороны VBA. Соответственно нужно быть полностью уверенным в безупречной работе  своей программы, а единственный способ добиться такой уверенности — это тщательно и многократно протестировать ее.

Установка Microsoft Excel

•   

Источник: Эффективная работа: Microsoft Office Excel 2003 / М. Додж, К. Стинсон — СПб.: Питер, 2005. — 1088 с: ил.

Похожие посты:

Вы можете оставить комментарий, или ссылку на Ваш сайт.

Оставить комментарий