Да и нет. В этом случае это не так уж сложно; однако в нем также не будет полезных всплывающих подсказок и описаний, которые есть у обычных функций Excel.
Вы также должны знать, что пользовательские функции доступны только для рабочих книг, содержащих их код. Исключение составляют файл PERSONAL
(автоматически созданный во время первой записи макроса и всегда открываемый в фоновом режиме) и надстройки. Если вы являетесь единственным человеком, использующим эту формулу, любой из этих вариантов, вероятно, сработает, и вам потребуется код только в одном месте. Если вы намереваетесь использовать эту формулу в книгах для других людей, простейшим решением, вероятно, будет размещение пользовательского UDF в каждой книге, которая будет его использовать. Однако вы также можете добавить UDF в новую рабочую книгу, сохранить ее как надстройку и распространить среди всех, кто также использует рабочие книги. Разумеется, любое из этих решений может иметь проблемы с разрешениями макробезопасности, поскольку в Excel по умолчанию обычно используется «запуск с разрешением» или «никогда не запускаться».
Как правило, с помощью VBA вы часто можете добавлять Application.
перед именами функций рабочего листа, чтобы позволить VBA использовать их, как обычно. Если вы откроете редактор кода, вы можете добавить Модуль (не модуль класса или пользовательскую форму, просто обычный модуль) и набрать Function FunctionName
. VBA автоматически добавит необходимые End Function
. Вам просто нужно добавить требуемый код между этими двумя строками.
Несколько замечаний
Если вы решили переименовать модуль, в который вводите код, не сопоставляйте имя модуля с именем функции. Это смущает Excel.
При создании пользовательских функций в VBA новые программисты иногда забывают, как заставить функцию возвращать значение. Вы делаете это, присваивая возвращаемое значение функции до конца функции (вы сможете увидеть, как это делается в прилагаемом коде).
Для вашего конкретного уравнения функции MATCH и INDEX работают должным образом при изменении на Application.Match
и Application.Index
. К сожалению, функция OFFSET не работает. В вашем сценарии вы используете функцию OFFSET для ее изменения размера. Поскольку все параметры, которые вы хотите передать, это диапазоны, вы можете использовать свойство диапазона .Resize
, чтобы сделать эквивалент исходного смещения.
Я позволил себе переименовать переменные в ваших уравнениях в более описательные (английские) термины; не стесняйтесь переименовывать их при желании (вам придется выполнить поиск / замену, так как редактор VBA не будет автоматически изменять ссылки на переменную, если имя переменной меняется). При использовании UDF, если вы используете Ctrl+Shift+A
после ввода имени UDF в строке формул, имена параметров будут заполнены (ярлык предоставлен JustinJDavies ) Если вы предпочитаете получать подсказки для вашего UDF, это может помочь
Код
Это может быть не самый лучший или самый эффективный способ написания этого конкретного UDF; однако он должен быть функциональным (обратите внимание: вам может потребоваться изменить ,
на ;
, я не уверен, что специфичные для языка аспекты функций Excel переносятся в редактор кода VBA). Если вы хотите попытаться найти лучший способ кодирования этого или любого другого фрагмента функционального кода, попробуйте зайти на форум Code Review .
Function MYUDF(SearchArea As Range, RowMatch As Range, ColumnMatch As Range)
MYUDF = Application.Index(SearchArea, Application.Match(RowMatch, SearchArea.Resize(, 1), 0), Application.Match(ColumnMatch, SearchArea.Resize(1), 0))
End Function