VBA On Error Resume Next или Goto 0

Този урок ще обясни VBA On Error Resume Next и Goto Statement.

Дори когато вашият код е перфектно конструиран, потребителят може да не постъпи както бихте очаквали. Поради тази причина трябва да вмъкнете манипулатори на грешки в кода си винаги, когато може да има причина да възникне грешка.

На грешка възобновяване следващо

Операторът On Error Resume Next казва на VBA да пропусне всички редове с код, съдържащ грешки, и да премине към следващия ред. VBA ще игнорира реда или редовете с грешка в него и ще премине към следващия ред код.

Това е полезно, когато редът код, който може да бъде пренебрегнат, не е от решаващо значение за успешното изпълнение на макроса, но може да бъде доста опасен, ако се използва неправилно, тъй като може да даде неволни резултати.

Например в процедурата по -долу:

123456 Sub HideAllSheets ()Затъмнете като работен листЗа всеки ws в ActiveWorkbook.Sheetsws.Visible = FalseСледващата wsEnd Sub

Ако изпълним този код, ще получим грешка, тъй като не можем да скрием всички работни листове в работна книга - поне една работна книга трябва да остане видима.

Ако обаче променим процедурата, както е показано по -долу, кодът ще продължи след грешката и ще остави последния лист в работната книга видим.

1234567 Sub HideAllSheets ()На грешка възобновяване следващоЗатъмнете като работен листЗа всеки ws в ActiveWorkbook.Sheetsws.Visible = FalseСледващата wsEnd Sub

При грешка GoTo 0

Ако нямаме манипулатор на грешки в нашия код, При грешка Отидете на 0 е настройката по подразбиране на Excel. Това основно означава, че когато възникне грешка с При грешка GoTo 0, VBA ще спре изпълнението на кода и ще покаже стандартното си поле за съобщение за грешка, например:

Ако сме поставили капан за грешки като На грешка възобновяване следващо в нашия код, но след това искаме да зададем грешката по подразбиране, можем да вмъкнем При грешка Отидете на 0 ред в нашия код.

12345678910 Sub ErrorGoTo0 ()На грешка възобновяване следващоЗатъмнете като работен листЗа всеки ws в ActiveWorkbook.Sheetsws.Visible = FalseСледващата wsПри грешка GoTo 0'Пуснете още код тук например:ActiveSheet.Name = "Лист1"End Sub

Сега, ако трябваше да има грешка в кода ни след При грешка Отидете на 0 линия, ще се появи съобщение за грешка по подразбиране за Excel. В този пример вече имаме лист с име Sheet1 в ActiveWorkbook като код над При грешка Отидете на 0 скрива листа, но не го изтрива. След това ще се покаже съобщението за грешка в Excel по подразбиране, което показва, че името на листа вече е заето.

При грешка Отиди на Линия

Можем също така да принудим нашия код да се премести в друг ред код, като използваме При грешка Отидете Линия който казва на VBA да отиде в определен ред код, ако възникне грешка.

123456789101112 Sub ErrorGoToLine ()На грешка възобновяване следващоЗатъмнете като работен листЗа всеки ws в ActiveWorkbook.Sheetsws.Visible = FalseСледващата wsOn Error GoTo errhandlerActiveSheet.Name = "Лист1"Изход от SubErrhandler:MsgBox ("Вече има лист, наречен лист1!", VbCritical)End Sub

В горния пример, когато кодът намери листа „Sheet1“, той се премества в реда на кода под етикета на манипулатора на грешки - в този случай той извиква персонализирано поле за съобщение, информиращо потребителите, че листът вече излиза. Етикетът за обработка на грешки трябва да има двоеточие след него, за да покаже на VBA, че е етикет.

1 Errhandler:

След това кодът ще скочи надолу до реда под етикета и ще върне полето за персонализирано съобщение.

Това е полезно, когато не искате потребителят ви да може да щракне върху Отстраняване на грешки, за да влезе във вашия код, тъй като стандартното съобщение в Excel винаги дава опция за отстраняване на грешки в кода.

Нуждаем се и от Изход от Sub в процедурата. Ако има НЕ лист, наречен Sheet1, тогава този ред код ще се изпълни и ще преименува активния лист на Sheet1. След това искаме кодът да приключи - не искаме да го пренася в манипулатора на грешки и да показва полето със съобщение. След това редът Exit Sub излиза от процедурата и спира кода.

Така ще помогнете за развитието на сайта, сподели с приятелите си

wave wave wave wave wave