Зміст
Оскільки ви вже знаєте, як створювати UDF (і, сподіваюся, ви також пробували застосовувати їх у своєму Excel), давайте копнемо трохи глибше і подивимося, що можна зробити, якщо ваша користувацька функція не працює.
Для того, щоб вирішити деякі питання при створенні користувацької функції, швидше за все буде потрібно запустити налагодження. Тоді можна бути впевненим в тому, що функція працює коректно.
Ми розглянемо наступні методи налагодження:
При створенні користувацької функції завжди існує ймовірність того, що ви допустите помилку. Користувацькі функції, як правило, досить складні. І не завжди вони починають працювати коректно відразу. Формула може повернути неправильний результат або помилку #ЗНАЧЕННЯ! На відміну від стандартних функцій Excel, ви не побачите ніяких інших повідомлень.
Чи є спосіб покроково пройтись по користувацькій функції, щоб перевірити, як працює кожен її оператор? Звичайно! Для цього використовується налагодження.
Я запропоную вам кілька способів налагодження вашої користувацької функції, щоб ви могли вибрати той, який працює саме для вас.
Як приклад, використаємо користувацьку функцію GetMaxBetween з однієї з наших попередніх статей, яка розраховує максимальну кількість в заданому діапазоні значень:
Function 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(запит [, кнопки] [, заголовок] [, довідковий файл, контекст])швидкий обов'язковий аргумент, що містить повідомлення, яке ви бачите в діалоговому вікні, а також може бути використаний для відображення значень окремих змінних.
Всі інші аргументи є необов'язковими.
[ кнопки ] - визначає, які кнопки та іконки відображатимуться у вікні MsgBox Наприклад, якщо ми скористаємося опцією vbOkOnly , то тільки в тому випадку, якщо ГАРАЗД. Навіть якщо ви пропустили цей аргумент, ця кнопка використовується за замовчуванням.
[ назва ] - тут можна вказати заголовок вікна повідомлення.
Перейдемо від слів до справи і приступимо до налагодження. Для виведення повідомлення додамо в код наступний рядок GetMaxBetween функцію, визначену користувачем, перед Інший випадок оператор:
MsgBox vMax,, "Count -" & iОсь що ми отримаємо в результаті:
Function 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) End FunctionЗа допомогою vMax в діалоговому вікні ми побачимо, які числа відповідають критеріям відбору, щоб ми могли вибрати найбільше з них. За допомогою виразу "Count -" & I в рядку заголовка ми вказуємо, скільки чисел ми вже вибрали для визначення максимального значення. Лічильник буде збільшуватися з кожним новим значенням.
Після того, як ми встановили наш UDF, ми застосовуємо формулу, наведену нижче, до діапазону дат:
= GetMaxBetween (A1:A6,10,50)
Після натискання кнопки Enter на екрані з'явиться повідомлення, як на скріншоті нижче:
Це перше число в діапазоні А1:А6, яке відповідає критеріям: більше 10, але менше 50.
Після натискання кнопки ОК з'являється друге повідомлення з числом 14. Решта чисел не відповідають критеріям відбору. Тому функція завершує роботу і повертає найбільше з двох значень - 17.
На сьогоднішній день, на жаль, це не так. MsgBox можна використовувати в найбільш важливих місцях вашої користувацької функції, щоб контролювати, як змінюються значення окремих змінних. Вікна повідомлень можуть бути дуже корисними, коли у вас велика функція і багато обчислень. В цьому випадку вам буде легко визначити, в якій частині коду виникає помилка.
Визначити точки зупинки та виконати крок за кроком
У код функції можна додати точки зупинки, в яких виконання коду буде зупинятися. Таким чином можна покроково прослідкувати за процесом обчислення. При цьому можна бачити, як змінюються значення змінних.
Щоб додати точку зупинки, встановіть курсор на рядок, що містить оператор, в якому ви хочете зробити паузу. Потім клацніть правою кнопкою миші і виберіть Налагодження -> Перемикання точки зупину або просто натисніть 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 і можете використовувати УДФ в ній. Якщо ви хочете використовувати більше УДФ, просто напишіть код в модулі надбудови в редакторі VBA і збережіть його.
На сьогодні ми розглянули різні способи налагодження користувацьких функцій та навчилися використовувати їх у своїй робочій книзі. Сподіваємося, що ці рекомендації будуть корисними для вас. Якщо у вас виникнуть запитання, пишіть у коментарях до цієї статті.