VBA On Error - Грешки при обработка на най -добрите практики

Код за грешки във VBA

Грешки

ОписаниеVBA кодOn Error - Стоп код и грешка на дисплеяПри грешка Отидете на 0Грешка при включване - Пропуснете грешка и продължете да работитеНа грешка възобновяване следващоГрешка при включване - Отидете на ред код [Етикет]При грешка Отидете на [Етикет]Изчиства (нулира) грешкаПри грешка GoTo -1Показване на номер на грешкаMsgBox Err.NumberПокажи описание на грешкатаMsgBox Err. ОписаниеФункция за генериране на собствена грешкаГрешка Повдигнете

Вижте още VBA „Cheat Sheets“ и безплатно изтегляне на PDF

Обработка на грешки във VBA

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

Грешки при изпълнение на VBA са грешки, които възникват по време на изпълнение на кода. Примерите за грешки по време на изпълнение включват:

  • Позоваване на несъществуваща работна книга, работен лист или друг обект
  • Невалидни данни, напр. позовавайки се на клетка на Excel, съдържаща грешка
  • Опит за разделяне на нула

VBA относно изявление за грешка

Повечето обработки на VBA грешки се извършват с За изявление за грешка. Изразът On Error казва на VBA какво да прави, ако срещне грешка. Има три За изявленията за грешки:

  • При грешка GoTo 0
  • На грешка възобновяване следващо
  • При грешка GoTo Линия

При грешка GoTo 0

При грешка GoTo 0 е настройката по подразбиране на VBA. Можете да възстановите тази настройка по подразбиране, като добавите следния ред код:

1 При грешка GoTo 0

Когато възникне грешка с При грешка GoTo 0, VBA ще спре изпълнението на кода и ще покаже стандартното си поле за съобщение за грешка.

Често ще добавяте При грешка GoTo 0 след добавяне На грешка възобновяване следващо обработка на грешки (следващ раздел):

123456789 Sub ErrorGoTo0 ()На грешка възобновяване следващоActiveSheet.Shapes ("Start_Button"). ИзтриванеПри грешка GoTo 0„Пусни още кодEnd Sub

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

На грешка възобновяване следващо казва на VBA да пропусне всеки ред код, съдържащ грешки, и да премине към следващия ред.

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

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

Страхотно време за използване На грешка възобновяване следващо е, когато работите с обекти, които могат или не съществуват. Например, искате да напишете някакъв код, който ще изтрие форма, но ако стартирате кода, когато фигурата вече е изтрита, VBA ще изхвърли грешка. Вместо това можете да използвате На грешка възобновяване следващо да каже на VBA да изтрие формата, ако тя съществува.

123 На грешка възобновяване следващоActiveSheet.Shapes ("Start_Button"). ИзтриванеПри грешка GoTo 0

Забележете, че добавихме При грешка GoTo 0 след реда с код, съдържащ потенциалната грешка. Това нулира обработката на грешки.

В следващия раздел ще ви покажем как да тествате дали е възникнала грешка при използването Err.Number, давайки ви по -разширени опции за обработка на грешки …

Err.Number, Err.Clear и Catching Errors

Вместо просто да прескачаме ред, съдържащ грешка, можем да хванем грешката, като използваме На грешка възобновяване следващо и Err.Number.

Err.Number връща номер на грешка, съответстващ на вида на откритата грешка. Ако няма грешка, Err.Number = 0.

Например, тази процедура ще върне „11“, защото възникващата грешка е Грешка при изпълнение „11“.

1234567 Sub ErrorNumber_ex ()На грешка възобновяване следващоActiveCell.Value = 2/0MsgBox Err.NumberEnd Sub

Обработка на грешки с Err.Number

Истинската сила на Err.Number се крие в способността да се установи дали е възникнала грешка (Err.Number 0). В примера по -долу създадохме функция, която ще тества дали лист съществува с помощта на Err.Number.

12345678910111213141516171819 Sub TestWS ()MsgBox DoesWSExist ("тест")End SubФункцията има WSExist (wsName As String) като булеваЗатъмнете като работен листНа грешка възобновяване следващоЗадайте ws = Таблици (wsName)„Ако грешка WS не съществуваАко Err.Number 0 ТогаваDoesWSExist = FalseИначеDoesWSExist = ИстинаКрай АкоПри грешка GoTo -1Крайна функция

Забележка: Добавихме a При грешка GoTo -1 до края, който нулира Err.Number до 0 (вижте два раздела надолу).

С На грешка възобновяване следващо и Err.Number, можете да копирате "Опитай да хванеш" функционалност на други езици за програмиране.

При грешка GoTo Линия

При грешка GoTo Линия казва на VBA да „отиде на“ обозначен ред код, когато възникне грешка. Декларирате инструкцията Go To по следния начин (където errHandler е етикетът на реда, към който да отидете):

1 On Error GoTo errHandler

и създайте етикет на линия по следния начин:

1 errHandler:

Забележка: Това е същият етикет, който бихте използвали с обикновена VBA GoTo инструкция.

По -долу ще демонстрираме използването При грешка GoTo Линия да излезете от процедура.

При излизане на грешка Sub

Можете да използвате On Error GoTo Line, за да излезете от подкана, когато възникне грешка.

Можете да направите това, като поставите етикета на реда за манипулатор на грешки в края на вашата процедура:

12345678 Sub ErrGoToEnd ()При грешка GoTo endProc- Някакъв кодексendProc:End Sub

или чрез командата Exit Sub:

123456789101112131415 Sub ErrGoToEnd ()При грешка GoTo endProc- Някакъв кодексОтидете на skipExitendProc:Изход от SubskipExit:- Още малко кодEnd Sub

Err.Clear, On Error GoTo -1 и Нулиране на Err.Number

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

След възникване на грешка, и двете Err.Clear и При грешка GoTo -1 може да се използва за нулиране Err.Number до 0. Но има една много важна разлика: Err.Clear не нулира самата действителна грешка, а само нулира Err.Number.

Какво означава това? ИзползвайкиErr.Clear, няма да можете да промените настройката за обработка на грешки. За да видите разликата, тествайте този код и го заменете При грешка GoTo -1 с Err.Clear:

123456789101112131415161718192021 Sub ErrExamples ()При грешка GoTo errHandler:Грешка „Дефинирано от приложението“Грешка (13)Изход от SuberrHandler:„Изчистване на грешкаПри грешка GoTo -1При грешка GoTo errHandler2:Грешка „Тип несъответствие“Грешка (1034)Изход от SuberrHandler2:Debug.Print Err. ОписаниеEnd Sub

Обикновено препоръчвам винаги да се използва При грешка GoTo -1, освен ако нямате основателна причина да използвате Err.Clear вместо.

VBA при грешка MsgBox

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

12345678910111213141516171819202122232425262728 Sub ErrorMessageEx ()Dim errMsg As StringOn Error GoTo errHandler'Етап 1errMsg = "Възникна грешка по време на етапа Copy & Paste."'Err.Raise (11)„Етап 2errMsg = "Възникна грешка по време на етапа на валидиране на данните."'Err.Raise (11)„Етап 3errMsg = "Възникна грешка по време на етапа на P & L изграждане и копиране."Грешка Повдигане (11)„Етап 4errMsg = "Възникна грешка при опит за регистриране на импортирането на страницата за настройка"'Err.Raise (11)Отидете до endProcerrHandler:MsgBox errendProc:End Sub

Тук бихте заменили Err.Raise (11) с вашия действителен код.

VBA IsError

Друг начин за справяне с грешките е да ги тествате с функцията VBA IsError. Функцията IsError тества израз за грешки, връщайки TRUE или FALSE, ако възникне грешка.

123 Sub IsErrorEx ()MsgBox IsError (Обхват ("a7"). Стойност)End Sub

Ако грешка VBA

Можете също да обработвате грешки във VBA с функцията Excel IfError. Функцията IfError трябва да бъде достъпна чрез Работен лист Функционален клас:

1234567 Sub IfErrorEx ()Dim n As Longn = WorksheetFunction.IfError (Диапазон ("a10"). Стойност, 0)MsgBox nEnd Sub

Това ще изведе стойността на диапазон A10, ако стойността е грешка, тя ще изведе 0.

Видове грешки VBA

Грешки по време на работа

Както бе посочено по -горе:

Грешки при изпълнение на VBA са грешки, които възникват по време на изпълнение на кода. Примерите за грешки по време на изпълнение включват:

  • Позоваване на несъществуваща работна книга, работен лист или друг обект
  • Невалидни данни, напр. позовавайки се на клетка на Excel, съдържаща грешка
  • Опит за разделяне на нула

Можете да „обработвате грешки“ по време на изпълнение на грешки, като използвате методите, обсъдени по -горе.

Грешки в синтаксиса

Грешки в синтаксиса на VBA са грешки при писане на код. Примерите за синтаксични грешки включват:

  • Грешно изписване
  • Липсващи или неправилни пунктуационни знаци

VBA Editor идентифицира много синтаксични грешки с червено подчертаване:

VBA Editor също има опция за „Автоматична проверка на синтаксиса“:

Когато това е отметнато, VBA Editor ще генерира поле за съобщение, предупреждаващо ви за синтаксични грешки, след като въведете ред код:

Аз лично намирам това за изключително досадно и деактивирам функцията.

Грешки при компилиране

Преди да се опита да стартира процедура, VBA ще „компилира“ процедурата. Компилирането трансформира програмата от изходния код (който можете да видите) в изпълнима форма (не можете да видите).

Грешки при компилиране на VBA са грешки, които пречат на компилирането на кода.

Добър пример за грешка при компилиране е липсващата декларация на променлива:

Други примери включват:

  • За без Следващия
  • Изберете без Край Изберете
  • Ако без Край Ако
  • Извикване на a процедура това не съществува

Синтаксични грешки (предишен раздел) са подмножество на грешки при компилиране.

Отстраняване на грешки> Компилиране

Грешки при компилиране ще се появят, когато се опитате да изпълните процедура. Но в идеалния случай бихте идентифицирали грешки при компилиране, преди да опитате да изпълните процедурата.

Можете да направите това, като съставите проекта предварително. За да направите това, отидете на Отстраняване на грешки> Компилиране на VBA проект.

Компилаторът ще "отиде" на първата грешка. След като коригирате тази грешка, компилирайте проекта отново. Повторете, докато всички грешки бъдат отстранени.

Можете да кажете, че всички грешки са поправени, защото Компилирайте VBA проект ще бъде затъмнено:

Грешка при преливане

The Грешка при преливане на VBA възниква, когато се опитате да поставите стойност в твърде голяма променлива. Например, Целочислени променливи може да съдържа само стойности между -32,768 до 32,768. Ако въведете по -голяма стойност, ще получите грешка при препълване:

Вместо това трябва да използвате Дълга променлива за съхраняване на по -големия брой.

Други условия за грешка на VBA

Грешка при улавяне на VBA

За разлика от други езици за програмиране, във VBA няма Декларация за улов. Можете обаче да копирате декларация за улов, като използвате На грешка възобновяване следващо и Ако Err.Number 0 Тогава. Това е разгледано по -горе в „Обработка на грешки“ с Err.Number.

Грешка при игнориране на VBA

За да игнорирате грешките във VBA, просто използвайте На грешка възобновяване следващо изявление:

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

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

Грешка при изхвърляне на VBA / Err.Raise

За да извършите грешка във VBA, използвате Грешка Повдигнете метод.

Този ред код ще повиши грешка при изпълнение „13“: Несъответствие на типа:

1 Грешка Повдигане (13)

Превключване на грешки във VBA

Превключване на грешки във VBA е просто друг термин за VBA Error Handling.

Съобщение за грешка VBA

А Съобщение за грешка VBA изглежда така:

Когато щракнете върху „Отстраняване на грешки“, ще видите реда с код, който изхвърля грешката:

Обработка на грешки във VBA в цикъл

Най -добрият начин за обработка на грешки в рамките на цикъл е чрез използване На грешка възобновяване следващо заедно с Err.Number за да откриете дали е възникнала грешка (Не забравяйте да използвате Err.Clear за изчистване на грешката след всяко възникване).

Примерът по -долу ще раздели две числа (колона А от колона В) и ще изведе резултата в колона В. Ако има грешка, резултатът ще бъде 0.

12345678910111213141516 Подтест ()Затъмняване на клетката като обхватНа грешка възобновяване следващоЗа всяка клетка в обхвата ("a1: a10")'Задайте стойност на клеткатаcell.Offset (0, 2) .Value = cell.Value / cell.Offset (0, 1) .Value"Ако Cell.Value е грешка, тогава по подразбиране 0Ако Err.Number 0 Тогаваизместване (0, 2). Стойност = 0Err.ClearКрай АкоСледващияEnd Sub

Обработка на грешки на VBA в Access

Всички горепосочени примери работят абсолютно същото в Access VBA като в Excel VBA.

123456789101112131415161718 Функция DelRecord (frm като форма)'тази функция се използва за изтриване на запис в таблица от формулярПри грешка GoTo завършваС фрмАко .NewRecord Тогава.ОтмянаИзлезте от функциятаКрай АкоКрай сС frm.RecordsetClone. Bookmark = frm. Bookmark.Изтрийfrm.RequeryКрай сИзлезте от функциятазавършване:КрайКрайна функция

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

wave wave wave wave wave