Оглавление
В этой статье мы рассмотрим проблемы, с которыми вы можете столкнуться при использовании пользовательских функций в рабочих книгах. Я постараюсь показать, что их вызывает и как легко их можно решить.
Вот о чем мы будем говорить:
Ранее мы говорили о том, что такое пользовательская функция, как ее создавать и использовать. Если вы чувствуете, что вам необходимо освежить базовые знания о UDF, сделайте паузу и просмотрите мою предыдущую статью.
Почему Excel UDF не пересчитывается?
Когда вы вносите изменения в рабочую книгу, Excel не будет пересчитывать каждую формулу, которая там есть. Он обновит результаты только для тех формул, которые связаны с измененными ячейками.
Но это касается стандартных функций Excel. Что касается пользовательских, Excel не может проверить код VBA и определить другие ячейки, которые также могут повлиять на результат пользовательской функции. Поэтому ваша пользовательская формула может не измениться при внесении изменений в рабочую книгу.
Чтобы решить эту проблему, вам нужно просто использовать функцию Применение.Волатильность заявление. ознакомьтесь со следующей главой, чтобы узнать пошаговую инструкцию по его применению.
Энергозависимые и энергонезависимые пользовательские функции
По умолчанию пользовательские функции в Excel не являются волатильными. Это означает, что UDF пересчитывается, только если изменяется значение любой из ячеек, на которые она ссылается. Но если изменится формат ячеек, имя рабочего листа, имя файла, то никаких изменений в UDF не произойдет.
Перейдем от слов к примерам. Например, вам нужно записать имя рабочей книги в ячейку. Для этого вы создаете пользовательскую функцию:
Function WorkbookName() As String WorkbookName = ThisWorkbook.Name End Function
Теперь представьте следующий случай. Вы написали пользовательскую формулу =WorkbookName() в ячейку и получил там имя файла. через некоторое время вы решили переименовать файл и сохранили его под другим именем. но вы смотрите на значение в ячейке и видите, что оно не изменилось. там осталось старое имя файла, которое уже не подходит.
Поскольку в этой функции нет аргументов, функция не пересчитывается (даже если вы измените имя рабочей книги, закроете ее, а затем снова откроете).
Примечание. Чтобы пересчитать все функции в вашем файле, вы можете использовать сочетание клавиш Ctrl + Alt + F9.
Есть ли более простой способ? Чтобы формула пересчитывалась при каждом изменении рабочего листа, вам понадобится дополнительная строка кода. Вставьте следующий фрагмент кода в начало вашей функции:
Применение.Волатильность
Таким образом, ваш код будет выглядеть следующим образом:
Function WorkbookName() As String Application.Volatile WorkbookName = ThisWorkbook.Name End Function
Теперь ваш UDF непостоянен, поэтому он будет автоматически пересчитываться, если любая ячейка рабочего листа была пересчитана или произошло какое-либо изменение в рабочей книге. Как только вы измените имя файла, вы сразу же увидите обновление.
Примечание. Помните, что слишком большое количество волатильных функций может замедлить работу вашего Excel. В конце концов, существует слишком много пользовательских функций, которые постоянно выполняют сложные вычисления и оперируют большими диапазонами данных.
Поэтому я рекомендую использовать волатильность только там, где она действительно необходима.
Почему пользовательские функции недоступны
Когда вы вводите первые буквы названия пользовательской функции, она появляется в раскрывающемся списке рядом с ячейкой ввода, как и стандартные функции Excel.
Однако это происходит не всегда. Какие ошибки могут привести к такой ситуации?
Если у вас Excel 2003-2007, то UDF никогда не появляется в выпадающем списке. Там можно увидеть только стандартные функции.
Но даже если вы используете более новую версию Excel, есть еще одна ошибка, которую вы можете случайно совершить.
Пользовательская функция должна находиться в стандартном модуле VBA под названием Modules. Когда вы добавляете новый модуль для записи кода функции, автоматически создается папка Modules, в которую записываются все модули.
Но иногда случается, что новый модуль не создается. На следующем снимке экрана видно, что код пользовательской функции находится в модуле "Microsoft Excel Objects" вместе с 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 'описание аргументов функции ' Регистрация функции GetMaxBetween 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 () Вы можете назвать ее любой из существующих категорий: Math & Trig, Statistical, Logical, etc. Вы можете указать имя новой категории, в которую вы будете помещать создаваемые вами функции. Если вы не используете аргумент Category, то пользовательская функция будет автоматически помещена в категорию "User Defined".
Вставьте код функции в окно модуля:
Затем нажмите на кнопку "Выполнить". Команда выполнит все настройки для использования программы 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
Вы увидите список всех аргументов функции:
К сожалению, здесь вы не увидите описания функции и ее аргументов. Но если названия аргументов достаточно информативны, то и они могут быть полезны. Все же это лучше, чем ничего :)
Для создания intellisense для UDF, которые работают как стандартные функции Excel, потребуется немного больше работы. К сожалению, Microsoft не предоставляет никаких вариантов. Единственным доступным решением на данный момент является расширение Excel-DNA IntelliSense. Более подробную информацию можно найти на сайте разработчика.
Надеемся, эти рекомендации помогут вам решить проблемы, когда ваша пользовательская функция не работает или работает не так, как вам хотелось бы. Если все же ваша UDF не работает, пожалуйста, точно опишите вашу проблему в разделе Комментарии. Мы постараемся разобраться и найти решение для вас ;)