Код за грешки във 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Край сИзлезте от функциятазавършване:КрайКрайна функция |