Обработка на грешки в Excel VBA - Всичко, което трябва да знаете!

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

Разликата между начинаещ и експерт VBA програмист е, че експертите програмисти знаят как да се справят ефективно и да използват грешки.

В този урок ще ви покажа различни начини, които можете да използвате за ефективно справяне с грешките в Excel VBA.

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

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

В Excel VBA има четири вида грешки:

  1. Синтаксични грешки
  2. Грешки при компилация
  3. Грешки при изпълнение
  4. Логически грешки

Нека бързо разберем какви са тези грешки и кога е вероятно да ги срещнете.

Синтактична грешка

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

Например, ако забравите необходимата част от израза/синтаксиса, тогава ще видите грешката при компилирането.

В кода по -долу, веднага щом натисна enter след втория ред, виждам грешка при компилиране. Това е така, защото IF изявление трябва да има „Тогава‘Команда, която липсва в кода по -долу.

Забележка: Когато въвеждате код в Excel VBA, той проверява всяко изречение веднага щом натиснете Enter. Ако VBA открие, че нещо липсва в синтаксиса, той незабавно показва съобщение с някакъв текст, който може да ви помогне да разберете липсващата част.

За да сте сигурни, че виждате синтаксичната грешка, когато нещо липсва, трябва да се уверите, че проверката на Autosyntax е активирана. За да направите това, кликнете върху „Инструменти“ и след това върху „Опции“. В диалоговия прозорец с опции се уверете, че опцията „Автоматична проверка на синтаксиса“ е активирана.

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

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

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

Например, в кода по -долу, веднага щом се опитам да стартирам кода, той ще покаже следната грешка. Това се случва, тъй като използвах оператора IF Then, без да го затварям със задължителното „End If“.

Синтаксична грешка също е вид грешка при компилиране. Синтаксична грешка възниква веднага щом натиснете enter и VBA идентифицира, че нещо липсва. Грешка при компилиране може да възникне и когато VBA не открие нищо липсващо при въвеждане на кода, но се случва, когато кодът е компилиран или изпълнен.

VBA проверява всеки ред, докато въвеждате кода, и подчертава синтактичната грешка веднага щом редът е неправилен и натиснете Enter. Грешките при компилиране, от друга страна, се идентифицират само когато целият код се анализира от VBA.

По -долу са някои сценарии, при които ще срещнете грешка при компилиране:

  1. Използване на IF декларация без End IF
  2. Използване на израза For с Next
  3. Използване на оператора Select без използване на End Select
  4. Недеклариране на променливата (това работи само когато е активирана опция Explicit)
  5. Извикване на под/функция, която не съществува (или с грешни параметри)
Забележка за „Опция явна“: Когато добавите „Option Explicit“, ще трябва да декларирате всички променливи, преди да стартирате кода. Ако има някаква променлива, която не е декларирана, VBA ще покаже грешка. Това е добра практика, тъй като показва грешка в случай, че имате грешно написана променлива. Можете да прочетете повече за Option Explicit тук.

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

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

Грешките по време на изпълнение ще възникнат само когато се погрижат за всички грешки в синтаксиса и компилацията.

Например, ако стартирате код, който трябва да отвори работна книга на Excel, но тази работна книга е недостъпна (изтрита или променено име), кодът ви ще ви даде грешка по време на изпълнение.

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

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

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

Ако сте коригирали грешката, можете да кликнете върху бутона Изпълнение в лентата с инструменти (или да натиснете F5), за да продължите да изпълнявате кода от мястото, където е останал.

Или можете също да кликнете върху бутона Край, за да излезете от кода.

Важно: В случай, че щракнете върху бутона Край в диалоговия прозорец, той ще спре кода на реда, в който се среща. Всички редове на кода преди това обаче биха били изпълнени.

Логически грешки

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

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

Един пример за логическа грешка (с която често се забивам) е да се сблъска с безкраен цикъл.

Друг пример може да бъде, когато дава резултат, който е грешен. Например, може да използвате грешна променлива в кода или да добавите две променливи, когато едната е неправилна.

Има няколко начина, по които се справям с логическите грешки:

  1. Вмъкнете полето за съобщения на някое място в кода и маркирайте стойности/данни, които могат да помогнат да се разбере дали всичко върви според очакванията.
  2. Вместо да изпълнявате кода наведнъж, преминете през всеки ред един по един. За да направите това, щракнете навсякъде в кода и натиснете F8. ще забележите, че всеки път, когато натиснете F8, се изпълнява един ред. Това ви позволява да преминете през кода един ред по ред и да идентифицирате логическите грешки.

Използване на отстраняване на грешки за намиране на грешки при компилиране/синтаксис

След като приключите с кода, добра практика е първо да го компилирате, преди да стартирате.

За да компилирате код, щракнете върху опцията Debug в лентата с инструменти и щракнете върху Compile VBAProject.

Когато компилирате VBA проект, той преминава през кода и идентифицира грешки (ако има такива).

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

Когато кодът ви е без грешки, опцията Compile VBAProject ще бъде затъмнена.

Имайте предвид, че компилирането ще намери само грешки „Синтаксис“ и „Компилиране“. Той НЕ ще намери грешки по време на изпълнение.

Когато пишете VBA код, не искате грешките да се появяват. За да избегнете това, можете да използвате много методи за обработка на грешки.

В следващите няколко раздела на тази статия ще разгледам методите, които можете да използвате за обработка на VBA грешки в Excel.

Конфигуриране на настройките за грешки (обработени срещу необработени грешки)

Преди да започнете работа с кода си, трябва да проверите за една настройка в Excel VBA.

Отидете на лентата с инструменти на VBA и щракнете върху Инструменти и след това върху Опции.

В диалоговия прозорец Опции щракнете върху раздела Общи и се уверете, че в групата „Премахване на грешки“ е поставена отметка „Прекъсване при необработени грешки“.

Нека обясня трите варианта:

  1. Прекъсване при всички грешки: Това ще спре кода ви за всички видове грешки, дори когато сте използвали техниките за справяне с тези грешки.
  2. Модул Прекъсване в клас: Това ще спре кода ви при всички необработени грешки и в същото време, ако използвате обекти като Userforms, той също ще се разбие в тези обекти и ще подчертае точната линия, причиняваща грешката.
  3. Прекъсване на необработени грешки: Това ще спре кода ви само за тези грешки, които не се обработват. Това е настройката по подразбиране, тъй като гарантира, че всички необработени грешки са известни. Ако използвате обекти като Userforms, това няма да подчертае реда, причиняващ грешката в обекта, а само ще подчертае реда, който се отнася до този обект.
Забележка: Ако работите с обекти като потребителски форми, можете да промените тази настройка на „Прекъсване на модулите на класа“. Разликата между #2 и #3 е, че когато използвате Break in Class Module, той ще ви отведе до конкретния ред в обекта, който причинява грешката. Можете също да изберете да използвате това вместо „Прекъсване при необработени грешки“.

Така че накратко - ако току -що започвате с Excel VBA, уверете се, че е поставена отметка „Прекъсване при необработени грешки“.

Обработка на грешки във VBA с изявления „Грешка при включване“

Когато вашият код срещне грешка, можете да направите няколко неща:

  1. Игнорирайте грешката и оставете кода да продължи
  2. Поставете код за обработка на грешки и го стартирайте, когато възникне грешка

И двата метода за обработка на грешки гарантират, че крайният потребител няма да види грешка.

Има няколко изявления „Грешка при включване“, които можете да използвате, за да направите това.

Вкл. Грешка Възобновяване Напред

Когато използвате „On Error Resume Next“ във вашия код, всяка срещана грешка ще бъде игнорирана и кодът ще продължи да работи.

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

Например, ако кодът по -долу е изпълнен, той ще върне грешка.

Sub AssignValues ​​() x = 20 /4 y = 30 /0 End Sub

Това се случва, защото не можете да разделите число на нула.

Но ако използвам израза „On Error Resume Next“ в този код (както е показано по -долу), той ще игнорира грешката и няма да знам, че има проблем, който трябва да бъде коригиран.

Sub AssignValues ​​() On Error Resume Next x = 20 /4 y = 30 /0 End Sub

On Error Resume Next трябва да се използва само когато ясно знаете какъв вид грешки се очаква да изхвърли вашият VBA код и е добре да го игнорирате.

Например по -долу е кодът на събитието VBA, който незабавно би добавил стойността на датата и часа в клетка A1 на ново вмъкнат лист (този код се добавя в работния лист, а не в модул).

Private Sub Workbook_NewSheet (ByVal Sh As Object) Sh.Range ("A1") = Format (Now, "dd-mmm-yyyy hh: mm: ss") End Sub

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

Така че, ако използвам израза „On Error Resume Next“ в този код, той ще работи според очакванията с работни листове и няма да прави нищо с листове с диаграми.

Private Sub Workbook_NewSheet (ByVal Sh As Object) On Error Resume Next Sh.Range ("A1") = Format (Now, "dd-mmm-yyyy hh: mm: ss") End Sub

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

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

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

Private Sub Workbook_NewSheet (ByVal Sh As Object) On Error Resume Next Sh.Range ("A1") = Format (Now, "dd-mmm-yyyy hh: mm: ss") Ако Err.Number 0 Тогава MsgBox "Изглежда като вас вмъкна лист с диаграма "& vbCrLf &" Грешка - "& Err. Описване Край, ако End Sub

„Err.Number“ се използва за получаване на номера на грешката, а „Err.Description“ се използва за получаване на описанието на грешката. Те ще бъдат разгледани по -късно в този урок.

При грешка GoTo 0

„On Error GoTo 0“ ще спре кода в реда, който причинява грешката, и ще покаже поле със съобщение, което описва грешката.

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

Тогава защо дори да го използвате?

Обикновено не е необходимо да използвате „On Error Goto 0“, но може да бъде полезно, когато го използвате заедно с „On Error Resume Next“

Нека обясня!

Кодът по -долу би избрал всички празни клетки в селекцията.

Sub SelectFormulaCells () Selection.SpecialCells (xlCellTypeBlanks). Изберете End Sub

Но ще покаже грешка, когато в избраните клетки няма празни клетки.

Така че, за да избегнете показването на грешката, можете да използвате On Error Resume next ’

Сега той също ще покаже всяка грешка, когато стартирате кода по -долу:

Sub SelectFormulaCells () On Error Resume Next Selection.SpecialCells (xlCellTypeBlanks), Изберете End Sub

Дотук добре!

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

Например в кода по -долу няма да има подкана за грешка:

Sub SelectFormulaCells () On Error Resume Next Selection.SpecialCells (xlCellTypeBlanks). Изберете '… още код, който може да съдържа грешка End Sub

В горния код има две места, където може да възникне грешка. Първото място е мястото, където избираме всички празни клетки (използвайки Selection.SpecialCells), а второто е в останалия код.

Въпреки че се очаква първата грешка, всяка грешка след това не е.

Тук On Error Goto 0 идва на помощ.

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

Например в кода по -долу няма да има грешка в случай, че няма празни клетки, но ще има подкана за грешка поради '10/0 ′

Sub SelectFormulaCells () On Error Resume Next Selection.SpecialCells (xlCellTypeBlanks). Изберете On Error GoTo 0 '… още код, който може да съдържа грешка End Sub

При грешка Отидете на [Етикет]

Горните два метода - „On Error Resume Next“ и „On Error Goto 0“ - не ни позволяват наистина да се справим с грешката. Единият кара кода да игнорира грешката, а вторият възобновява проверката на грешките.

On Error Go [Label] е начин, с който можете да посочите какво искате да направите в случай, че кодът ви има грешка.

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

Sub Test () On Error GoTo Label: X = 10 /0 „този ред причинява грешка“ …. Оставащият ви код отива тук Exit Sub Label: „код за обработка на грешката End Sub

Обърнете внимание, че преди грешката при обработка на „Label“, има Sub Exit. Това гарантира, че в случай, че няма грешки, подзаписът се излиза и кодът „Label“ не се изпълнява. В случай, че не използвате Exit Sub, той винаги ще изпълнява кода „Label“.

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

Sub Errorhandler () On Error GoTo ErrMsg X = 12 Y = 20 /0 Z = 30 Изход от Sub ErrMsg: MsgBox "Изглежда, че има грешка" & vbCrLf & Err.

Обърнете внимание, че когато възникне грешка, кодът вече е изпълнил и изпълнил редовете преди реда, който причинява грешката. В горния пример кодът задава стойността на X като 12, но тъй като грешката възниква в следващия ред, не задава стойностите за Y и Z.

След като кодът прескочи до кода на манипулатора на грешки (ErrMsg в този пример), той ще продължи да изпълнява всички редове в и под кода на манипулатора на грешки и да излезе от подтока.

При грешка Отидете на -1

Това е малко сложно и в повечето случаи е малко вероятно да го използвате.

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

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

Да предположим, че имате код, при който се среща грешка. Но всичко е наред, тъй като имате един манипулатор на грешки. Но какво се случва, когато има друга грешка в кода за обработка на грешки (да … донякъде като началния филм).

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

В този сценарий можете да използвате On Error Goto -1.

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

Стига приказки!

Нека обясня сега с помощта на примери.

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

Sub Errorhandler () X = 12 Y = 20 /0 Z = 30 End Sub

За да се справя, използвам код за обработка на грешки (с името ErrMsg), както е показано по -долу:

Sub Errorhandler () On Error GoTo ErrMsg X = 12 Y = 20 /0 Z = 30 Изход от Sub ErrMsg: MsgBox "Изглежда, че има грешка" & vbCrLf & Err.

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

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

Sub Errorhandler () On Error GoTo ErrMsg X = 12 Y = 20 /0 Z = 30 Изход от Sub ErrMsg: MsgBox "Изглежда, че има грешка" & vbCrLf & Err. Описание A = 10 /2 B = 35 /0 End Sub

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

Все пак всичко е наред. Кодът се държи така, както очаквахме.

За да се справя с втората грешка, използвам друг манипулатор на грешки (ErrMsg2).

Sub Errorhandler () On Error GoTo ErrMsg X = 12 Y = 20 /0 Z = 30 Изход Sub ErrMsg: MsgBox "Изглежда, че има грешка" & vbCrLf & Err. Описание при грешка GoTo ErrMsg2 A = 10 /2 B = 35 / 0 Exit Sub ErrMsg2: MsgBox "Изглежда отново има грешка" & vbCrLf & Err.

И тук е мястото не работи според очакванията.

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

Това се случва, тъй като не изчистихме първата грешка от паметта на VBA.

Да, справихме се! Но все още остава в паметта.

И когато VBA срещне друга грешка, тя все още е заседнала с първата грешка и следователно вторият манипулатор на грешки не се използва. Кодът спира на реда, който е причинил грешката, и показва подканата за грешка.

За да изчистите паметта на VBA и да изчистите предишната грешка, трябва да използвате „On Error Goto -1“.

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

Sub Errorhandler () On Error GoTo ErrMsg X = 12 Y = 20 /0 Z = 30 Излезте от Sub ErrMsg: MsgBox "Изглежда, че има грешка" & vbCrLf & Err. Описание При грешка GoTo -1 При грешка GoTo ErrMsg2 A = 10 / 2 B = 35 /0 Изход Sub ErrMsg2: MsgBox "Изглежда отново има грешка" & vbCrLf & Err.
Забележка: Грешката автоматично се изчиства, когато подпрограма приключи.Така че „On Error Goto -1“ може да бъде полезен, когато получавате две или повече от две грешки в една и съща подпрограма.

Обектът Err

Когато възникне грешка с код, обектът Err се използва за получаване на подробности за грешката (като номера на грешката или описанието).

Err Свойства на обекта

Обектът Err има следните свойства:

Имот Описание
Номер Число, което представлява вида на грешката. Когато няма грешка, тази стойност е 0
Описание Кратко описание на грешката
Източник Име на проекта, в който е възникнала грешката
HelpContext Идент. № на контекста на помощ за грешката във файла за помощ
HelpFile Низ, който представлява местоположението на папката и името на файла на помощния файл

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

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

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

Sub FindSqrRoot () Dim rng As Range Set rng = Избор за всяка клетка в rng клетка. Offset (0, 1) .Value = Sqr (cell.Value) Следваща клетка End Sub

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

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

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

Sub FindSqrRoot () Dim rng As Range Set rng = Избор за всяка клетка In rng On Грешка GoTo ErrHandler cell.Offset (0, 1) .Value = Sqr (cell.Value) Следваща клетка ErrHandler: MsgBox "Номер на грешка:" & Err .Number & vbCrLf & _ "Описание на грешката:" & Err.Description & vbCrLf & _ "Грешка в:" & cell.Address End Sub

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

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

Кодът по -долу ще направи това:

Sub FindSqrRoot2 () Dim ErrorCells As String Dim rng As Range On Error Resume Next Set rng = Избор за всяка клетка в rng cell.Offset (0, 1) .Value = Sqr (cell.Value) Ако Err.Number 0 Тогава ErrorCells = ErrorCells & vbCrLf & cell.Address On Error GoTo -1 End If Next клетка MsgBox „Грешка в следните клетки“ & ErrorCells Изход от Sub End Sub

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

Err Object Methods

Въпреки че свойствата на Err са полезни за показване на полезна информация за грешките, има и два метода Err, които могат да ви помогнат при обработката на грешки.

Метод Описание
Ясно Изчиства всички настройки на свойствата на Err обекта
Повдигнете Генерира грешка по време на изпълнение

Нека бързо научим какво са това и как/защо да ги използваме с VBA в Excel.

Err Clear Method

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

Следният код ще получи квадратните корени на всички числа в съседната колона и ще покаже съобщение, че е възникнала грешка за клетки A5 и A9 (тъй като те имат текст в нея).

Sub FindSqrRoot2 () Dim ErrorCells As String Dim rng As Range On Error Resume Next Set rng = Избор за всяка клетка в rng cell.Offset (0, 1) .Value = Sqr (cell.Value) Ако Err.Number 0 Тогава ErrorCells = ErrorCells & vbCrLf & cell.Address Err.Clear End If Next cell MsgBox „Грешка в следните клетки“ & ErrorCells End Sub

Обърнете внимание, че съм използвал метода Err.Clear в израза If Then.

След като грешка е настъпила и е уловена от условието If, методът Err.Clear връща номера на грешката обратно на 0. Това гарантира, че условието IF улавя грешките само за клетки, където е повдигнато.

Ако не бях използвал метода Err.Clear, след като грешката възникне, тя винаги би била вярна в условието IF и номерът на грешката не е нулиран.

Друг начин да направите тази работа е като използвате On Error Goto -1, който нулира грешката напълно.

Забележка: Err.Clear е различен от On Error Goto -1. Err.Clear изчиства само описанието на грешката и номера на грешката. не го нулира напълно. Това означава, че ако има друг случай на грешка в същия код, няма да можете да се справите с него, преди да го нулирате (което може да стане с „On Error Goto -1“, а не с „Err.Clear“).

Метод за повишаване на грешката

Методът Err.Raise ви позволява да повдигнете грешка по време на изпълнение.

По -долу е синтаксисът на използването на метода Err.Raise:

Err.Raise [номер], [източник], [описание], [файл за помощ], [helpcontext]

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

Но защо бихте искали сами да повдигнете грешка?

Добър въпрос!

Можете да използвате този метод, когато има екземпляр на грешка (което означава, че все пак ще има грешка) и след това използвате този метод, за да кажете на потребителя повече за грешката (вместо по -малко полезното съобщение за грешка, което показва VBA по подразбиране).

Да предположим например, че имате набор от данни, както е показано по -долу и искате всички клетки да имат само числови стойности.

Sub RaiseError () Dim rng As Range Set rng = Selection On Error GoTo ErrHandler за всяка клетка в rng Ако не (IsNumeric (Cell.Value)) Тогава Err.Raise vbObjectError + 513, Cell.Address, "Not a number", " Test.html "Край на следващата клетка ErrHandler: MsgBox Err. Описание & vbCrLf & Err.HelpFile End Sub

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

Лично аз никога не съм използвал Err.Raise, тъй като работя предимно само с Excel. Но за някой, който използва VBA за работа с Excel заедно с други приложения като Outlook, Word или PowerPoint, това може да бъде полезно.

Ето подробна статия за метода Err.Raise в случай, че искате да научите повече.

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

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

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

  1. Използвайте „On Error Go [Label]“ в началото на кода. Това ще гарантира, че всяка грешка, която може да се случи оттам, е обработена.
  2. Използвайте „On Error Resume Next“ САМО когато сте сигурни за грешките, които могат да възникнат. Използвайте го само с очаквана грешка. В случай, че го използвате с неочаквани грешки, той просто ще го игнорира и ще продължи напред. Можете да използвате „On Error Resume Next“ с „Err.Raise“, ако искате да игнорирате определен тип грешка и да уловите останалото.
  3. Когато използвате манипулатори на грешки, уверете се, че използвате Exit Sub преди манипулаторите. Това ще гарантира, че кодът за обработка на грешки се изпълнява само когато има грешка (иначе винаги ще се изпълнява).
  4. Използвайте множество манипулатори на грешки, за да улавяте различни видове грешки. Наличието на множество манипулатори на грешки гарантира, че грешката е правилно адресирана. Например, бихте искали да се справите с грешка „несъответствие на типа“ по различен начин от грешка при изпълнение „Разделяне по 0“.

Надявам се, че сте намерили тази статия в Excel полезна!

Ето още няколко урока за Excel VBA, които може да ви харесат:

  • Типове данни на Excel VBA - Пълно ръководство
  • Цикли на Excel VBA - За следващо, Направете докато, Направете до, За всеки
  • Събития на Excel VBA - Лесно (и пълно) ръководство
  • Excel Visual Basic Editor - Как да го отворите и използвате в Excel

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

wave wave wave wave wave