Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
курсовая / Источники / excel_2010_professionalnoe_programmirovanie_na_vba_RuLit_Me_412629.pdf
Скачиваний:
4
Добавлен:
27.09.2025
Размер:
22.97 Mб
Скачать

Глава 9. Работа с процедурами VBA

269

при вызове Process и передаче в качестве первого аргумента переменной типа String

отображается сообщение об ошибке ByRef argument type mismatch.

Примечание

Аргументы имеют как обычные процедуры, так и функции. На практике чаще всего аргументы используются функциями. Этот вид процедур рассматри­ вается в главе 10, где вы найдете дополнительные примеры использования аргументов в процедурах, а также описание необязательных аргументов.

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

Вы, конечно же, догадываетесь, что при выполнении процедуры VBA могут происхо­ дить ошибки: синтаксические (которые необходимо исправить перед тем, как выполнять процедуру) и ошибки выполнения (они происходят в процессе выполнения процедуры). В этом разделе рассматривается вторая группа ошибок.

©Для обработки ошибок отключите параметр Break on All Errors (Останав­ ливаться при любой ошибке). Для этого в окне редактора VBE выберите ко­ манду Tools^Options (Сервис«=>Параметры) и щелкните на вкладке General (Общие) в диалоговом окне Options (Параметры). Если параметр Break on All Errors установлен, VBA игнорирует код обработки ошибок. Поэтому обычно

используется параметр Break on Unhandled Errors (Останавливаться при не­ обработанных ошибках).Предупреждение

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

©Все коды ошибок VBA и их описания приведены в приложении В.Перекрестная ссылка

Перехват ошибок

Чтобы указать. программе, что должно произойти при возникновении ошибки, ис­ пользуется оператор On Error. Вы вправе выбрать один из двух вариантов.

Проигнорировать ошибку и позволить VBA продолжить выполнение про­ граммы. После этого можно проанализировать объект Err, чтобы узнать, какая ошибка произошла, и при необходимости принять меры для ее предотвращения.

Перейти к специальному разделу кода для обработки ошибок, чтобы выпол­ нить необходимые действия. Этот раздел вводится в конце процедуры и обозна­ чается специальной меткой.

272 Часть III. Visual Basic for Applications

Ниже приводится вариант кода, в котором конструкция On Error Resume Next предотвращает появление ошибки.

S ub S e le c t F o r m u la s 2 ()

 

On

E r r o r

Resum e N e x t

 

S e l e c t i o n . S p e c i a l C e l l s ( x l F o r m u l a s , x lN u m b e r s ) . S e le c t

 

On

E r r o r

G oTo 0

1

. . . [код]

 

E n d

Sub

 

Обратите внимание, что оператор On Error GoTo 0 восстанавливает нормальную обработку ошибок перед выходом из процедуры.

Следующая процедура использует дополнительный оператор для определения ре­ зультата: произошла ли ошибка.

Sub S e le c t F o r m u la s 2 ()

 

On

E r r o r Resum e

N e x t

 

S e le c t io n . S p e c i a l C e l l s ( x l F o r m u l a s , x lN u m b e r s ) . S e le c t

I f

E r r . N u m b e r =

1004

T h e n M sg B o x "He най ден ы я ч е й к и _

 

с ф о р м у л а м и ."

 

 

On

E r r o r G oTo 0

 

 

'. . . [код]

E n d Sub

Если свойство Number объекта Err не равно 0, происходит ошибка. С помощью оператора If проверяется, не равно ли свойство Err.Number 1004, и, если это так, отображается окно сообщения. В рассмотренном примере осуществляется проверка кода на предмет обнаружения ошибки с указанным номером. Если нужно найти все ошибки, используйте следующий оператор:

I f E r r . N u m b e r о 0 T h e n M sg B o x "П ро изош ла о ш и б к а ."

В следующем примере кода демонстрируется обработка ошибок путем перехода по метке.

Sub E r r o r D e m o ()

On

E r r o r G oTo H a n d le r

S e le c t io n . V a lu e = 123

E x i t

Sub

H a n d le r :

M sg B o x "Н ев о зм ож н о п р и с в о и т ь з н а ч е н и е в ы д е л ен н о м у д и а п а з о н у . " E n d Sub

В процедуре предпринимается попытка присвоить значение текущему выделенному объекту. Если происходит ошибка (например, не выделен диапазон ячеек или лист за­ щищен), то оператор присваивания выдает ошибку. Оператор On Error задает переход к метке Handler в случае ошибки. Обратите внимание, что перед меткой используется оператор Exit Sub. Программа обработки не выполняется, если ошибок не было. Этот оператор можно и не задавать — в результате сообщение будет отображаться даже в том случае, если ошибка не происходила.

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

Sub C h e c k F o r F i l e l ()

D im F ile N a m e A s S t r i n g

D im F i l e E x i s t s A s B o o le a n

D im b o o k A s W o rk b o o k

F ile N a m e = " BU D G ET . X L S X "

F i l e E x i s t s = F a ls e