Оглавление
Мы продолжаем серию уроков о пользовательских функциях. В наших предыдущих статьях мы познакомились с пользовательскими функциями и научились их создавать и использовать. В этом руководстве мы рассмотрим особенности использования этих функций и увидим различия между UDF и макросами VBA.
В этом учебнике мы узнаем следующее:
Мы надеемся, что эта статья расширит ваши знания о UDF и поможет вам еще более эффективно использовать их в своих рабочих книгах Excel.
Являются ли UDF и макрос одним и тем же?
И функции, определяемые пользователем, и макросы VBA создаются с помощью редактора VBA. В чем разница между ними и чему отдать предпочтение?
Самое главное отличие заключается в том, что функция выполняет вычисление, а макрос - какое-то действие. Функция, определяемая пользователем, как и обычная функция Excel, должна быть записана в ячейке. В результате ее выполнения ячейка возвращает какое-то значение. При этом невозможно изменить значения других ячеек, а также некоторые свойства текущей ячейки (в частности,форматирования). Однако в формулах условного форматирования можно использовать пользовательскую функцию.
UDF и макрос VBA работают по-разному. Например, когда вы создаете UDF в редакторе Visual Basic, вы начинаете с утверждения Функция и заканчивать Конечная функция Когда вы записываете макрос, вы начинаете с утверждения Sub и заканчивать End Sub.
Не все операторы Visual Basic могут быть использованы для создания UDF. По этой причине макрос является более универсальным решением.
Макрос не требует от пользователя передачи каких-либо аргументов (и не может принимать аргументы), в отличие от функции, определяемой пользователем.
Дело в том, что некоторые команды макросов могут использовать адреса ячеек или элементы форматирования (например, цвет). Если вы перемещаете ячейки, добавляете или удаляете строки и столбцы, изменяете формат ячеек, то вы можете легко "сломать" свои макросы. Это особенно возможно, если вы делитесь своим файлом с коллегами, которые не знают, как работают ваши макросы.
Например, у вас есть файл с прекрасно работающим макросом. Эта формула вычисляет процентное содержание ячеек A1 - A4. Макрос изменяет цвет этих ячеек на желтый. В активной ячейке устанавливается процентный формат.
Если вы или кто-то другой решит вставить новый ряд, макрос продолжит искать значение в ячейке A4 (параметр 4,1 в вашем UDF), потерпит неудачу и вернет ошибку:
В данном случае ошибка возникла из-за деления на ноль (нет значения во вновь добавленной строке). Если макрос выполняет, допустим, суммирование, то вы просто получите неверный результат, но не будете знать об этом.
В отличие от макросов, функции, определяемые пользователем, не могут привести к такой неприятной ситуации.
Ниже показано выполнение тех же вычислений с использованием UDF. Здесь вы можете указать ячейки ввода в любом месте рабочего листа и не столкнетесь с неожиданными проблемами при их изменении.
Я написал следующую формулу в C3:
=UDF_vs_Macro(A1,A4)
Затем я вставил пустой ряд, и формула изменилась, как показано на скриншоте выше.
Теперь мы можем перемещать ячейку ввода или ячейку с функцией куда угодно. Результат всегда будет правильным.
Дополнительным преимуществом использования UDF является то, что они автоматически обновляются при изменении значения в ячейке ввода. При использовании макросов необходимо всегда следить за тем, чтобы все данные были актуальными.
Учитывая этот пример, я бы предпочел использовать UDF везде, где это возможно, и использовать макросы только для других действий, не связанных с вычислениями.
Ограничения и недостатки использования UDF
Я уже упоминал о преимуществах UDF выше. Если говорить коротко, то она может выполнять вычисления, которые невозможны с помощью стандартных функций Excel. Кроме того, она может сохранять и использовать длинные и сложные формулы, превращая их в одну функцию. И вам не придется писать сложные формулы снова и снова.
Теперь давайте более подробно поговорим о недостатках ОДС:
- Создание UDF требует использования VBA. Это невозможно обойти. Это означает, что пользователь не может записать UDF так же, как макрос Excel. Вы должны создать UDF самостоятельно. Однако вы можете скопировать и вставить части ранее записанного кода макроса в свою функцию. Вам просто нужно знать об ограничениях пользовательских функций.
- Еще одним недостатком UDF является то, что, как и любая другая функция Excel, она может вернуть в ячейку только одно значение или массив значений. Она просто выполняет вычисления, не более того.
- Если вы хотите поделиться своей рабочей книгой с коллегами, не забудьте сохранить свои UDF в том же файле. В противном случае ваши пользовательские функции не будут работать для них.
- Пользовательские функции, созданные с помощью редактора VBA, работают медленнее, чем обычные функции. Это особенно заметно в больших таблицах. К сожалению, VBA пока является очень медленным языком программирования. Поэтому, если у вас много данных, старайтесь по возможности использовать стандартные функции или создавать UDF с помощью функции LAMBDA.
Ограничения пользовательских функций:
- UDF предназначены для выполнения вычислений и возврата значения. Их нельзя использовать вместо макросов.
- Они не могут изменять содержимое других ячеек (только активной ячейки).
- Имена функций должны соответствовать определенным правилам. Например, нельзя использовать имя, совпадающее с именем собственной функции Excel или адресом ячейки, например AB123.
- Ваша пользовательская функция не может содержать пробелы в имени, но может включать символ подчеркивания. Однако предпочтительнее использовать заглавные буквы в начале каждого нового слова (например, GetMaxBetween).
- UDF не может копировать и вставлять ячейки в другие области рабочего листа.
- Они не могут изменить активный рабочий лист.
- UDF не могут изменить форматирование активной ячейки. Если вы хотите изменить форматирование ячейки при отображении различных значений, вам следует использовать условное форматирование.
- Они не могут открывать дополнительные книги.
- Их нельзя использовать для запуска макросов с помощью Application.OnTime.
- Пользовательская функция не может быть создана с помощью макрорекордера.
- Функции не появляются в Разработчик> Макросы диалог.
- Ваши функции появятся в диалоговом окне ( Вставка> Функция ) и в списке функций, только если они объявлены как Общественность (это значение используется по умолчанию, если не указано иное).
- Любые функции, объявленные как Частный не будет отображаться в списке функций.
Довольно медленная работа, а также некоторые ограничения в использовании могут заставить вас задуматься: "Для чего нужны эти пользовательские функции?".
Они могут пригодиться, и пригодятся, если мы будем помнить об ограничениях, накладываемых на них. Если вы научитесь правильно создавать и использовать UDF, вы сможете написать свою библиотеку функций. Это значительно расширит ваши возможности по работе с данными в Excel.
Что касается меня, то пользовательские функции помогают экономить время. А что насчет вас? Вы уже пробовали создать собственную UDF? Понравилось ли вам это больше, чем базовые функции Excel? Давайте обсудим это в комментариях :)