Не працює Excel UDF: проблеми та шляхи їх вирішення

  • Поділитися Цим
Michael Brown

У цій статті ми розглянемо проблеми, з якими ви можете зіткнутися при використанні користувацьких функцій в робочих книгах. Я постараюся показати вам, що їх викликає і як легко їх можна вирішити.

Ось про що ми поговоримо:

    Раніше ми говорили про те, що таке користувацька функція, як її створювати та використовувати. Якщо ви відчуваєте, що вам потрібно освіжити базові знання про UDF, зробіть паузу та перегляньте мою попередню статтю.

    Чому Excel UDF не перераховує?

    Коли ви вносите будь-які зміни в книгу, Excel не буде перераховувати кожну формулу, яка там є. Він оновить результати тільки для тих формул, які пов'язані зі зміненими комірками.

    Але це стосується стандартних функцій Excel. Що стосується користувацьких, то Excel не може перевірити код VBA і визначити інші комірки, які також можуть вплинути на результат роботи користувацької функції. Тому ваша користувацька формула може не змінитися при внесенні змін до книги.

    Для усунення проблеми достатньо скористатися кнопкою Application.Volatile Ознайомтеся з наступним розділом, щоб дізнатися покрокову інструкцію щодо його застосування.

    Користувацькі функції, що змінюються та не змінюються

    За замовчуванням користувацькі функції в Excel не є мінливими. Це означає, що СПФ перераховується тільки в тому випадку, якщо змінюється значення будь-якої з комірок, на які вона посилається. Але якщо змінюється формат комірок, ім'я робочого аркуша, ім'я файлу, то ніяких змін в СПФ не відбудеться.

    Перейдемо від слів до прикладів. Наприклад, вам потрібно записати в комірку назву вашої робочої книги. Для цього ви створюєте користувацьку функцію:

    Function WorkbookName() As String WorkbookName = ThisWorkbook.Name End Function

    А тепер уявіть собі наступний випадок. Ви написали користувацьку формулу =Ім'я_робочої_книги() Через деякий час Ви вирішили перейменувати файл і зберегли його з іншим ім'ям. Але, подивившись на значення в комірці, бачите, що воно не змінилося. Там залишилося старе ім'я файлу, яке вже не відповідає дійсності.

    Оскільки в цій функції немає аргументів, то функція не перераховується (навіть якщо змінити назву книги, закрити її, а потім знову відкрити).

    Примітка: для перерахунку всіх функцій у файлі можна скористатися комбінацією клавіш Ctrl + Alt + F9.

    Чи є простіший спосіб? Щоб формула перераховувалася при кожній зміні робочого аркуша, вам потрібен додатковий рядок коду. Вставте наступний фрагмент коду на початку вашої функції:

    Application.Volatile

    Отже, ваш код буде виглядати так:

    Function WorkbookName() As String Application.Volatile WorkbookName = ThisWorkbook.Name End Function

    Тепер ваш UDF є мінливим, отже, він буде перерахований автоматично, якщо будь-яка комірка робочого аркуша була перерахована або відбулися будь-які зміни в робочій книзі. Як тільки ви зміните ім'я файлу, ви негайно побачите це оновлення.

    Примітка: майте на увазі, що занадто велика кількість нестабільних функцій може уповільнити роботу Excel. Адже існує занадто багато користувацьких функцій, які виконують складні обчислення і постійно оперують з великими діапазонами даних.

    Тому я рекомендую використовувати волатильність тільки там, де вона дійсно потрібна.

    Чому недоступні кастомні функції

    При введенні перших літер назви користувацької функції вона з'являється у випадаючому списку поруч з коміркою введення, як і стандартні функції Excel.

    Однак так відбувається не завжди. Які помилки можуть спричинити таку ситуацію?

    Якщо у вас Excel 2003-2007, то UDF ніколи не з'являється у випадаючому списку. Там можна побачити тільки стандартні функції.

    Але навіть якщо ви використовуєте новішу версію Excel, є ще одна помилка, яку ви можете випадково допустити.

    Бачите, користувацька функція повинна знаходитися в стандартному модулі VBA, який називається Modules. При додаванні нового модуля для написання коду функції автоматично створюється папка Modules, в якій записуються всі модулі.

    Але іноді трапляється так, що новий модуль не створюється. На наступному скріншоті видно, що код користувацької функції знаходиться в модулі "Об'єкти Microsoft Excel" разом з ThisWorkbook.

    Справа в тому, що не можна розміщувати користувацьку функцію в області коду робочого аркуша або книги. В цьому випадку функція не буде працювати. Більш того, вона не буде відображатися в випадаючому списку функцій. Тому код завжди повинен знаходитися в папці Модулі .

    Не відображається довідковий текст користувацької функції Excel

    Ще одна проблема, яка може виникнути - це підказка, яку ви бачите при вставці користувацької функції. Якщо ви використовуєте стандартну функцію, ви завжди побачите підказку для функції і для її аргументів. Але як бути з UDF?

    Якщо у вас багато користувацьких функцій, вам буде вкрай складно запам'ятати, які обчислення робить кожна з них. Ще складніше буде запам'ятати, які аргументи використовувати. Думаю, буде непогано мати опис ваших користувацьких функцій в якості нагадування.

    Для цього я б запропонував використовувати Application.MacroOptions Він допоможе відобразити опис не тільки функції, але й кожного з її аргументів у вікні Майстра функцій. Це вікно з'являється при натисканні на кнопку Fx в рядку формул.

    Розглянемо, як додати таку підказку до своїх UDF. У попередній статті ми розглядали користувацьку функцію GetMaxBetween. Вона знаходить максимальне число в заданому діапазоні і приймає три аргументи: діапазон числових значень, а також максимальне і мінімальне значення для пошуку.

    Тепер додамо опис для цієї користувацької функції. Для цього створіть і запустіть файл Application.MacroOptions команду. Для того, щоб GetMaxBetween можна виконати наступну команду:

    Sub RegisterUDF () Dim strFuncName As String 'назва функції, яку потрібно зареєструвати Dim strDescr As String ' опис самої функції Dim strArgs () As String 'опис аргументів функції ' Register GetMaxBetween function ReDim strArgs (1 To 3) 'кількість аргументів у вашій функції strFuncName = "GetMaxBetween" strDescr = "Максимальне число в заданому діапазоні" strArgs (1) ="Діапазон числових значень" strArgs (2) = "Нижня межа інтервалу" strArgs (3) = "Верхня межа інтервалу" Application.MacroOptions Macro: = strFuncName, _ Description: = strDescr, _ ArgumentDescriptions: = strArgs, _ Category: = "Мої власні функції" End Sub

    або

    Sub RegisterUDF () Application.MacroOptions Macro: = "GetMaxBetween" , _ Description: = "Максимальне число в заданому діапазоні" , _ Category: = "Мої користувацькі функції" , _ ArgumentDescriptions: = Array (_ "Діапазон числових значень" , _ "Нижня границя інтервалу" , _ "Верхня границя інтервалу" ) End Sub

    Змінна str FuncName назва функції. strDescr - Опис функції. strArgs змінні містять підказки для кожного аргументу.

    Може виникнути питання, що є четвертим аргументом Application.MacroOptions. Цей необов'язковий аргумент має ім'я Категорія і вказує на клас функцій Excel, які наш користувач GetMaxBetween () Ви можете назвати її будь-якою з існуючих категорій: Математичні, Тригонометричні, Статистичні, Логічні і т.д. Ви можете вказати назву для нової категорії, в якій будете розміщувати створювані функції. Якщо не використовувати аргумент Категорія, то користувацька функція автоматично буде поміщена в категорію "Визначені користувачем".

    Вставте код функції у вікно модуля:

    Після цього натисніть на кнопку "Виконати". Команда виконає всі налаштування для використання Fx кнопку з вашим GetMaxBetween() функцію.

    Якщо спробувати вставити функцію в комірку за допомогою кнопки Функція вставки інструмент, ви побачите, що там є ваш GetMaxBetween знаходиться в категорії "Мої користувацькі функції":

    Ви можете просто почати вводити назву функції в комірку, і ви побачите свою власну функцію у випадаючому списку функцій для вибору.

    Тоді телефонуйте за номером Майстер функцій за допомогою кнопки Fx.

    Порада. Для виклику Майстра функцій можна також скористатися комбінацією клавіш CRTL + A.

    В рамках проекту Майстер функцій ви побачите опис вашої функції, а також підказку для першого аргументу. Якщо ви наведете курсор на другий або третій аргумент, ви також побачите підказки для них.

    Якщо ви хочете змінити текст цих підказок, змініть значення параметрів strDescr і strArgs змінні в RegisterUDF () Потім запустіть RegisterUDF () знову командувати.

    Якщо ви хочете скасувати всі зроблені налаштування і очистити опис функції, виконайте цей код:

    Sub UnregisterUDF () Application.MacroOptions Macro: = "GetMaxBetween" , _ Description: = Empty , ArgumentDescriptions: = Empty , Category: = Empty End Sub

    Існує ще один спосіб отримати підказку при введенні користувацької функції. Введіть назву функції і натисніть комбінацію клавіш Ctrl + Shift + A :

    =GetMaxBetween( + Ctrl + Shift + A

    Ви побачите список всіх аргументів функції:

    На жаль, тут ви не побачите опису функції та її аргументів, але якщо назви аргументів досить інформативні, то вони теж можуть бути корисними. Втім, це краще, ніж нічого :)

    Потрібно буде ще трохи попрацювати над створенням інтеллісенсів для ЄДС, які працюють як стандартні функції Excel. На жаль, Microsoft не надає жодних варіантів. Єдиним доступним рішенням на даний момент є розширення Excel-DNA IntelliSense. Більш детальну інформацію можна знайти на сайті розробника.

    Сподіваємося, ці інструкції допоможуть вам вирішити проблеми, коли ваша користувацька функція не працює або працює не так, як вам хотілося б. Якщо ж ваш UDF все ж не працює, будь ласка, точно опишіть вашу проблему в розділі "Коментарі". Ми постараємося розібратися і знайти рішення для вас ;)

    Майкл Браун — відданий ентузіаст технологій із пристрастю до спрощення складних процесів за допомогою програмних засобів. Маючи понад десятирічний досвід роботи в технологічній індустрії, він відточив свої навички роботи з Microsoft Excel і Outlook, а також із Google Таблицями та Документами. Блог Майкла присвячений тому, щоб поділитися своїми знаннями та досвідом з іншими, надаючи прості поради та навчальні посібники для підвищення продуктивності та ефективності. Незалежно від того, чи є ви досвідченим професіоналом чи початківцем, блог Майкла пропонує цінну інформацію та практичні поради щодо отримання максимальної користі від цих основних програмних інструментів.