Съдържание
Тъй като вече знаете как да създавате UDF (и, надявам се, сте се опитвали да ги прилагате в Excel), нека да навлезем малко по-надълбоко и да видим какво може да се направи, ако вашата потребителска функция не работи.
За да разрешите някои проблеми при създаването на потребителска функция, най-вероятно ще трябва да стартирате отстраняване на грешки. Тогава можете да сте сигурни, че функцията работи правилно.
Ще разгледаме следните техники за отстраняване на грешки:
Когато създавате потребителска функция, винаги има вероятност да допуснете грешка. Потребителските функции обикновено са доста сложни. И не винаги започват да работят правилно веднага. Формулата може да върне неправилен резултат или грешката #VALUE! За разлика от стандартните функции на Excel, няма да видите други съобщения.
Има ли начин да се премине стъпка по стъпка през потребителска функция, за да се провери как работи всеки от нейните оператори? Разбира се! За тази цел се използва дебъгване.
Ще ви предложа няколко начина за отстраняване на грешки във вашата потребителска функция, за да можете да изберете най-подходящия за вас.
Като пример използваме потребителската функция GetMaxBetween от една от предишните ни статии, която изчислява максималното число в зададения диапазон от стойности:
Функция GetMaxBetween(rngCells As Range, MinNum, MaxNum) Dim NumRange As Range Dim vMax Dim arrNums() Dim i As Integer ReDim arrNums(rngCells.Count) For Each NumRange In rngCells vMax = NumRange Select Case vMax Case MinNum + 0.01 To MaxNum - 0.01 arrNums(i) = vMax i = i + 1 Case Else GetMaxBetween = 0 End Select Next NumRange GetMaxBetween = WorksheetFunction.Max(arrNums) End FunctionАргументите на функцията са диапазонът от клетки, в които се записват числата, както и горната и долната граница на стойностите.
Поставете функцията MsgBox на важни места
За да наблюдавате изпълнението на изчисленията, можете да показвате стойностите на най-важните променливи на екрана на подходящите места. Това може да стане с помощта на изскачащи диалогови прозорци.
MsgBox е диалогов прозорец, който можете да използвате, за да покажете някакво съобщение на потребителя.
Синтаксисът на MsgBox е подобен на този на други функции във VBA:
MsgBox(prompt [, buttons] [, title] [, helpfile, context])подкана Той съдържа съобщението, което се вижда в диалоговия прозорец. Може да се използва и за показване на стойностите на отделните променливи.
Всички останали аргументи са незадължителни.
[ бутони ] - определя кои бутони и икони да се показват в MsgBox Например, ако използваме опцията vbOkOnly , тогава само OK Дори ако сте пропуснали този аргумент, този бутон се използва по подразбиране.
[ заглавие ] - тук можете да зададете заглавието на полето за съобщения.
Нека преминем от думи към практика и да започнем да отстраняваме грешки. За да се покаже съобщението, добавете следния ред към кода на GetMaxBetween дефинирана от потребителя функция преди Друг случай оператор:
MsgBox vMax,, "Брой -" & iЕто какво ще получим като резултат:
Функция GetMaxBetween(rngCells As Range, MinNum, MaxNum) Dim NumRange As Range Dim vMax Dim arrNums() Dim i As Integer ReDim arrNums(rngCells.Count) For Each NumRange In rngCells vMax = NumRange Select Case vMax Case MinNum + 0.01 To MaxNum - 0.01 arrNums(i) = vMax i = i + 1 MsgBox vMax,, "Count -" & i Case Else GetMaxBetween = 0 End Select Next NumRange GetMaxBetween =WorksheetFunction.Max(arrNums) Край на функциятаИзползване на vMax променлива в диалоговия прозорец ще видим кои числа отговарят на критериите за избор, за да можем да изберем най-голямото от тях. С израза "Count -" & I в заглавната лента посочваме колко числа вече сме избрали, за да определим максималната стойност. Броячът ще се увеличава с всяка нова стойност.
След като сме настроили нашия UDF, прилагаме формулата по-долу към диапазона от дати:
= GetMaxBetween (A1:A6,10,50)
След като натиснете бутона Enter, ще се появи съобщение, както е показано на снимката по-долу:
Това е първото число в интервала A1: A6, което отговаря на критерия: по-голямо от 10, но по-малко от 50.
След като щракнете върху OK, се появява второ съобщение с числото 14. Останалите числа не отговарят на критериите за избор. Затова функцията излиза и връща най-голямата от двете стойности - 17.
Сайтът MsgBox функцията може да се използва на най-важните места във вашата потребителска функция, за да контролирате как се променят стойностите на отделните променливи. Кутиите за съобщения могат да бъдат много полезни, когато имате голяма функция и много изчисления. В този случай ще ви бъде лесно да определите в коя част на кода се появява грешката.
Определяне на точките на спиране и изпълнение стъпка по стъпка
Можете да добавите точки на прекъсване в кода на функцията, където изпълнението на кода ще спре. Така можете да проследите процеса на изчисление стъпка по стъпка. По този начин можете да видите как се променят стойностите на променливите.
За да добавите точка на прекъсване, поставете курсора върху реда, съдържащ изявлението, в което искате да направите пауза. След това щракнете с десния бутон на мишката и изберете Debug -> Превключване на точката на прекъсване или просто натиснете F9 . Можете също така да щракнете върху желаното място във вертикалната сива област вляво от кода на функцията.
Ще се появи червен кръг, както можете да видите на снимката по-долу. Редът от кода, където ще бъде спряно изчислението, е подчертан в червено.
Сега прозорецът на редактора на VBA ще бъде отворен, когато функцията се изпълнява. Курсорът ще бъде позициониран в точката, в която сте спрели.
Ако поставите курсора на мишката върху някоя от променливите в кода на функцията, можете да видите текущата им стойност:
Натиснете F5, за да продължите изчислението.
Забележка. След точката на прекъсване можете да започнете да проследявате напредъка на изчисленията стъпка по стъпка. Ако натиснете бутона F8, ще бъде изпълнен само един следващ ред от VBA кода. Жълтата линия със стрелка също ще се премести до последната изпълнена позиция на кода.
Тъй като изпълнението на функцията отново е спряно, можете да видите текущите стойности на всички променливи на функцията, като използвате курсора на мишката.
Следващото натискане на F8 ще ни отведе една стъпка напред. Така че можете да натискате F8 до края на изчислението. Или да натиснете F5, за да продължите изчислението до следващата точка на прекъсване.
Ако възникне грешка, курсорът ще бъде спрян в точката от кода, в която е възникнала грешката. Ще видите и изскачащо съобщение за грешка. Това улеснява определянето на причината за проблема.
Зададените от вас точки на прекъсване ще се прилагат, докато затворите файла. Когато го отворите отново, ще трябва да ги зададете отново. Това не е най-удобният метод, не мислите ли?
Този проблем обаче може да бъде решен. Вмъкнете Спрете в кода на функцията в необходимите точки и можете да спрете изпълнението на програмата по същия начин, както при използването на точки на прекъсване.
Когато VBA срещне Спрете ще спре изпълнението на програмата и ще изчака вашето действие. Проверете стойностите на променливите, след което натиснете F5, за да продължите.
Или натиснете F8, за да изпълните функцията стъпка по стъпка, както е описано по-горе.
Сайтът Спрете Декларацията е част от програмата и затова не се изтрива, както е в случая с точката на прекъсване. Когато приключите с дебъгването, я премахнете сами. Или я превърнете в коментар, като я предхождате с единична кавичка (').
Отстраняване на грешки с помощта на оператора Debug.Print
Можете да поставите Debug.Print Това е полезно за проверка на стойностите на променливи, които се променят циклично.
Можете да видите пример за работата на Debug.Print на снимката по-долу.
Декларация Debug.Print i, vMax отпечатва стойности и техните поредни номера.
В прозореца Immediate (Незабавно) виждате две числа (17 и 14) от избрания диапазон, който съответства на зададените граници и сред които ще бъде избран максимумът. Цифрите 1 и 2 означават, че функцията е завършила 2 цикъла, в които са били избрани числата. Виждаме стойностите на най-важните променливи, както направихме по-рано с MsgBox . Но това не спря функцията.
Извикване на функция от процедура
Можете да извикате дефинирана от потребителя функция не от клетка в работния лист, а от процедура. В този случай всички грешки ще бъдат показани в прозореца на редактора на Visual Basic.
Ето как можете да извикате дефинираната от потребителя функция GetMaxBerween от процедура:
Sub Test() Dim x x = GetMaxBetween(Range ("A1:A6" ), 10, 50) MsgBox(x) End SubПоставете курсора навсякъде в кода и натиснете F5 . Ако във функцията няма грешка, ще се появи изскачащ прозорец с резултата от изчислението.
В случай на грешка ще видите съответното съобщение в редактора на VBA. Изчислението ще бъде спряно, а редът от кода, в който е възникнала грешката, ще бъде маркиран в жълто. Можете лесно да определите къде и защо е възникнала грешката.
Това е. Сега сте създали своя собствена добавка, добавили сте я в Excel и можете да използвате UDF в нея. Ако искате да използвате повече UDF, просто напишете кода в модула на добавката в редактора VBA и го запазете.
Това е всичко за днес. Разгледахме различни начини за отстраняване на грешки в потребителските функции и научихме как да ги използваме в работната си книга. Наистина се надяваме, че тези насоки ще ви бъдат полезни. Ако имате някакви въпроси, пишете в коментарите към тази статия.