Решавање грешака у Екцел ВБА - све што треба да знате!

Без обзира на то колико сте искусни са ВБА кодирањем, грешке ће увек бити део тога.

Разлика између почетника и искусног ВБА програмера је у томе што искусни програмери знају како ефикасно да решавају и користе грешке.

У овом водичу ћу вам показати различите начине на које можете ефикасно решавати грешке у програму Екцел ВБА.

Пре него што пређемо на руковање грешкама ВБА, хајде да прво разумемо различите врсте грешака на које ћете вероватно наићи при програмирању у програму Екцел ВБА.

Врсте ВБА грешака у Екцелу

Постоје четири врсте грешака у програму Екцел ВБА:

  1. Синтаксичке грешке
  2. Грешке при састављању
  3. Грешке у току извођења
  4. Логичке грешке

Хајде да брзо схватимо које су то грешке и када ћете на њих наићи.

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

Синтаксичка грешка, као што име говори, настаје када ВБА пронађе нешто погрешно са синтаксом у коду.

На пример, ако заборавите део наредбе/синтаксе који је потребан, видећете грешку при превођењу.

У доњем коду, чим притиснем ентер после другог реда, видим грешку при компајлирању. То је зато што је ИФ изјава треба да има „Онда‘Команда, која недостаје у доњем коду.

Белешка: Када уносите код у Екцел ВБА, он проверава сваку реченицу чим притиснете ентер. Ако ВБА пронађе нешто што недостаје у синтакси, одмах приказује поруку са неким текстом који вам може помоћи да разумете део који недостаје.

Да бисте били сигурни да видите грешку у синтакси кад год нешто недостаје, морате бити сигурни да је омогућена Аутосинтакса. Да бисте то урадили, кликните на „Алати“, а затим на „Опције“. У дијалогу са опцијама проверите да ли је омогућена опција „Аутоматска провера синтаксе“.

Ако је опција „Ауто Синтак Цхецк“ онемогућена, ВБА ће и даље означавати ред са синтаксичком грешком црвеном бојом, али неће приказати дијалог за грешку.

Грешка при компајлирању

Грешке при компајлирању се јављају када нешто недостаје што је потребно за рад кода.

На пример, у доњем коду, чим покушам да покренем код, показаће се следећа грешка. То се догађа јер сам користио наредбу ИФ Тхен без затварања обавезним „Крај ако“.

Синтаксичка грешка је такође врста грешке при компајлирању. Грешка у синтакси се јавља чим притиснете ентер и ВБА идентификује да нешто недостаје. Грешка при компајлирању се такође може догодити када ВБА не открије да нешто недостаје током куцања кода, али се дешава када се код преведе или изврши.

ВБА проверава сваки ред док уписујете код и наглашава синтаксичку грешку чим је ред нетачан и притиснете ентер. Грешке при компајлирању се, с друге стране, идентификују само када ВБА анализира цео код.

Испод је неколико сценарија у којима ћете наићи на грешку при компајлирању:

  1. Коришћење ИФ извода без завршетка ИФ
  2. Употреба наредбе Фор са Нект
  3. Коришћењем наредбе Селецт без употребе Енд Селецт
  4. Не декларисање променљиве (ово функционише само када је омогућена опција Екплицит)
  5. Позивање подфункције која не постоји (или са погрешним параметрима)
Напомена о „Опцији експлицитно“: Када додате „Оптион Екплицит“, мораћете да декларишете све променљиве пре покретања кода. Ако постоји било која променљива која није декларисана, ВБА би приказао грешку. Ово је добра пракса јер приказује грешку у случају да имате погрешно написану променљиву. Више о опцији Екплицит можете прочитати овде.

Грешке при извођењу

Грешке у току извођења су оне које се јављају када је код покренут.

Грешке у времену извођења ће се појавити само када се побрину за све грешке у синтакси и компајлирању.

На пример, ако покренете код који би требало да отвори Екцел радну свеску, али та радна свеска није доступна (избрисана или промењено име), ваш код би вам направио грешку у току извршавања.

Када дође до грешке у току извођења, зауставиће код и приказаће вам дијалог за грешку.

Порука у дијалогу Рун-тиме еррор је мало кориснија. Покушава да објасни проблем који вам може помоћи да га исправите.

Ако кликнете на дугме Дебуг, означиће део кода који доводи до грешке.

Ако сте исправили грешку, можете кликнути на дугме Покрени на траци са алаткама (или притисните Ф5) да бисте наставили са покретањем кода са места на коме је отишао.

Или можете кликнути на дугме Крај да бисте изашли из кода.

Важно: У случају да кликнете на дугме Крај у дијалогу, зауставиће се код на линији на коју се наиђе. Међутим, све линије кода пре тога биле би извршене.

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

Логичке грешке неће зауставити ваш код, али могу довести до погрешних резултата. Ово би такође могле бити најтеже врсте грешака за решавање проблема.

Компајлер не истиче ове грешке и потребно их је ручно отклонити.

Један пример логичке грешке (са којом се често заглавим) је трчање у бескрајну петљу.

Други пример може бити када даје резултат који је погрешан. На пример, можда ћете на крају користити погрешну променљиву у коду или додати две променљиве где је једна нетачна.

Постоји неколико начина на које решавам логичке грешке:

  1. Уметните оквир за поруке на неко место у коду и означите вредности/податке који могу помоћи да се разуме да ли се све одвија како се очекује.
  2. Уместо да покрећете код одједном, прођите кроз сваки ред један по један. Да бисте то урадили, кликните било где у коду и притисните Ф8. приметили бисте да се сваки пут када притиснете Ф8 извршава једна линија. Ово вам омогућава да прођете кроз ред по ред и идентификујете логичке грешке.

Коришћење отклањања грешака за проналажење грешака у компајлирању/синтакси

Када завршите са кодом, добра је пракса да га прво компајлирате пре покретања.

Да бисте компајлирали код, кликните на опцију Дебуг на траци са алаткама и кликните на Цомпиле ВБАПројецт.

Када саставите ВБА пројекат, он пролази кроз код и идентификује грешке (ако их има).

У случају да пронађе грешку, приказаће вам се оквир за дијалог са грешком. Проналази грешке једну по једну. Дакле, ако пронађе грешку и исправите је, морате поново покренути компајлирање да бисте пронашли друге грешке (ако постоје).

Када ваш код не садржи грешке, опција Цомпиле ВБАПројецт ће бити засивљена.

Имајте на уму да ће компајлирање пронаћи само грешке „Синтакса“ и „Преведи“. Неће пронаћи грешке током извођења.

Када пишете ВБА код, не желите да се грешке појављују. Да бисте то избегли, можете користити многе методе за решавање грешака.

У следећих неколико одељака овог чланка покрити ћу методе које можете користити за управљање ВБА грешкама у Екцелу.

Конфигуришите поставке грешака (руковане против необрађених грешака)

Пре него што почнете да радите са својим кодом, морате да проверите једно подешавање у програму Екцел ВБА.

Идите на ВБА траку са алаткама и кликните на Алатке, а затим на Опције.

У дијалогу Опције кликните на картицу Опште и уверите се да је у групи „Заглављивање грешака“ означена опција „Прекид грешака без грешке“.

Дозволите ми да објасним три опције:

  1. Прекини на свим грешкама: Ово ће зауставити ваш код на свим врстама грешака, чак и када сте користили технике за решавање ових грешака.
  2. Модул Пауза у настави: Ово ће зауставити ваш код на свим необрађеним грешкама, а истовремено, ако користите објекте као што су Усерформс, такође ће се пробити унутар тих објеката и означити тачну линију која узрокује грешку.
  3. Пауза о необрађеним грешкама: Ово ће зауставити ваш код само за оне грешке које се не обрађују. Ово је подразумевано подешавање јер осигурава да ћете приметити све неоправдане грешке. Ако користите објекте као што су Усерформс, ово неће означити линију која узрокује грешку у објекту, већ ће само означити линију која се односи на тај објект.
Белешка: Ако радите са објектима као што су Кориснички облици, можете променити ову поставку у „Прекид модула класе“. Разлика између #2 и #3 је у томе што ће вас, када користите Бреак ин Цласс Модуле, одвести до одређене линије у објекту који узрокује грешку. Такође можете изабрати да користите ово уместо „Прекид грешака без грешке“.

Укратко - ако тек почињете са Екцел ВБА, проверите да ли је означена опција „Прекид грешака без обраде“.

ВБА руковање грешкама са изјавама „Он Еррор“

Када ваш код наиђе на грешку, можете учинити неколико ствари:

  1. Занемарите грешку и пустите да се код настави
  2. Поставите код за руковање грешкама и покрените га када дође до грешке

Обје ове методе руковања грешкама осигуравају да крајњи корисник неће видјети грешку.

Постоји неколико изјава „О грешци“ које можете користити да бисте то урадили.

На Грешка Настави даље

Када у свом коду употребите „Он Еррор Ресуме Нект“, свака грешка ће се занемарити и код ће наставити да ради.

Ова метода руковања грешкама се користи прилично често, али морате бити опрезни када је користите. Пошто потпуно игнорише сваку грешку која се може појавити, можда нећете моћи да идентификујете грешке које је потребно исправити.

На пример, ако се изврши доњи код, вратиће грешку.

Суб АссигнВалуес () к = 20 /4 и = 30 /0 Енд Суб

То се дешава зато што не можете поделити број са нулом.

Али ако у овом коду користим наредбу „Он Еррор Ресуме Нект“ (као што је приказано испод), она ће занемарити грешку и нећу знати да постоји проблем који треба исправити.

Суб АссигнВалуес () Он Еррор Ресуме Нект к = 20 /4 и = 30 /0 Енд Суб

Он Еррор Ресуме Нект треба користити само ако јасно знате какве грешке се очекују од вашег ВБА кода и у реду је игнорисати их.

На пример, испод је ВБА код догађаја који би тренутно додао вредност датума и времена у ћелију А1 ново уметнутог листа (овај код се додаје у радни лист, а не у модул).

Привате Суб Воркбоок_НевСхеет (БиВал Сх Ас Објецт) Сх.Ранге ("А1") = Формат (Нов, "дд-ммм-ииии хх: мм: сс") Крај Суб

Иако ово одлично функционира у већини случајева, показало би се грешка ако додам лист графикона умјесто радног листа. Пошто лист графикона нема ћелије, код би изазвао грешку.

Дакле, ако у овом коду користим израз „Он Еррор Ресуме Нект“, он ће радити како се очекује са радним листовима и неће учинити ништа са листовима графикона.

Привате Суб Воркбоок_НевСхеет (БиВал Сх Ас Објецт) Он Еррор Ресуме Нект Сх.Ранге ("А1") = Формат (Нов, "дд-ммм-ииии хх: мм: сс") Крај Суб

Напомена: О наставку грешке следећу изјаву најбоље је користити када знате на какве грешке ћете вероватно наићи. А онда, ако мислите да је безбедно занемарити ове грешке, можете га користити.

Овај код можете подићи на виши ниво тако што ћете анализирати да ли је дошло до грешке и приказати релевантну поруку за њега.

Код испод би приказао оквир за поруку који би обавестио корисника да радни лист није уметнут.

Привате Суб Воркбоок_НевСхеет (БиВал Сх Ас Објецт) Он Еррор Ресуме Нект Сх.Ранге ("А1") = Формат (Нов, "дд-ммм-ииии хх: мм: сс") Иф Ерр.Нумбер 0 тхен МсгБок "Личи на вас уметнут лист графикона "& вбЦрЛф &" Грешка - "& Ерр. Опис Опис Енд Иф Енд Суб

„Ерр.Нумбер“ се користи за добијање броја грешке, а „Ерр.Десцриптион“ за опис грешке. Ово ће бити обрађено касније у овом водичу.

Он Еррор ГоТо 0

„Он Еррор ГоТо 0“ ће зауставити код на линији која изазива грешку и приказати оквир за поруку који описује грешку.

Једноставно речено, омогућава подразумевано понашање провере грешака и приказује подразумевану поруку о грешци.

Зашто га онда уопште користити?

Обично не морате да користите „Он Еррор Гото 0“, али може бити корисно када га користите заједно са „Он Еррор Ресуме Нект“

Дозволи да објасним!

Код испод би изабрао све празне ћелије у избору.

Суб СелецтФормулаЦеллс () Селецтион.СпециалЦеллс (клЦеллТипеБланкс) .Одаберите Енд Суб

Али приказала би грешку када у изабраним ћелијама нема празних ћелија.

Да бисте избегли приказивање грешке, можете користити опцију Он Еррор Ресуме нект '

Сада ће такође показати грешку када покренете доњи код:

Суб СелецтФормулаЦеллс () Он Еррор Ресуме Нект Селецтион.СпециалЦеллс (клЦеллТипеБланкс) .Одаберите Енд Суб

Засада је добро!

Проблем настаје када постоји део кода у којем може доћи до грешке, а пошто користите опцију „Он Еррор Ресуме Нект“, код би га једноставно игнорисао и прешао на следећи ред.

На пример, у доњем коду не би било упита о грешци:

Суб СелецтФормулаЦеллс () Он Еррор Ресуме Нект Селецтион.СпециалЦеллс (клЦеллТипеБланкс). Одаберите '… више кода који може садржати грешку Енд Суб

У горњем коду постоје два места на којима може доћи до грешке. Прво место бирамо све празне ћелије (помоћу Селецтион.СпециалЦеллс), а друго је у преосталом коду.

Иако се прва грешка очекује, свака грешка након тога није.

Овде Он Еррор Гото 0 долази у помоћ.

Када га користите, ресетујете поставку грешке на подразумевану, где ће почети да приказује грешке када наиђе на њу.

На пример, у доњем коду не би дошло до грешке у случају да нема празних ћелија, али би дошло до упита за грешку због '10/0 '

Суб СелецтФормулаЦеллс () Он Еррор Настави следећи Селецтион.СпециалЦеллс (клЦеллТипеБланкс). Одаберите Он Еррор ГоТо 0 '… више кода који може садржати грешку Енд Суб

Грешка при укључивању Иди на [ознака]

Горе наведене две методе - „Он Еррор Ресуме Нект“ и „Он Еррор Гото 0“ - не дозвољавају нам да заиста решимо грешку. Један тера код да игнорише грешку, а други наставља проверу грешака.

Он Еррор Го [Лабел] је начин на који можете да наведете шта желите да урадите у случају грешке у вашем коду.

Испод је структура кода која користи овај алат за обраду грешака:

Суб Тест () Он Еррор ГоТо Лабел: Кс = 10 /0 'овај ред изазива грешку' …. Преостали код иде овде Екит Суб Лабел: 'код за решавање грешке Енд Суб

Имајте на уму да пре грешке при руковању „ознаком“ постоји подизлазни излаз. Ово осигурава да у случају да нема грешака, под -излаз се напушта и да се код „Лабел“ не извршава. У случају да не користите Екит Суб, он ће увек извршити код „Лабел“.

У доњем примеру кода, када дође до грешке, код скочи и изврши код у одељку за руковање (и приказује оквир за поруку).

Суб Еррорхандлер () Он Еррор Иди на ЕррМсг Кс = 12 И = 20 /0 З = 30 Изађи из Суб ЕррМсг: МсгБок "Изгледа да је дошло до грешке" & вбЦрЛф & Ерр.Десцриптион Енд Суб

Имајте на уму да када дође до грешке, код је већ покренут и извршио линије пре линије која изазива грешку. У горњем примеру, код поставља вредност Кс као 12, али пошто се грешка јавља у следећем реду, не поставља вредности за И и З.

Једном када код скочи на код руковаоца грешком (ЕррМсг у овом примеру), он ће наставити да извршава све редове у и испод кода руковаоца грешкама и изађе из подменија.

Укључено Грешка Иди на -1

Ово је мало компликовано и у већини случајева вероватно нећете ово користити.

Али и даље ћу ово покривати јер сам се суочио са ситуацијом у којој је то било потребно (слободно занемарите и пређите на следећи одељак ако тражите само основе).

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

Претпоставимо да имате код у којем је дошло до грешке. Али све је у реду јер имате један алат за обраду грешака. Али шта се дешава када дође до друге грешке у коду руковаоца грешкама (да … донекле попут почетног филма).

У том случају не можете користити други руковатељ јер прва грешка није уклоњена. Дакле, док сте решили прву грешку, у ВБА меморији она и даље постоји. А ВБА меморија има место само за једну грешку - не две или више од тога.

У овом сценарију можете користити Он Еррор Гото -1.

Он брише грешку и ослобађа ВБА меморију за руковање следећом грешком.

Доста приче!

Дозволите ми да сада објасним помоћу примера.

Претпоставимо да имам доњи код. Ово ће изазвати грешку јер постоји подела на нулу.

Суб Еррорхандлер () Кс = 12 И = 20 /0 З = 30 Енд Суб

Дакле, да бих то решио, користим код за обраду грешака (са именом ЕррМсг) као што је приказано испод:

Суб Еррорхандлер () Он Еррор Иди на ЕррМсг Кс = 12 И = 20 /0 З = 30 Изађи из Суб ЕррМсг: МсгБок "Изгледа да је дошло до грешке" & вбЦрЛф & Ерр.Десцриптион Енд Суб

Сад је опет све у реду. Чим дође до грешке, користи се руковалац грешке и приказује оквир за поруку као што је приказано испод.

Сада проширујем код тако да имам више кода у или након руковаоца грешком.

Суб Еррорхандлер () Он Еррор Иди на ЕррМсг Кс = 12 И = 20 /0 З = 30 Изађи из Суб ЕррМсг: МсгБок "Изгледа да је дошло до грешке" & вбЦрЛф & Ерр.Опис А = 10 /2 Б = 35 /0 Енд Суб

Пошто је прва грешка обрађена, а друга није, поново видим грешку као што је приказано испод.

Још увек све добро. Код се понаша онако како смо очекивали.

Дакле, да бих решио другу грешку, користим други алат за обраду грешака (ЕррМсг2).

Суб Еррорхандлер () Он Еррор Иди на ЕррМсг Кс = 12 И = 20 /0 З = 30 Изађи из Суб ЕррМсг: МсгБок "Чини се да постоји грешка" & вбЦрЛф & Ерр.Опис на грешку ГоТо ЕррМсг2 А = 10 /2 Б = 35 / 0 Екит Суб ЕррМсг2: МсгБок "Изгледа да је поново дошло до грешке" & вбЦрЛф & Ерр.Десцриптион Енд Суб

И ту је то место не ради како се очекивало.

Ако покренете горњи код, он ће вам и даље приказивати грешку током извођења, чак и након што сте поставили други руковалац грешкама.

То се дешава јер прву грешку нисмо избрисали из ВБА меморије.

Да, решили смо то! Али и даље остаје у сећању.

А када ВБА наиђе на другу грешку, и даље је заглављена код прве грешке, па се други алат за руковање грешком не користи. Код се зауставља на линији која је изазвала грешку и приказује упит за грешку.

Да бисте очистили ВБА меморију и избрисали претходну грешку, морате користити „Он Еррор Гото -1“.

Дакле, ако додате овај ред у доњи код и покренете га, радиће како се очекује.

Суб Еррорхандлер () Он Еррор ГоТо ЕррМсг Кс = 12 И = 20 /0 З = 30 Екит Суб ЕррМсг: МсгБок "Изгледа да је дошло до грешке" & вбЦрЛф & Ерр. Опис Укључено Грешка ГоТо -1 Укључено Грешка ГоТо ЕррМсг2 А = 10 / 2 Б = 35 /0 Екит Суб ЕррМсг2: МсгБок "Изгледа да је поново дошло до грешке" & вбЦрЛф & Ерр.Десцриптион Енд Суб
Белешка: Грешка се аутоматски уклања по завршетку потпрограма.Дакле, „Он Еррор Гото -1“ може бити корисно када добијете две или више грешака у истој потпрограми.

Објекат Ерр

Кад год се појави грешка са кодом, то је Ерр објект који се користи за добијање детаља о грешци (попут броја грешке или описа).

Ерр Својства објекта

Објекат Ерр има следећа својства:

Својство Опис
Број Број који представља врсту грешке. Када нема грешке, ова вредност је 0
Опис Кратак опис грешке
Извор Назив пројекта у којем је дошло до грешке
ХелпЦонтект ИД контекста помоћи за грешку у датотеци помоћи
ХелпФиле Низ који представља локацију фасцикле и назив датотеке датотеке помоћи

Иако у већини случајева не морате да користите објекат Ерр, понекад може бити корисно при решавању грешака у Екцелу.

На пример, претпоставимо да имате скуп података као што је приказано испод и за сваки број у избору желите да израчунате квадратни корен у суседној ћелији.

Код испод може то учинити, али пошто у ћелији А5 постоји текстуални низ, он приказује грешку чим се то догоди.

Суб ФиндСкрРоот () Дим рнг Ас Ранге Сет рнг = Селецтион фор еацх целл Ин рнг целл. Оффсет (0, 1) .Валуе = Скр (целл.Валуе) Следећа ћелија Енд Суб

Проблем са овом врстом поруке о грешци је тај што вам не даје ништа о томе шта је пошло по злу и где се проблем појавио.

Можете да користите објекат Ерр да ове поруке о грешци учините значајнијим.

На пример, ако сада користим доњи ВБА код, он ће зауставити код чим дође до грешке и приказати оквир за поруку са адресом ћелије ћелије у којој постоји проблем.

Суб ФиндСкрРоот () Дим рнг Ас Ранге Сет рнг = Селецтион фор еацх целл Ин рнг Он Грешка Иди на ЕррХандлер целл.Оффсет (0, 1) .Валуе = Скр (целл.Валуе) Следећа ћелија ЕррХандлер: МсгБок "Број грешке:" & Ерр .Број & вбЦрЛф & _ "Опис грешке:" & Ерр.Десцриптион & вбЦрЛф & _ "Грешка на:" & целл.Аддресс Енд Суб

Горњи код би вам дао много више информација од једноставног „Неслагање типова“, посебно адресу ћелије како бисте знали где је дошло до грешке.

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

Код испод би ово урадио:

Суб ФиндСкрРоот2 () Дим ЕррорЦеллс Ас Стринг Дим рнг Ас Ранге Он Еррор Ресуме Нект Сет рнг = Избор за сваку ћелију у рнг целл.Оффсет (0, 1) .Валуе = Скр (целл.Валуе) Иф Ерр.Нумбер 0 Тхен ЕррорЦеллс = ЕррорЦеллс & вбЦрЛф & целл.Аддресс Он Еррор ГоТо -1 Енд Иф Нект ћелија МсгБок "Грешка у следећим ћелијама" & ЕррорЦеллс Екит Суб Енд Суб

Горњи код ради до краја и даје квадратни корен свих ћелија које у себи имају бројеве (у суседној колони). Затим приказује поруку која наводи све ћелије у којима је дошло до грешке (као што је приказано испод):

Ерр Објецт Метходс

Иако су својства Ерр корисна за приказивање корисних информација о грешкама, постоје и две Ерр методе које вам могу помоћи у решавању грешака.

Метод Опис
Јасно Брише све поставке својстава објекта Ерр
Подићи Генерише грешку током извођења

Брзо научимо шта је ово и како/зашто их користити са ВБА у Екцелу.

Ерр Цлеар Метход

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

Следећи код ће добити квадратне корене свих бројева у суседној колони и приказати поруку да је дошло до грешке за ћелије А5 и А9 (јер у њима има текста).

Суб ФиндСкрРоот2 () Дим ЕррорЦеллс Ас Стринг Дим рнг Ас Ранге Он Еррор Ресуме Нект Сет рнг = Избор за сваку ћелију у рнг целл.Оффсет (0, 1) .Валуе = Скр (целл.Валуе) Иф Ерр.Нумбер 0 Тхен ЕррорЦеллс = ЕррорЦеллс & вбЦрЛф & целл.Аддресс Ерр.Цлеар Енд Иф Нект ћелија МсгБок "Грешка у следећим ћелијама" & ЕррорЦеллс Енд Суб

Имајте на уму да сам користио метод Ерр.Цлеар у наредби Иф Тхен.

Када дође до грешке и зароби је условом Иф, метода Ерр.Цлеар ресетује број грешке на 0. Ово осигурава да услов ИФ хвата грешке само за ћелије где је подигнута.

Да нисам користио метод Ерр.Цлеар, када дође до грешке, увек би било тачно у ИФ стању, а број грешке није ресетован.

Други начин да ово функционише је коришћење Он Он Еррор Гото -1, које потпуно поништава грешку.

Белешка: Ерр.Цлеар се разликује од Он Еррор Гото -1. Ерр.Цлеар брише само опис грешке и број грешке. не поништава га у потпуности. То значи да ако постоји друга инстанца грешке у истом коду, нећете моћи да је решите пре него што је ресетујете (што се може урадити помоћу „Он Еррор Гото -1“, а не помоћу „Ерр.Цлеар“).

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

Метод Ерр.Раисе вам омогућава да покренете грешку током извођења.

Испод је синтакса коришћења методе Ерр.Раисе:

Ерр.Раисе [број], [извор], [опис], [датотека помоћи], [хелпцонтект]

Сви ови аргументи су опционални и можете их користити како бисте поруку о грешци учинили смисленијом.

Али зашто бисте икада желели да сами направите грешку?

Добро питање!

Ову методу можете користити када постоји инстанца грешке (што значи да ипак долази до грешке), а затим користите ову методу да бисте кориснику рекли више о грешци (уместо мање корисне поруке о грешци коју приказује ВБА подразумевано).

На пример, претпоставимо да имате скуп података као што је приказано испод и желите да све ћелије имају само нумеричке вредности.

Суб РаисеЕррор () Дим рнг Ас Ранге Сет рнг = Селецтион Он Еррор Иди на ЕррХандлер за сваку ћелију у рнг -у Ако није (ИсНумериц (Целл.Валуе)) Затим Ерр.Раисе вбОбјецтЕррор + 513, Целл.Аддресс, "Није број", " Тест.хтмл "Енд Иф Нект Целл ЕррХандлер: МсгБок Ерр.Десцриптион & вбЦрЛф & Ерр.ХелпФиле Енд Суб

Горњи код би приказао поруку о грешци која има наведени опис и датотеку контекста.

Лично, никада нисам користио Ерр.Раисе јер углавном радим само са Екцелом. Али за некога ко користи ВБА за рад са Екцелом заједно са другим апликацијама, као што су Оутлоок, Ворд или ПоверПоинт, ово може бити корисно.

Ево детаљног чланка о Ерр.Раисе методи у случају да желите сазнати више.

ВБА грешке у руковању најбољим праксама

Без обзира на то колико сте вешти у писању ВБА кода, грешке ће увек бити део тога. Најбољи кодери су они који имају вештину да правилно реше ове грешке.

Ево неколико најбољих пракси које можете користити када је у питању руковање грешкама у програму Екцел ВБА.

  1. Користите „Он Еррор Го [Лабел]“ на почетку кода. Ово ће осигурати да се реши свака грешка која се одатле може догодити.
  2. Користите „Он Еррор Ресуме Нект“ САМО када сте сигурни у могуће грешке. Користите га само са очекиваном грешком. У случају да га користите са неочекиваним грешкама, једноставно ће га игнорисати и кренути напред. Можете користити „Он Еррор Ресуме Нект“ са „Ерр.Раисе“ ако желите да занемарите одређену врсту грешке, а да ухватите остатак.
  3. Када користите руковаоце грешкама, проверите да ли користите Екит Суб пре обрађивача. Ово ће осигурати да се код руковаоца грешком изврши само када постоји грешка (иначе ће се увек извршити).
  4. Користите више руковаоца грешкама за хватање различитих врста грешака. Имати више руковаоца грешкама осигурава да је грешка исправно решена. На пример, желите да решите грешку „неусклађеност типа“ другачије од грешке у времену „Подела са 0“.

Надам се да вам је овај Екцел чланак био користан!

Ево још неких Екцел ВБА водича који би вам се могли допасти:

  • Екцел ВБА типови података - потпуни водич
  • Екцел ВБА петље - За следеће, Урадите док, Урадите до, За сваку
  • Екцел ВБА догађаји - једноставан (и потпун) водич
  • Екцел Висуал Басиц Едитор - Како га отворити и користити у Екцелу

Ви ће помоћи развој сајта, дељење страницу са пријатељима

wave wave wave wave wave