Как в excel вызвать созданную функцию

Excel для Microsoft 365 Excel 2019 Excel 2016 Excel 2013 Excel 2010 Еще…Меньше

Настраиваемая функция использует язык формул M, принимает набор входных значений, а затем возвращает одно выходное значение. Если вы хотите повторно использовать логику или применить один и тот же набор преобразований к другому запросу или значению, можно создать пользовательскую функцию и при необходимости создать ее. Создать пользовательскую функцию можно несколькими способами: 

  • Используйте расширенный редактор, чтобы добавить собственное заявление let и начать с нуля.

  • Используйте команду Вызвать пользовательскую функцию.

  • Существуют дополнительные способы создания функций, которые не рассмотрены в этом разделе справки, включая команды Создать функцию и Добавить как запрос. Подробное обсуждение см. в дополнительных функциях Power Query M (docs.com)и Использование пользовательских функций (docs.com).

Ниже приводится простой пример пользовательской функции, которая следует за давной программированием.

  1. Чтобы создать пустой запрос, Excel Выберите данные> Получить

          данные > из других источников > Запрос .

    Power Query      Щелкните правой кнопкой мыши пустое место в области Запросы слева и выберите новый запрос > другие источники > Запрос.

  2. В области Запросы слева дважды щелкните имя и переименуйте новый пустой запрос в HelloWorld.

  3. Выберите новый запрос и выберите Главная> расширенный редактор.

  4. Замените исходный код шаблона следующим кодом:

    let

         HelloWorld = () => («Hello World»)

    in

         HelloWorld

  5. Нажмите Готово.

  6. Вы изменили запрос HelloWorld на пользовательскую функцию. Обратите внимание на значок Значок функции слева от нее.

  7. Чтобы вызвать функцию, выберите ее, а затем выберите Вызвать в режиме предварительного просмотра данных.

    Ссылки на пользовательскую функцию HelloWorld

  8. Результаты функции отображаются в режиме предварительного просмотра данных и добавляются в области Запросы в качестве запроса с именем по умолчанию (Функция Invoked). Вы можете переименовать его, чтобы он был более осмысленным, например HelloWorldResult.

  9. Выберите этот запрос, а затем на ленте> закрыть & загрузить, чтобы увидеть результаты на этом.

Результаты 

Результаты HelloWorld на

В следующем примере показано, как передать параметр настраиваемой функции, чтобы преобразовать десятичной номер в hexadecimal.

  1. Чтобы создать пустой запрос, Excel Выберите данные> Получить

          данные > из других источников > Запрос .

    Power Query      Щелкните правой кнопкой мыши пустое место в области Запросы слева и выберите новый запрос > другие источники > Запрос.

  2. В области Запросы слева переименуйте новый пустой запрос в MyHex.

  3. Выберите новый запрос и выберите Главная> расширенный редактор.

  4. Замените исходный код шаблона следующим кодом:

    let

         MyHex = (parameter1) => Number.ToText(parameter1,»X»)

    in

         MyHex

  5. Нажмите Готово.

  6. Вы изменили запрос «MyHex» на пользовательскую функцию. Обратите внимание на значок Значок функции слева от нее.

  7. Чтобы вызвать функцию, выберите ее, а затем в окне Просмотр данных введите число в поле параметра1 и выберите Вызвать.

    Ссылки на пользовательскую функцию MyHex

  8. Результаты функции отображаются в режиме предварительного просмотра данных и добавляются в области Запросы в качестве запроса с именем по умолчанию (Функция Invoked). Вы можете переименовать его, чтобы он был более осмысленным, например MyHexResult.

  9. Выберите этот запрос, а затем на ленте> закрыть & загрузить, чтобы увидеть результаты на этом.

Результаты 

Результат функции MyHex на

Если вы создали функцию с хотя бы одним параметром, можно вызвать ее как пользовательскую функцию, чтобы создать новый столбец и новое значение для каждой строки в таблице.

  1. Чтобы открыть запрос, найдите ранее загруженную из редактора Power Query, выберем ячейку в данных и выберите запрос> изменить. Дополнительные сведения см. в статьи Создание, изменение и загрузка запроса в Excel (Power Query).

    Примечание    В этом примере запросу требуется по крайней мере один столбец типа данных «Целое число».

  2. Создайте пользовательскую функцию MyHex, как объясняется в разделе Создание и вызов настраиваемой функции с параметром с расширенным редактором.

  3. В запросе выберите добавить столбец >вызвать пользовательскую функцию. Появится диалоговое окно Вызвать пользовательскую функцию.

  4. В поле Имя нового столбца введите новое имя столбца, например «HexConvert».

  5. Выберите имя предопределяемой настраиваемой функции в перепаде Запрос функции. В этом примере выберите «MyHex».

  6. Так как пользовательская функция ссылается на параметр, он теперь отображается.

  7. Выберите столбец типа данных «Целое число» в качестве параметра функции.

    Диалоговое окно "Вызвать пользовательскую функцию"

  8. Нажмите кнопку ОК.


Результат

Будет создан новый столбец, в который будет добавлено hexadecimal значение столбца «Целое число», введенного в качестве параметра.

Новый столбец значений MyHex на

См. также

Справка по Power Query для Excel

Создание формул Power Query в Excel

Создание запроса с параметрами

Управление запросами

Функции Power Query M (docs.com)

Использование пользовательских функций (docs.com)

Нужна дополнительная помощь?

Skip to content

Как правильно сохранить и применять пользовательскую функцию Excel

Сегодня мы продолжим изучение пользовательских функций Excel. Поскольку вы уже знаете, как их создавать (и, я надеюсь, вы также пробовали применять их), давайте копнем немного глубже и узнаем, как использовать и хранить определяемые пользователем функции в Excel.

Мы покажем вам, как легко сохранить ваши функции в файле надстройки Excel, чтобы использовать их позже буквально несколькими нажатиями мышки.

Вот о чем мы будем говорить:

  • Совместное использование с другими функциями
  • Применение в других функциях и макросах VBA
  • Как вызвать функцию из другой книги
  • Использование файла надстройки (рекомендуется)

Использование с другими функциями

После того, как вы проверили, что ваши пользовательские функции работают правильно, их можно использовать в формулах Excel или в коде VBA.

Пользовательские функции в рабочей книге Excel можно применять точно так же, как вы применяете обычные функции. Например, просто запишите в ячейке формулу

=GetMaxBetween(A1:A6;10;50)

Их также можно использовать в сочетании с обычными функциями. Например, добавим поясняющий текст к рассчитанному максимальному значению:

=СЦЕПИТЬ(«Максимальное значение между 10 и 50 –  «;GetMaxBetween(A1:A6;10;50))

Результат вы видите на скриншоте ниже:

Можно найти товар, количество которого максимальное  и находится в диапазоне от 40 до 50.

В формуле

=ИНДЕКС(A2:A9;ПОИСКПОЗ(GetMaxBetween(B2:B9;F1;F2);B2:B9;0))

пользовательская функция GetMaxBetween находит в диапазоне B2:B9 максимальное число между 40 и 50. Затем при помощи функций ИНДЕКС+ПОИСК мы получаем название товара, которое соответствует этому максимальному значению:

Как видите, использование настраиваемых функций ничем не отличается от обычных функций Excel.

При этом помните, что пользовательская функция может только возвращать значение, но не может выполнять никакие другие действия. Более подробно об ограничениях пользовательских функций читайте здесь.

Применение в других функциях и процедурах VBA

Пользовательские функции также можно использовать в макросах VBA.

На скриншоте ниже вы видите код макроса, который в столбце, содержащем активную ячейку, ищет максимальное значение в диапазоне от 10 до 50.

Код макроса содержит пользовательскую функцию GetMaxBetween(.Cells, 10, 50). Она находит нужное максимальное значение в активном столбце. Затем это значение будет выделено цветом.

Результат работы макроса вы видите на скриншоте ниже.

Также пользовательская функция может быть использована внутри другой пользовательской функции. Проблема конвертации числа в текст обычно решается при помощи пользовательской функции. Функция SpellNumber отлично выполняет эту задачу, добавляя также денежные единицы измерения (рубли). Вот код этого макроса:

Public Function SpellNumber(x As Double) As String
If x > 999999999999.99 Then
SpellNumber = "Число больше 999 999 999 999.99!"
ElseIf x < 0 Then
SpellNumber = "Отрицательное число!"
Else
x = FormatNumber(x, 2)
Dim b As Byte, b1 As Byte, b2 As Byte, kop As String
b = (x - Fix(x)) * 100
b2 = b  10
b1 = b Mod 10
If b2 <> 1 And b1 = 1 Then
kop = " копейка"
ElseIf b2 <> 1 And b1 > 1 And b1 < 5 Then
kop = " копейки"
Else
kop = " копеек"
End If
kop = b2 & b1 & kop
Dim y(1 To 4) As Integer, i1 As Byte
For i1 = 1 To 4
x = Fix(x) / 1000
y(i1) = (x - Fix(x)) * 1000
Next
Dim Numeric(1 To 4) As String, i2 As Byte, y1 As Byte, y2 As Byte, _
y3 As Byte, Numeric0 As String, Numeric1 As String, Numeric2 As String, Numeric3 As String, _
Numeric4 As String
For i2 = 1 To 4
y1 = y(i2) Mod 10
y2 = (y(i2) - y1) / 10 Mod 10
y3 = y(i2)  100
Numeric1 = Choose(y3 + 1, "", "сто ", "двести ", "триста ", "четыреста ", _
"пятьсот ", "шестьсот ", "семьсот ", "восемьсот ", "девятьсот ")
Numeric2 = Choose(y2 + 1, "", "", "двадцать ", "тридцать ", "сорок ", _
"пятьдесят ", "шестьдесят ", "семьдесят ", "восемьдесят ", "девяносто ")
If y2 = 1 Then
Numeric3 = Choose(y1 + 1, "десять ", "одиннадцать ", "двенадцать ", _
"тринадцать ", "четырнадцать ", "пятнадцать ", "шестнадцать ", _
"семнадцать ", "восемнадцать ", "девятнадцать ")
ElseIf y2 <> 1 And i2 = 2 Then
Numeric3 = Choose(y1 + 1, "", "одна ", "две ", "три ", "четыре ", "пять ", _
"шесть ", "семь ", "восемь ", "девять ")
Else
Numeric3 = Choose(y1 + 1, "", "один ", "два ", "три ", "четыре ", "пять ", _
"шесть ", "семь ", "восемь ", "девять ")
End If
If y2 <> 1 And y1 = 1 Then
Numeric4 = Choose(i2, "рубль ", "тысяча ", "миллион ", "миллиард ")
ElseIf y2 <> 1 And y1 > 1 And y1 < 5 Then
Numeric4 = Choose(i2, "рубля ", "тысячи ", "миллиона ", "миллиарда ")
ElseIf y1 = 0 And y2 = 0 And y3 = 0 Then
Numeric4 = Choose(i2, "рублей ", "", "", "")
Else
Numeric4 = Choose(i2, "рублей ", "тысяч ", "миллионов ", "миллиардов ")
End If
Numeric(i2) = Numeric1 & Numeric2 & Numeric3 & Numeric4
Next
If y(1) + y(2) + y(3) + y(4) = 0 Then
Numeric0 = "ноль рублей " & kop
Else
Numeric0 = Numeric(4) & Numeric(3) & Numeric(2) & Numeric(1) & kop
End If
SpellNumber = Replace(Numeric0, Left(Numeric0, 1), UCase(Left(Numeric0, 1)), 1, 1)
End If
End Function

Применив вместе уже знакомую нам GetMaxBetween и SpellNumber, мы можем получить максимальное значение из диапазона и сразу записать его в виде текста.

Для этого создадим новую пользовательскую функцию, в которой используем уже знакомые нам функции GetMaxBetween и SpellNumber.

Function SpellGetMaxBetween(rngCells As Range, MinNum, MaxNum)
       SpellGetMaxBetween = SpellNumber(GetMaxBetween(rngCells, MinNum, MaxNum))
End Function

Как видите, функция GetMaxBetween является аргументом другой пользовательской функции – SpellNumber. Сначала она определяет максимальное значение, как мы уже неоднократно делали ранее. Затем это число преобразуется в текст.

На скриншоте выше вы видите, как функция SpellGetMaxBetween находит максимальное число в диапазоне от 5000 до 7000, а затем конвертирует его в текст.

Как вызвать пользовательскую функцию из другой книги

Если вы создали пользовательскую функцию в вашей рабочей книге, то это ещё, к сожалению, не означает, что её можно без проблем везде применять.

По моему опыту, большинство пользователей рано или поздно собирают свою личную коллекцию макросов и пользовательских функций для автоматизации отдельных процессов и расчётов. И тут встает проблема: код пользовательских функций на Visual Basic нужно где-то хранить, чтобы потом использовать в работе.

Чтобы применить пользовательскую функцию, рабочая книга, в которой вы ее сохранили, должна быть открыта в вашем Excel. Если вы это не сделали, то при попытке использования вы получите ошибку #ИМЯ!. Эта ошибка говорит о том, что Excel не знает имени функции, которую вы хотите употребить в формуле.

Рассмотрим способы, при помощи которых вы можете использовать созданные настраиваемые функции.

Способ 1.

Вы можете перед именем функции указать имя книги, в которой она находится. Например, если вы сохранили пользовательскую функцию GetMaxBetween в книге с именем My_Functions.xlsm, то необходимо ввести такую формулу:

= My_Functions.xlsm!GetMaxBetween(A1:A6;10;50)

Способ 2.

Сохраняем все пользовательские функции в одной специальной рабочей книге (например, My_Functions.xlsm ) и копируем из нее нужную функцию в текущую рабочую книгу в случае необходимости. Тогда не нужно будет указывать имя файла, как это сделано выше.

При создании каждой новой пользовательской функции вам необходимо дублировать ее код в ту книгу, в которой вы будете ее использовать. При таком способе возникает несколько неудобств:

  • Если рабочих файлов много, а функция нужна везде, то и копировать код придется в каждую книгу.
  • Нужно не забыть сохранить рабочую книгу в формате с поддержкой макросов (xlsm или xlsb).
  • При открытии такого файла защита от макросов будет каждый раз показывать предупреждение, которое нужно подтвердить. Многие пользователи пугаются, видя предупреждение на жёлтой полосе, которое просит их включить макросы. Чтобы не видеть это сообщение, вам нужно отключить защиту Excel полностью. Это может быть не всегда правильно и безопасно.

Думаю, вы согласитесь со мной, что все время открывать файл и копировать из него код пользовательских функций или писать название этого файла в формуле – это не самые удачные решения.

Способ 3.

Думаю, что самый лучший способ – хранить часто используемые пользовательские функции в файле надстройки (Excel Add-in).

Достоинства использования надстройки:

  • Достаточно один раз подключить надстройку в ваш Excel. После этого можно использовать её процедуры и функции в любом файле на этом компьютере. Сохранять ваши рабочие книги в xlsm- и xlsb-формате не потребуется, так как исходный код будет храниться не в них, а в файле надстройки.
  • Защита от макросов вас беспокоить уже не будет, так как надстройки всегда относятся к доверенным источникам. Она будет автоматически загружаться при каждом запуске Excel практически незаметно для вас.
  • Надстройка ­– это отдельный файл. Его легко переносить с компьютера на компьютер, делиться им с коллегами.

О создании и использовании надстройки мы подробнее поговорим далее.

Сохранение пользовательских функций в файле надстройки

Как создать собственную надстройку? Рассмотрим пошагово.

Шаг 1. Создаем файл надстройки.

Открываем Microsoft Excel, создаем новую книгу и сохраняем ее под любым подходящим именем (например My_Functions) в формате надстройки. Для этого используем меню Файл – Сохранить как или клавишу F12. Обязательно указываем тип файла Надстройка Excel:

Ваша надстройка будет иметь расширение .xlam.

Обратите внимание, что стандартно Excel хранит надстройки в папке C:Users[Ваше_имя]AppDataRoamingMicrosoftAddIns. Советую принять расположение по умолчанию. Вы можете указать любую другую папку. Но тогда при подключении надстройки вам нужно будет найти и указать ее новое расположение вручную. Если вы сохраните ее в папке по умолчанию, вам не придется искать надстройку на своем компьютере. Excel автоматически внесет ее в список.

Шаг 2. Подключаем файл надстройки.

Теперь созданную нами надстройку My_Functions надо подключить к Excel. Тогда она будет загружаться автоматически при старте программы. Для этого используем меню Файл — Параметры — Надстройки. Убедитесь, что внизу в поле Управление выбраны Надстройки Excel. Жмем на кнопку Перейти в нижней части окна. В появившемся окне отмечаем нашу надстройку My_Functions. Если вы не видите ее в списке, нажмите кнопку Просмотр и укажите расположение вашего файла надстройки вручную.

Если вы используете надстройку для хранения пользовательских функций, то нужно выполнять одно простое правило. Если вы передаете рабочую книгу другому человеку, то не забудьте также передать копию этой надстройки, которая содержит нужные функции. Он должен подключить ее так же, как вы это сделали сейчас.

Шаг 3. Добавляем в надстройку пользовательские функции и макросы.

Наша надстройка подключена к Excel, но в ней пока нет ничего. Чтобы добавить в нее новые пользовательские функции, откройте редактор Visual Basic при помощи сочетания клавиш Alt+F11. После этого вы можете добавлять новые модули с кодом VBA, как описано в этом руководстве.

Выберите в окне VBAProject ваш файл надстройки (My Finctions.xlam). Используйте меню Insert – Module, чтобы добавить пользовательский модуль. В него нужно записывать пользовательские функции.

Код пользовательской функции вы можете либо набрать вручную, либо скопировать откуда-нибудь.

Вот и все. Теперь вы создали свою собственную надстройку, загрузили ее в Excel и можете использовать в ней макросы и настраиваемые функции. Чтобы добавить новый макрос, просто запишите его код в модуле надстройки в редакторе VBA и сохраните его.

Мы рассмотрели способы создания, отладки пользовательской функции и как ее можно применять в вашей рабочей книге. Надеюсь, эти рекомендации будут вам полезны. Если у вас есть вопросы, пишите в комментариях к этой статье.

Сумма по цвету и подсчёт по цвету в Excel В этой статье вы узнаете, как посчитать ячейки по цвету и получить сумму по цвету ячеек в Excel. Эти решения работают как для окрашенных вручную, так и с условным форматированием. Если…
Проверка данных с помощью регулярных выражений В этом руководстве показано, как выполнять проверку данных в Excel с помощью регулярных выражений и пользовательской функции RegexMatch. Когда дело доходит до ограничения пользовательского ввода на листах Excel, проверка данных очень полезна. Хотите…
Поиск и замена в Excel с помощью регулярных выражений В этом руководстве показано, как быстро добавить пользовательскую функцию в свои рабочие книги, чтобы вы могли использовать регулярные выражения для замены текстовых строк в Excel. Когда дело доходит до замены…
Как извлечь строку из текста при помощи регулярных выражений В этом руководстве вы узнаете, как использовать регулярные выражения в Excel для поиска и извлечения части текста, соответствующего заданному шаблону. Microsoft Excel предоставляет ряд функций для извлечения текста из ячеек. Эти функции…
4 способа отладки пользовательской функции Как правильно создавать пользовательские функции и где нужно размещать их код, мы подробно рассмотрели ранее в этой статье.  Чтобы решить проблемы при создании пользовательской функции, вам скорее всего придется выполнить…
Как создать пользовательскую функцию? В решении многих задач обычные функции Excel не всегда могут помочь. Если существующих функций недостаточно, Excel позволяет добавить новые настраиваемые пользовательские функции (UDF). Они делают вашу работу легче. Мы расскажем,…

Создание пользовательской функции в VBA Excel, ее синтаксис и компоненты. Описание пользовательской функции и ее аргументов. Метод Application.MacroOptions.

Пользовательская функция — это процедура VBA, которая производит заданные вычисления и возвращает полученный результат. Используется для вставки в ячейки рабочего листа Excel или для вызова из других процедур.

Объявление пользовательской функции

Синтаксис функции

[Static] Function Имя ([СписокАргументов])[As ТипДанных]

[Операторы]

[Имя = выражение]

[Exit Function]

[Операторы]

[Имя = выражение]

End Function

Компоненты функции

  • Static — необязательное ключевое слово, указывающее на то, что значения переменных, объявленных в функции, сохраняются между ее вызовами.
  • Имя — обязательный компонент, имя пользовательской функции.
  • СписокАргументов — необязательный компонент, одна или более переменных, представляющих аргументы, которые передаются в функцию. Аргументы заключаются в скобки и разделяются между собой запятыми.
  • Операторы — необязательный компонент, блок операторов (инструкций).
  • Имя = выражение — необязательный* компонент, присвоение имени функции значения выражения или переменной. Обычно, значение присваивается функции непосредственно перед выходом из нее.
  • Exit Function — необязательный компонент, принудительный выход из функции, если ей уже присвоено окончательное значение.

*Один из компонентов Имя = выражение следует считать обязательным, так как если не присвоить функции значения, смысл ее использования теряется.

Видимость функции

Видимость пользовательской функции определяется необязательными ключевыми словами Public и Private, которые могут быть указаны перед оператором Function (или Static, в случае его использования).

Ключевое слово Public указывает на то, что функция будет доступна для вызова из других процедур во всех модулях открытых книг Excel. Функция, объявленная как Public, отображается в диалоговом окне Мастера функций.

Ключевое слово Private указывает на то, что функция будет доступна для вызова из других процедур только в пределах программного модуля, в котором она находится. Функция, объявленная как Private, не отображается в диалоговом окне Мастера функций, но ее можно ввести в ячейку вручную.

Если ключевое слово Public или Private не указано, функция считается по умолчанию объявленной, как Public.

Чтобы пользовательская функция всегда была доступна во всех открытых книгах Excel, сохраните ее в Личной книге макросов без объявления видимости или как Public. Но если вы планируете передать рабочую книгу с пользовательской функцией на другой компьютер, код функции должен быть в программном модуле передаваемой книги.

Пример пользовательской функции

Для примера мы рассмотрим простейшую пользовательскую функцию, которой в следующем параграфе добавим описание. Называется функция «Деление», объявлена с типом данных Variant, так как ее возвращаемое значение может быть и числом, и текстом. Аргументы функции — Делимое и Делитель — тоже объявлены как Variant, так как в ячейках Excel могут быть числовые значения разных типов, и функция IsNumeric тоже проверяет разные типы данных и требует, чтобы ее аргументы были объявлены как Variant.

Function Деление(Делимое As Variant, Делитель As Variant) As Variant

  If IsNumeric(Делимое) = False Or IsNumeric(Делитель) = False Then

    Деление = «Ошибка: Делимое и Делитель должны быть числами!»

Exit Function

  ElseIf Делитель = 0 Then

    Деление = «Ошибка: деление на ноль!»

Exit Function

  Else

    Деление = Делимое / Делитель

  End If

End Function

Эта функция выполняет деление значений двух ячеек рабочего листа Excel. Перед делением проверяются два блока условий:

  • Если делимое или делитель не являются числом, функция возвращает значение: «Ошибка: Делимое и Делитель должны быть числами!», и производится принудительный выход из функции оператором Exit Function.
  • Если делитель равен нулю, функция возвращает значение: «Ошибка: деление на ноль!», и производится принудительный выход из функции оператором Exit Function.

Если проверяемые условия не выполняются (возвращают значение False) производится деление чисел и функция возвращает частное (результат деления).

Вы можете скопировать к себе в стандартный модуль эту функцию и она станет доступна в разделе «Определенные пользователем» Мастера функций. Попробуйте вставить функцию «Деление» в ячейку рабочего листа с помощью Мастера и поэкспериментируйте с ней.

Практического смысла функция «Деление» не имеет, но она хорошо демонстрирует как объявляются, создаются и работают пользовательские функции в VBA Excel. А еще она поможет продемонстрировать, как добавлять к функциям и аргументам описания. С полноценной пользовательской функцией вы можете ознакомиться здесь.

Добавление описания функции

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

  • Запустите Мастер функций, посмотрите, как отображается имя нужной функции и закройте его.
  • Откройте список макросов и в поле «Имя макроса» впишите имя пользовательской функции.
  • Нажмите кнопку «Параметры» и в открывшемся окне добавьте или отредактируйте описание.
  • Нажмите кнопку «OK», затем в окне списка макросов — «Отмена». Описание готово!

Добавление описания на примере функции «Деление»:

Добавление описания пользовательской функции в окне «Параметры макроса»

Добавление описания пользовательской функции

Описание функции «Деление» в диалоговом окне Мастера функций «Аргументы функции»:

Описание пользовательской функции в диалоговом окне «Аргументы функции»

Описание пользовательской функции в окне «Аргументы функции»

С помощью окна «Список макросов» можно добавить описание самой функции, а ее аргументам нельзя. Но это можно сделать, используя метод Application.MacroOptions.

Метод Application.MacroOptions

Метод Application.MacroOptions позволяет добавить пользовательской функции описание, назначить сочетание клавиш, указать категорию, добавить описания аргументов и добавить или изменить другие параметры. Давайте рассмотрим возможности этого метода, используемые чаще всего.

Пример кода с методом Application.MacroOptions:

Sub ИмяПодпрограммы()

  Application.MacroOptions _

    Macro:=«ИмяФункции», _

    Description:=«Описание функции», _

    Category:=«Название категории», _

    ArgumentDescriptions:=Array(«Описание 1», «Описание 2», «Описание 3», ...)

End Sub

  • ИмяПодпрограммы — любое уникальное имя, подходящее для наименования процедур.
  • ИмяФункции — имя функции, параметры которой добавляются или изменяются.
  • Описание функции — описание функции, которое добавляется или изменяется.
  • Название категории — название категории в которую будет помещена функция. Если параметр Category отсутствует, пользовательская функция будет записана в раздел по умолчанию — «Определенные пользователем». Если указанное Название категории соответствует одному из названий стандартного списка, функция будет записана в него. Если такого Названия категории нет в списке, будет создан новый раздел с этим названием и функция будет помещена в него.
  • «Описание 1», «Описание 2», «Описание 3», … — описания аргументов в том порядке, как они расположены в объявлении пользовательской функции.

Эта подпрограмма запускается один раз, после чего ее можно удалить или использовать как шаблон для корректировки параметров других пользовательских функций.

Сейчас с помощью метода Application.MacroOptions попробуем изменить описание пользовательской функции «Деление» и добавить описания аргументов.

Sub ИзменениеОписания()

  Application.MacroOptions _

    Macro:=«Деление», _

    Description:=«Описание функции Деление изменено методом Application.MacroOptions», _

    ArgumentDescriptions:=Array(«- любое числовое значение», «- числовое значение, кроме нуля»)

End Sub

После однократного запуска этой подпрограммы получаем следующий результат:

Новое описание пользовательской функции и ее второго аргумента

Новое описание пользовательской функции и ее второго аргумента

Метод Application.MacroOptions не работает в Личной книге макросов, но и здесь можно найти решение. Добавьте описания к пользовательским функциям и их аргументам в обычной книге Excel, затем экспортируйте модуль с функциями в любой каталог на жестком диске и оттуда импортируйте в Личную книгу макросов. Все описания сохранятся.

Функция в функции в Excel

Пример 1: Два условия

Для создания функций в функции Excel можно использовать окно вставки или отдельное поле в главном окне. Пример с двумя условиями проще всего выполнить при помощи первого варианта. Допустим, у нас есть числа в отдельной таблице, при достижении определенного среднего значения которых в отдельной ячейке должна показаться сумма чисел других блоков. Для этого потребуется определиться с первым списком чисел, что видно на прикрепленном ниже скриншоте.

Набор чисел для среднего значения при создании функции в функции Excel

Второе условие — числа, которые будут суммироваться. Их тоже определяем заранее, чтобы было проще создавать функцию.

Набор чисел для суммы при создании функций в функции Excel

Подобная реализация пригодится во многих ситуациях, например, при бухгалтерских расчетах или составлении сметы. В любом случае, это всего лишь пример того, как может выглядеть функция в функции, а пользователь уже сам решает, как эту возможность адаптировать под себя.

  1. Создадим функцию через отдельное окно, нажав по кнопке с тематическим значком.
  2. Кнопка для открытия Мастера функции при работе с программой Excel

  3. Пример базируется на корневой функции «ЕСЛИ», поэтому в окне «Вставка функции» выберите именно ее.
  4. Выбор формулы в Мастере функции при создании корневой функции в Excel

  5. В качестве логического выражения записывайте функцию, считающую среднее значение и определяющую, больше ли оно указанного числа. Тогда строка обретет вид СРЗНАЧ(A1:A6)>300, где A1 и A6 — диапазон захватываемых ячеек, > — знак «больше», а 300 — целевое среднее значение, являющееся истинным.
  6. Ввод логического выражения для функции в функции Excel

  7. Другая функция, используемая внутри корневой, называется «СУММ» — она и будет выводить сумму чисел при истинном значении, поэтому записывается во втором поле в представлении СУММ(C1:D1:E1:F1).
  8. Ввод истинного значения для функции в функции Excel

  9. Если среднее значение не соответствует требованию, выведем любое оповещающее сообщение, например «недостача». Проверьте правильность написания функций и сохраните результат.
  10. Ввод ложного значения для функции в функции Excel

  11. Сейчас функция ЕСЛИ находится в состоянии «истина», а значит, в заданной клетке отобразится сумма указанного диапазона.
  12. Результат первого примера создания функции в функции Excel

  13. Если же условия ложные, всплывет указанное сообщение или 0.
  14. Ложный результат первого примера создания функции в функции Excel

  15. Исходя из увиденного примера, становится понятно, что внутри той же функции ЕСЛИ можно вписать и любую другую функцию, что и выполняет условие рассматриваемой темы. Попробуйте провести эксперименты и заменить рассмотренную функцию на другую, вписав внутри необходимые данные, не забывая и про синтаксис программы.

Еще больше информации об используемом Мастере функций читайте в развернутой инструкции на нашем сайте, где находятся все необходимые сведения, иллюстрирующие работу с инструментом.

Подробнее: Мастер функций в программе Microsoft Excel

Пример 2: Три и более условий

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

Lumpics.ru

  1. Создадим отдельную формулу при использовании все той же корневой функции ЕСЛИ.
    Обзор второго примера создания функции в функции Excel
  2. Начните создавать формулу, нажав по нужной пустой ячейке и написав =ЕСЛИ(B2=C2;»Не изменилась»). Как можно понять, после открывающихся скобок идет первое условие, а при его истине выводится сообщение «Не изменилась».
  3. Начало заполнения корневой функции в функции Excel

  4. Поставьте знак ; и сразу же впишите новую функцию ЕСЛИ без знака =, где внутри содержится второе условие.
  5. Заполнение второго условия для функции в функции Excel

  6. Точно так же поступите с третьим условием и расставьте все закрывающиеся скобки.
  7. Заполнение третьего условия для функции в функции Excel

  8. При сохранении результата вы увидите, что сообщение показывается верно, а также сможете скопировать саму формулу для других ячеек, поменяв только сравнение целевых цен.
  9. Просмотр результата второго примера функции в функции Excel

Для лучшего понимания оставим полную строку формулы с функцией в функции в правильном ее виде =ЕСЛИ(B2=C2;»Не изменилась»;ЕСЛИ(B2C2;»Уменьшилась»))). Если требуется, скопируйте ее и используйте в своих целях, изменив условия и значения.

Еще статьи по данной теме:

Помогла ли Вам статья?

На чтение 31 мин. Просмотров 15.4k.

С помощью VBA вы можете создать пользовательскую функцию, которую можно использовать на листах точно так же, как обычные функции.

Это полезно, когда существующих функций Excel недостаточно. В таких случаях вы можете создать свою собственную пользовательскую функцию (UDF) для удовлетворения ваших конкретных потребностей.

В этом руководстве я расскажу о создании и использовании пользовательских функций в VBA.

Содержание

  1. Что такое функциональная процедура в VBA?
  2. Создание простой пользовательской функции в VBA
  3. Анатомия пользовательской функции в VBA
  4. Аргументы в пользовательской функции в VBA
  5. Создание функции, которая возвращает массив
  6. Понимание объема пользовательской функции в Excel
  7. Различные способы использования пользовательской функции в Excel
  8. Создание надстройки
  9. Сохранение функции в персональной книге макросов
  10. Ссылка на функцию из другой книги
  11. Использование оператора выхода из VBA
  12. Отладка пользовательской функции
  13. Встроенные функции Excel против Пользовательской функции VBA
  14. Где разместить код VBA для пользовательской функции

Что такое функциональная процедура в VBA?

Процедура Function — это код VBA, который выполняет вычисления и возвращает значение (или массив значений).

Используя процедуру Function, вы можете создать функцию, которую вы можете использовать на рабочем листе (как и любую обычную функцию Excel, такую ​​как SUM или VLOOKUP).

Когда вы создали процедуру Function с использованием VBA, вы можете использовать ее тремя способами:

  1. В качестве формулы на рабочем листе, где она может принимать аргументы в качестве входных данных и возвращать значение или массив значений.
  2. Как часть кода вашей подпрограммы VBA или другого кода функции.
  3. В условном форматировании

Хотя на рабочем листе уже имеется более 450 встроенных функций Excel, вам может потребоваться настраиваемая функция, если:

  • Встроенные функции не могут делать то, что вы хотите сделать. В этом случае вы можете создать пользовательскую функцию на основе ваших требований.
  • Встроенные функции могут выполнять работу, но формула длинная и сложная. В этом случае вы можете создать пользовательскую функцию, которую легко читать и использовать

Обратите внимание, что пользовательские функции, созданные с использованием VBA, могут быть значительно медленнее, чем встроенные функции. Следовательно, они лучше всего подходят для ситуаций, когда вы не можете получить результат, используя встроенные функции.

Функция против Подпрограммы в VBA

«Подпрограмма» позволяет вам выполнять набор кода, в то время как «Функция» возвращает значение (или массив значений).

Например, если у вас есть список чисел (как положительных, так и отрицательных), и вы хотите идентифицировать отрицательные числа, вот что вы можете сделать с помощью функции и подпрограммы.

Подпрограмма может проходить через каждую ячейку в диапазоне и может выделять все ячейки, которые имеют отрицательное значение в ней. В этом случае подпрограмма завершает изменение свойств объекта диапазона (путем изменения цвета ячеек).

С пользовательской функцией вы можете использовать ее в отдельном столбце, и она может возвратить TRUE, если значение в ячейке отрицательное, и FALSE, если оно положительное. С помощью функции вы не можете изменять свойства объекта. Это означает, что вы не можете изменить цвет ячейки с помощью самой функции (однако вы можете сделать это, используя условное форматирование с пользовательской функцией).

Когда вы создаете пользовательскую функцию (UDF) с использованием VBA, вы можете использовать эту функцию на листе, как и любую другую функцию. Я расскажу об этом подробнее в разделе «Различные способы использования пользовательских функций в Excel».

Создание простой пользовательской функции в VBA

Позвольте мне создать простую пользовательскую функцию в VBA и показать вам, как она работает.

Приведенный ниже код создает функцию, которая извлекает числовые части из буквенно-цифровой строки.

Function GetNumeric(CellRef As String) as Long
Dim StringLength As Integer
StringLength = Len(CellRef)
For i = 1 To StringLength
If IsNumeric(Mid(CellRef, i, 1)) Then Result = Result & Mid(CellRef, i, 1)
Next i
GetNumeric = Result
End Function

Если у вас есть вышеуказанный код в модуле, вы можете использовать эту функцию в рабочей книге.

Ниже показано, как эту функцию — GetNumeric — можно использовать в Excel.

Using a User Defined Function in Excel - GetNumeric

Теперь, прежде чем я расскажу вам, как эта функция создается в VBA и как она работает, вам нужно знать несколько вещей:

  • Когда вы создаете функцию в VBA, она становится доступной во всей книге, как и любая другая обычная функция.
  • Когда вы вводите имя функции, за которым следует знак равенства, Excel покажет вам имя функции в списке совпадающих функций. В приведенном выше примере, когда я ввел = Get, Excel показал мне список, в котором была моя пользовательская функция.

Я считаю, что это хороший пример, когда вы можете использовать VBA для создания простой в использовании функции в Excel. Вы можете сделать то же самое с формулой (как показано в этом руководстве), но это становится сложным и трудным для понимания. С этим UDF вам нужно передать только один аргумент, и вы получите результат.

Анатомия пользовательской функции в VBA

В приведенном выше разделе я дал вам код и показал, как функция UDF работает на рабочем листе.

Теперь давайте углубимся и посмотрим, как создается эта функция. Вы должны поместить приведенный ниже код в модуль в VB Editor. Я рассматриваю эту тему в разделе «Где разместить код VBA для пользовательской функции».

Function GetNumeric(CellRef As String) as Long
' Эта функция извлекает числовую часть из строки
Dim StringLength As Integer
StringLength = Len(CellRef)
For i = 1 To StringLength
If IsNumeric(Mid(CellRef, i, 1)) Then Result = Result & Mid(CellRef, i, 1)
Next i
GetNumeric = Result
End Function

Первая строка кода начинается со слова «Функция».

Это слово говорит VBA, что наш код является функцией (а не подпрограммой). За словом Function следует имя функции — GetNumeric. Это имя, которое мы будем использовать на листе, чтобы использовать эту функцию.

  • В имени функции не должно быть пробелов. Кроме того, вы не можете назвать функцию, если она конфликтует с именем ссылки на ячейку. Например, вы не можете назвать функцию ABC123, так как она также относится к ячейке на листе Excel.
  • Вы не должны давать своей функции то же имя, что и у существующей функции. Если вы сделаете это, Excel будет отдавать предпочтение встроенной функции.
  • Вы можете использовать подчеркивание, если хотите разделить слова. Например, Get_Numeric является допустимым именем

За именем функции следуют некоторые аргументы в скобках. Это аргументы, которые нужны нашей функции от пользователя. Это как аргументы, которые мы должны предоставить встроенным функциям Excel. Например, в функции COUNTIF есть два аргумента (диапазон и критерии).

Arguments in a user defined function in VBA

В скобках необходимо указать аргументы.

В нашем примере есть только один аргумент — CellRef.

Также полезно указывать, какой аргумент ожидает функция. В этом примере, так как мы будем передавать функции ссылку на ячейку, мы можем указать аргумент как тип «Range». Если вы не укажете тип данных, VBA будет рассматривать его как вариант (что означает, что вы можете использовать любой тип данных).

Argument defined as range in the user defined function

Если у вас есть более одного аргумента, вы можете указать те же в круглых скобках — через запятую. Далее в этом руководстве мы увидим, как использовать несколько аргументов в пользовательской функции.

Обратите внимание, что функция указана как тип данных «String». Это сообщит VBA, что результат формулы будет иметь тип данных String.

Здесь я могу использовать числовой тип данных (например, Long или Double), но это ограничит диапазон возвращаемых чисел. Если у меня есть строка длиной 20 номеров, которую мне нужно извлечь из общей строки, объявление функции как Long или Double приведет к ошибке (так как число будет вне диапазона). Поэтому я сохранил тип выходных данных функции как String.

Defining the Function Output Data type in the custom function

Вторая строка кода — зеленая, которая начинается с апострофа — это комментарий. При чтении кода VBA игнорирует эту строку. Вы можете использовать это, чтобы добавить описание или подробности о коде.

Comment in the User Defined Function in Excel VBA

Третья строка кода объявляет переменную StringLength как тип данных Integer. Это переменная, в которой мы храним значение длины строки, которая анализируется по формуле.

В четвертой строке переменная Result объявляется как тип данных String. Это переменная, в которой мы будем извлекать числа из буквенно-цифровой строки.

Declaring Variables in the UDF custom function in VBA

Пятая строка назначает длину строки во входном аргументе переменной «StringLength». Обратите внимание, что «CellRef» относится к аргументу, который будет предоставлен пользователем при использовании формулы в рабочей таблице (или при использовании ее в VBA — которую мы увидим позже в этом руководстве).

Assigning length of the string to a variable

Шестая, седьмая и восьмая строки являются частью цикла For Next. Цикл выполняется столько раз, сколько символов во входном аргументе. Этот номер задается функцией LEN и присваивается переменной «StringLength».

Таким образом, цикл проходит от «1 до Stringlength».

Внутри цикла оператор IF анализирует каждый символ строки и, если он числовой, добавляет этот числовой символ в переменную Result. Для этого он использует функцию MID в VBA.

For Next Loop in the User Defined Function

Вторая последняя строка кода присваивает значение результата функции. Именно эта строка кода гарантирует, что функция вернет значение «Result» обратно в ячейку (откуда она вызывается).

Assigning Result value to the custom function

Последняя строка кода — End Function. Это обязательная строка кода, которая сообщает VBA, что код функции заканчивается здесь.

End Function as the last line of VBA code

Приведенный выше код объясняет различные части типичной пользовательской функции, созданной в VBA. В следующих разделах мы углубимся в эти элементы, а также увидим различные способы выполнения функции VBA в Excel.

Аргументы в пользовательской функции в VBA

В приведенных выше примерах, где мы создали пользовательскую функцию для получения числовой части из буквенно-цифровой строки (GetNumeric), функция была разработана для получения одного аргумента.

В этом разделе я расскажу, как создавать функции, не имеющие аргументов, для функций, которые принимают несколько аргументов (как обязательных, так и необязательных).

Создание функции в VBA без каких-либо аргументов

В листе Excel у нас есть несколько функций, которые не принимают аргументов (например, RAND, TODAY, NOW).

Эти функции не зависят от входных аргументов. Например, функция TODAY возвращает текущую дату, а функция RAND возвращает случайное число в диапазоне от 0 до 1.

Вы можете создать такую же функцию в VBA.

Ниже приведен код, который даст вам имя файла. Он не принимает никаких аргументов, так как результат, который нужно вернуть, не зависит ни от одного аргумента.

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

Приведенный выше код определяет результат функции как тип данных String (в качестве результата мы хотим получить имя файла, которое является строкой).

Эта функция присваивает функции значение «ThisWorkbook.Name», которое возвращается, когда функция используется на рабочем листе.

Если файл был сохранен, он возвращает имя с расширением файла, в противном случае он просто дает имя.

Выше есть одна проблема, хотя.

Если имя файла изменится, оно не будет автоматически обновлено. Обычно функция обновляется при изменении входных аргументов. Но поскольку в этой функции нет аргументов, функция не пересчитывает (даже если вы измените имя книги, закройте ее, а затем снова откройте).

При желании вы можете форсировать пересчет с помощью сочетания клавиш — Control + Alt + F9.

Чтобы формула пересчитывалась всякий раз, когда в рабочем листе есть изменения, вам нужна строка кода к ней.

Приведенный ниже код заставляет функцию пересчитывать всякий раз, когда происходит изменение в рабочем листе (как и в других аналогичных функциях рабочего листа, таких как функция TODAY или RAND).

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

Теперь, если вы измените имя книги, эта функция будет обновляться всякий раз, когда будут какие-либо изменения в таблице, или когда вы снова откроете эту книгу.

Создание функции в VBA с одним аргументом

В одном из разделов выше мы уже видели, как создать функцию, которая принимает только один аргумент (функция GetNumeric, описанная выше).

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

Функция, созданная с помощью приведенного ниже кода, преобразует ссылочный текст в верхний регистр. Теперь у нас уже есть функция для этого в Excel, и эта функция просто показывает вам, как она работает. Если вам нужно сделать это, лучше использовать встроенную функцию UPPER.

Function ConvertToUpperCase(CellRef As Range)
ConvertToUpperCase = UCase(CellRef)
End Function

Эта функция использует функцию UCase в VBA для изменения значения переменной CellRef. Затем он присваивает значение функции ConvertToUpperCase.

Поскольку эта функция принимает аргумент, нам не нужно использовать здесь часть Application.Volatile. Как только аргумент изменится, функция автоматически обновится.

Создание функции в VBA с несколькими аргументами

Точно так же, как функции рабочего листа, вы можете создавать функции в VBA, которые принимают несколько аргументов.

Приведенный ниже код создаст функцию, которая будет извлекать текст перед указанным разделителем. Он принимает два аргумента — ссылку на ячейку с текстовой строкой и разделитель.

Function GetDataBeforeDelimiter(CellRef As Range, Delim As String) as String
Dim Result As String
Dim DelimPosition As Integer
DelimPosition = InStr(1, CellRef, Delim, vbBinaryCompare) - 1
Result = Left(CellRef, DelimPosition)
GetDataBeforeDelimiter = Result
End Function

Когда вам нужно использовать более одного аргумента в пользовательской функции, вы можете иметь все аргументы в скобках, разделенные запятой.

Обратите внимание, что для каждого аргумента вы можете указать тип данных. В приведенном выше примере «CellRef» был объявлен как тип данных диапазона, а «Delim» был объявлен как тип данных String. Если вы не укажете какой-либо тип данных, VBA считает, что это вариант данных.

Когда вы используете вышеуказанную функцию на листе, вам нужно указать ссылку на ячейку, в которой в качестве первого аргумента указан текст, а в качестве двойного кавычка — символ (ы) в двойных кавычках.

Затем он проверяет положение разделителя с помощью функции INSTR в VBA. Эта позиция затем используется для извлечения всех символов перед разделителем (используя функцию LEFT).

Наконец, он присваивает результат функции.

Эта формула далека от совершенства. Например, если вы введете разделитель, который не найден в тексте, он выдаст ошибку. Теперь вы можете использовать функцию IFERROR на листе, чтобы избавиться от ошибок, или вы можете использовать приведенный ниже код, который возвращает весь текст, когда он не может найти разделитель.

Function GetDataBeforeDelimiter(CellRef As Range, Delim As String) as String
Dim Result As String
Dim DelimPosition As Integer
DelimPosition = InStr(1, CellRef, Delim, vbBinaryCompare) - 1
If DelimPosition < 0 Then DelimPosition = Len(CellRef)
Result = Left(CellRef, DelimPosition)
GetDataBeforeDelimiter = Result
End Function

Мы можем дополнительно оптимизировать эту функцию.

Если вы введете текст (из которого вы хотите извлечь часть перед разделителем) непосредственно в функции, это приведет к ошибке. Давай .. попробуй!

Это происходит, когда мы указали «CellRef» в качестве типа данных диапазона.

Или, если вы хотите, чтобы разделитель находился в ячейке и использовал ссылку на ячейку вместо жесткого кодирования в формуле, вы не можете сделать это с помощью приведенного выше кода. Это потому, что Delim был объявлен как строковый тип данных.

Если вы хотите, чтобы функция имела гибкость, позволяющую принимать прямой ввод текста или ссылки на ячейки от пользователя, вам необходимо удалить объявление типа данных. Это приведет к созданию аргумента в качестве альтернативного типа данных, который может принимать аргументы любого типа и обрабатывать их.

Код ниже сделает это:

Function GetDataBeforeDelimiter(CellRef, Delim) As String
Dim Result As String
Dim DelimPosition As Integer
DelimPosition = InStr(1, CellRef, Delim, vbBinaryCompare) - 1
If DelimPosition < 0 Then DelimPosition = Len(CellRef)
Result = Left(CellRef, DelimPosition)
GetDataBeforeDelimiter = Result
End Function

Создание функции в VBA с необязательными аргументами

В Excel есть много функций, некоторые из которых не являются обязательными.

Например, легендарная функция VLOOKUP имеет 3 обязательных аргумента и один необязательный аргумент.

Optional Argument in the VLOOKUP function

Необязательный аргумент, как следует из названия, указывать необязательно. Если вы не укажете один из обязательных аргументов, ваша функция выдаст вам ошибку, но если вы не укажете необязательный аргумент, ваша функция будет работать.

Но необязательные аргументы не бесполезны. Они позволяют вам выбирать из целого ряда вариантов.

Например, в функции VLOOKUP, если вы не указали четвертый аргумент, VLOOKUP выполняет приблизительный поиск, а если вы указываете последний аргумент как FALSE (или 0), то он выполняет точное совпадение.

Помните, что необязательные аргументы всегда должны идти после всех обязательных аргументов. Вы не можете иметь дополнительные аргументы в начале.

Теперь давайте посмотрим, как создать функцию в VBA с необязательными аргументами.

Функция только с необязательным аргументом

Насколько я знаю, нет встроенной функции, которая принимает только необязательные аргументы (я могу ошибаться, но я не могу думать ни о какой такой функции).

Но мы можем создать один с VBA.

Ниже приведен код функции, которая выдаст вам текущую дату в формате dd-mm-yyyy, если вы не вводите никаких аргументов (т.е. оставьте это поле пустым), и в формате «dd mmmm, yyyy», если вы введете что-либо в качестве аргумента (т. е. что угодно, чтобы аргумент не был пустым).

Function CurrDate(Optional fmt As Variant)
Dim Result
If IsMissing(fmt) Then
CurrDate = Format(Date, "dd-mm-yyyy")
Else
CurrDate = Format(Date, "dd mmmm, yyyy")
End If
End Function

Обратите внимание, что вышеупомянутая функция использует IsMissing, чтобы проверить, отсутствует аргумент или нет. Чтобы использовать функцию IsMissing, необязательный аргумент должен иметь вариантный тип данных.

Вышеуказанная функция работает независимо от того, что вы вводите в качестве аргумента. В коде мы только проверяем, указан ли необязательный аргумент или нет.

Вы можете сделать это более надежным, взяв только определенные значения в качестве аргументов и показывая ошибку в остальных случаях (как показано в приведенном ниже коде).

Function CurrDate(Optional fmt As Variant)
Dim Result
If IsMissing(fmt) Then
CurrDate = Format(Date, "dd-mm-yyyy")
ElseIf fmt = 1 Then
CurrDate = Format(Date, "dd mmmm, yyyy")
Else
CurrDate = CVErr(xlErrValue)
End If
End Function

Приведенный выше код создает функцию, которая показывает дату в формате «дд-мм-гггг», если аргумент не указан, и в формате «дд мммм, гггг», если аргумент равен 1. Во всех других случаях выдается ошибка.

Функция с необходимыми и необязательными аргументами

Мы уже видели код, который извлекает числовую часть из строки.

Теперь давайте рассмотрим похожий пример, который принимает как обязательные, так и необязательные аргументы.

Приведенный ниже код создает функцию, которая извлекает текстовую часть из строки. Если необязательный аргумент равен TRUE, он дает результат в верхнем регистре, а если необязательный аргумент имеет значение FALSE или опущен, он дает результат как есть.

Function GetText(CellRef As Range, Optional TextCase = False) As String
Dim StringLength As Integer
Dim Result As String
StringLength = Len(CellRef)
For i = 1 To StringLength
If Not (IsNumeric(Mid(CellRef, i, 1))) Then Result = Result & Mid(CellRef, i, 1)
Next i
If TextCase = True Then Result = UCase(Result)
GetText = Result
End Function

Обратите внимание, что в приведенном выше коде мы инициализировали значение «TextCase» как False (смотрите в скобках в первой строке).

Сделав это, мы убедились, что необязательный аргумент начинается со значения по умолчанию, то есть FALSE. Если пользователь указывает значение как ИСТИНА, функция возвращает текст в верхнем регистре, а если пользователь указывает необязательный аргумент как ЛОЖЬ или пропускает его, то возвращаемый текст остается как есть.

Создание функции в VBA с массивом в качестве аргумента

До сих пор мы видели примеры создания функции с необязательными / обязательными аргументами, где эти аргументы были одним значением.

Вы также можете создать функцию, которая может принимать массив в качестве аргумента. В функциях листа Excel есть много функций, которые принимают аргументы массива, такие как SUM, VLOOKUP, SUMIF, COUNTIF и т.д.

Ниже приведен код, который создает функцию, которая дает сумму всех четных чисел в указанном диапазоне ячеек.

Function AddEven(CellRef as Range)
 Dim Cell As Range
 For Each Cell In CellRef
 If IsNumeric(Cell.Value) Then
 If Cell.Value Mod 2 = 0 Then
 Result = Result + Cell.Value
 End If
 End If
 Next Cell
 AddEven = Result
 End Function

Вы можете использовать эту функцию на листе и указать диапазон ячеек, в которых в качестве аргумента используются числа. Функция будет возвращать одно значение — сумму всех четных чисел (как показано ниже).

Creating a User Defined Function with an array argument

В приведенной выше функции вместо одного значения мы предоставили массив (A1: A10). Чтобы это работало, вам нужно убедиться, что ваш тип данных аргумента может принимать массив.

В приведенном выше коде я указал аргумент CellRef как Range (который может принимать массив в качестве входных данных). Вы также можете использовать вариантный тип данных здесь.

В коде есть цикл For Each, который проходит через каждую ячейку и проверяет, является ли это число не. Если это не так, ничего не происходит, и он перемещается в следующую ячейку. Если это число, оно проверяет, является ли оно четным или нет (с помощью функции MOD).

В конце все четные числа добавляются, и сумма возвращается обратно в функцию.

Создание функции с неопределенным числом аргументов

При создании некоторых функций в VBA вы можете не знать точное количество аргументов, которые пользователь хочет предоставить. Поэтому необходимо создать функцию, которая может принимать столько аргументов, сколько необходимо, и использовать их для возврата результата.

Примером такой функции рабочего листа является функция SUM. Вы можете предоставить несколько аргументов (например, это):

= SUM (A1, A2: A4, B1: B20)

Вышеупомянутая функция добавит значения во все эти аргументы. Также обратите внимание, что это может быть одна ячейка или массив ячеек.

Вы можете создать такую ​​функцию в VBA, указав последний аргумент (или единственный аргумент) в качестве необязательного. Кроме того, этому необязательному аргументу должно предшествовать ключевое слово «ParamArray».

ParamArray — это модификатор, который позволяет вам принимать столько аргументов, сколько вы хотите. Обратите внимание, что использование слова ParamArray перед аргументом делает аргумент необязательным. Однако вам не нужно использовать здесь слово «Необязательно».

Теперь давайте создадим функцию, которая может принимать произвольное количество аргументов и добавит все числа в указанные аргументы:

Function AddArguments(ParamArray arglist() As Variant)
For Each arg In arglist
AddArguments = AddArguments + arg
Next arg
End Function

Вышеприведенная функция может принимать любое количество аргументов и добавлять эти аргументы для получения результата.

Function with paramarray

Обратите внимание, что в качестве аргумента вы можете использовать только одно значение, ссылку на ячейку, логическое значение или выражение. Вы не можете предоставить массив в качестве аргумента. Например, если один из ваших аргументов — D8: D10, эта формула выдаст вам ошибку.

Если вы хотите использовать оба аргумента из нескольких ячеек, вам нужно использовать следующий код:

Function AddArguments(ParamArray arglist() As Variant)
For Each arg In arglist
For Each Cell In arg
AddArguments = AddArguments + Cell
Next Cell
Next arg
End Function

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

Цель здесь — показать вам, как работает ParamArray, чтобы вы могли разрешить неопределенное количество аргументов в функции. Если вам нужна функция лучше, чем та, которая была создана в приведенном выше коде, используйте функцию SUM на листе.

Создание функции, которая возвращает массив

До сих пор мы видели функции, которые возвращают одно значение.

С помощью VBA вы можете создать функцию, которая возвращает вариант, содержащий целый массив значений.

Формулы массивов также доступны в виде встроенных функций на листах Excel. Если вы знакомы с формулами массива в Excel, вы знаете, что они вводятся клавишами Control + Shift + Enter (а не только Enter). Вы можете прочитать больше о формулах массива здесь. Если вы не знаете формул массива, не беспокойтесь, продолжайте читать.

Давайте создадим формулу, которая возвращает массив из трех чисел (1,2,3).

Код ниже сделает это.

Function ThreeNumbers() As Variant
Dim NumberValue(1 To 3)
NumberValue(1) = 1
NumberValue(2) = 2
NumberValue(3) = 3
ThreeNumbers = NumberValue
End Function

В приведенном выше коде мы указали функцию ThreeNumbers в качестве варианта. Это позволяет ему содержать массив значений.

Переменная NumberValue объявлена как массив из 3 элементов. Он содержит три значения и присваивает его функции «Три числа».

Вы можете использовать эту функцию на рабочем листе. Введите эту функцию и нажмите клавиши Control + Shift + Enter (удерживайте клавиши Control и Shift и затем нажмите Enter).

Creating a function in VBA that returns an array

Когда вы сделаете это, он вернет 1 в ячейке, но в действительности он содержит все три значения. Чтобы проверить это, используйте следующую формулу:

= MAX (ThreeNumbers ())

Используйте вышеуказанную функцию с Control + Shift + Enter. Вы заметите, что теперь результат равен 3, так как это самые большие значения в массиве, возвращаемом функцией Max, которая получает три числа в результате нашей пользовательской функции — ThreeNumbers.

Вы можете использовать ту же технику для создания функции, которая возвращает массив названий месяцев, как показано в приведенном ниже коде:

Function Months() As Variant
Dim MonthName(1 To 12)
MonthName(1) = "Январь"
MonthName(2) = "Февраль"
MonthName(3) = "Март"
MonthName(4) = "Апрель"
MonthName(5) = "Май"
MonthName(6) = "Июнь"
MonthName(7) = "Июль"
MonthName(8) = "Август"
MonthName(9) = "Сентябрь"
MonthName(10) = "Октябрь"
MonthName(11) = "Ноябрь"
MonthName(12) = "Декабрь"
Months = MonthName
End Function

Теперь, когда вы введете функцию = Months () на листе Excel и используете Control + Shift + Enter, она вернет весь массив названий месяцев. Обратите внимание, что вы видите только январь в ячейке, поскольку это первое значение в массиве. Это не означает, что массив возвращает только одно значение.

Creating a function in VBA that returns an array of month names

Чтобы показать вам тот факт, что он возвращает все значения, сделайте это — выберите ячейку с формулой, перейдите на панель формул, выберите всю формулу и нажмите F9. Это покажет вам все значения, которые возвращает функция.

Array formula in VBA - All contents with F9

Вы можете использовать это, используя приведенную ниже формулу INDEX, чтобы получить список всех названий месяцев за один раз.

=INDEX(Months(),ROW())

Array formula in VBA - with Index Function

Теперь, если у вас много значений, не рекомендуется назначать эти значения одно за другим (как мы делали выше). Вместо этого вы можете использовать функцию Array в VBA.

Поэтому тот же код, в котором мы создаем функцию «Месяцы», станет короче, как показано ниже:

Function Months() As Variant
Months = Array("Январь", "Февраль", "Март", "Апрель", "Май", "Июнь", _
"Июль", "Август", "Сентябрь", "Октябрь", "Ноябрь", "Декабрь")
End Function

Вышеупомянутая функция использует функцию Array для назначения значений непосредственно этой функции.

Обратите внимание, что все функции, созданные выше, возвращают горизонтальный массив значений. Это означает, что если вы выберете 12 горизонтальных ячеек (скажем, A1: L1) и введете формулу = Months () в ячейку A1, вы получите все названия месяцев.

Months names in horizontal cells

Но что, если вы хотите эти значения в вертикальном диапазоне ячеек.

Вы можете сделать это, используя формулу TRANSPOSE на листе.

Просто выберите 12 вертикальных ячеек (смежные) и введите приведенную ниже формулу.

getting a vertical array of values from a VBA function

Функция может иметь две области действия — Public или Private.

  • Общая область означает, что функция доступна для всех листов в рабочей книге, а также для всех процедур (вспомогательных и функциональных) во всех модулях в рабочей книге. Это полезно, когда вы хотите вызвать функцию из подпрограммы (мы увидим, как это делается в следующем разделе).
  • Частная область означает, что функция доступна только в том модуле, в котором она существует. Вы не можете использовать его в других модулях. Вы также не увидите его в списке функций на рабочем листе. Например, если имя вашей функции — «Месяцы ()», и вы вводите функцию в Excel (после знака =), она не будет отображать вам имя функции. Однако вы все равно можете использовать его, если вводите название формулы

Если вы ничего не указали, функция по умолчанию является публичной.

Ниже приведена функция, которая является частной функцией:

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

Вы можете использовать эту функцию в подпрограммах и процедурах в тех же модулях, но не можете использовать ее в других модулях. Эта функция также не будет отображаться на листе.

Приведенный ниже код сделает эту функцию публичной. Это также будет отображаться на листе.

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

Различные способы использования пользовательской функции в Excel

Создав пользовательскую функцию в VBA, вы можете использовать ее по-разному.

Давайте сначала рассмотрим, как использовать функции на листе.

Использование пользовательских функций в рабочих листах

Мы уже видели примеры использования функции, созданной в VBA, на листе.

Все, что вам нужно сделать, это ввести имя функции, и оно отобразится в intellisense.

Public VBA function used in Worksheet

Обратите внимание, что для того, чтобы функция отображалась на рабочем листе, она должна быть функцией Public (как описано в разделе выше).

Вы также можете использовать диалоговое окно «Вставить функцию» для вставки пользовательской функции (используя шаги ниже). Это будет работать только для публичных функций.

  • Перейдите на вкладку «Данные».
  • Нажмите «Вставить функцию».

Insert Function option in the ribbon

  • В диалоговом окне «Вставка функции» выберите «Определено пользователем» в качестве категории. Эта опция отображается только тогда, когда у вас есть функция в редакторе VB (и функция Public).

Insert User Defined Function in Worksheet - dilaog box

  • Выберите функцию из списка всех общедоступных пользовательских функций.
  • Нажмите кнопку ОК

Вышеуказанные шаги вставят функцию в лист. Он также отображает диалоговое окно «Аргументы функции», которое предоставит вам подробную информацию об аргументах и результате.

Information dialog box when you insert the Function

Вы можете использовать пользовательскую функцию, как и любую другую функцию в Excel. Это также означает, что вы можете использовать его с другими встроенными функциями Excel. Например. приведенная ниже формула даст название рабочей книги в верхнем регистре:

=UPPER(WorkbookName())

Использование пользовательских функций в процедурах и функциях VBA

Когда вы создали функцию, вы можете использовать ее и в других подпроцедурах.

Если функция Public, она может использоваться в любой процедуре в том же или другом модуле. Если это Private, его можно использовать только в том же модуле.

Ниже приведена функция, которая возвращает имя рабочей книги.

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

Приведенная ниже процедура вызывает функцию, а затем отображает имя в окне сообщения.

Sub ShowWorkbookName()
MsgBox WorkbookName
End Sub

Вы также можете вызвать функцию из другой функции.

В приведенных ниже кодах первый код возвращает имя рабочей книги, а второй возвращает имя в верхнем регистре, вызывая первую функцию.

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

Вызов пользовательской функции из других книг

Если у вас есть функция в рабочей книге, вы можете вызвать эту функцию и в других рабочих книгах.

Есть несколько способов сделать это:

  1. Создание надстройки
  2. Функция сохранения в персональной макрокоманде
  3. Ссылка на функцию из другой рабочей книги.

Создание надстройки

Создав и установив надстройку, вы получите настраиваемую функцию, доступную во всех книгах.

Предположим, вы создали пользовательскую функцию — «GetNumeric» и хотите, чтобы она была во всех книгах. Для этого создайте новую рабочую книгу и поместите код функции в модуль этой новой рабочей книги.

Теперь следуйте инструкциям ниже, чтобы сохранить его как надстройку, а затем установить его в Excel.

  • Перейдите на вкладку «Файл» и нажмите «Сохранить как».

Create an Excel Add-in - Save as

  • В диалоговом окне «Сохранить как» измените тип «Сохранить как» на .xlam. Имя, которое вы назначаете файлу, будет именем вашей надстройки. В этом примере файл сохраняется с именем GetNumeric.
    • Вы заметите, что путь к файлу, в котором он сохраняется, автоматически изменяется. Вы можете использовать по умолчанию или изменить его, если хотите.

Create an Excel Add-in - Save as drop down

  • Откройте новую книгу Excel и перейдите на вкладку Разработчик.
  • Выберите параметр «Надстройки Excel».

Create an Excel Add-in - add-in

  • В диалоговом окне «Надстройки» найдите и найдите сохраненный файл и нажмите «ОК».

installing the addin to get function in all workbooks

Теперь надстройка была активирована.

Теперь вы можете использовать пользовательские функции во всех книгах.

Сохранение функции в персональной книге макросов

Персональная книга макросов — это скрытая рабочая книга в вашей системе, которая открывается при каждом запуске приложения Excel.

Это место, где вы можете хранить макросы и получать к ним доступ из любой книги. Это отличное место для хранения тех макросов, которые вы хотите часто использовать.

По умолчанию в вашем Excel нет личной книги макросов. Вам необходимо создать его, записав макрос и сохранив его в личной книге макросов.

Ссылка на функцию из другой книги

Хотя первые два метода (создание надстройки и использование личной рабочей книги макроса) будут работать во всех ситуациях, если вы хотите сослаться на функцию из другой рабочей книги, эта рабочая книга должна быть открыта.

Предположим, у вас есть рабочая книга с именем «Рабочая тетрадь с формулой», и она имеет функцию с именем «GetNumeric».

Чтобы использовать эту функцию в другой рабочей книге (когда рабочая книга с формулой открыта), вы можете использовать следующую формулу:

=’Workbook with Formula’!GetNumeric(A1)

Приведенная выше формула будет использовать пользовательскую функцию в файле Workbook with Formula и даст вам результат.

Обратите внимание: поскольку в имени книги есть пробелы, его необходимо заключить в одинарные кавычки.

Использование оператора выхода из VBA

Если вы хотите выйти из функции во время выполнения кода, вы можете сделать это с помощью оператора «Выход из функции».

Приведенный ниже код извлекает первые три числовых символа из буквенно-цифровой текстовой строки. Как только он получает три символа, функция завершается и возвращает результат.

Function GetNumericFirstThree(CellRef As Range) As Long
Dim StringLength As Integer
StringLength = Len(CellRef)
For i = 1 To StringLength
If J = 3 Then Exit Function
If IsNumeric(Mid(CellRef, i, 1)) Then
J = J + 1
Result = Result & Mid(CellRef, i, 1)
GetNumericFirstThree = Result
End If
Next i
End Function

Вышеприведенная функция проверяет количество числовых символов, и когда она получает 3 числовых символа, она выходит из функции в следующем цикле.

Отладка пользовательской функции

Есть несколько методов, которые вы можете использовать при отладке пользовательской функции в VBA:

Отладка пользовательской функции с помощью окна сообщения

Используйте функцию MsgBox, чтобы показать окно сообщения с определенным значением.

Отображаемое значение может быть основано на том, что вы хотите проверить. Например, если вы хотите проверить, выполняется ли код или нет, будет работать любое сообщение, и если вы хотите проверить, работают ли циклы или нет, вы можете отобразить определенное значение или счетчик цикла.

Отладка пользовательской функции путем установки точки останова

Установите точку останова, чтобы иметь возможность проходить шаг за шагом по каждой строке. Чтобы установить точку останова, выберите нужную строку и нажмите F9 или нажмите на серую вертикальную область, которая слева от строк кода. Любой из этих методов вставил бы точку останова (вы увидите красную точку в серой области).

Setting the breakpoint

Как только вы установили точку останова и выполнили функцию, она идет до линии точки останова и затем останавливается. Теперь вы можете просмотреть код с помощью клавиши F8. Нажмите F8 один раз, чтобы перейти к следующей строке в коде.

Отладка пользовательской функции с помощью Debug.Print в коде

Вы можете использовать оператор Debug.Print в своем коде, чтобы получить значения указанных переменных / аргументов в непосредственном окне.

Например, в приведенном ниже коде я использовал Debug.Print, чтобы получить значение двух переменных — «j» и «Result».

Function GetNumericFirstThree(CellRef As Range) As Long
Dim StringLength As Integer
StringLength = Len(CellRef)
For i = 1 To StringLength
If J = 3 Then Exit Function
If IsNumeric(Mid(CellRef, i, 1)) Then
 J = J + 1
 Result = Result & Mid(CellRef, i, 1)
 Debug.Print J, Result
 GetNumericFirstThree = Result
End If
Next i
End Function

Когда этот код выполняется, он показывает следующее в immediate window.

Immediate Window result when creating a custom function in VBA Excel

Встроенные функции Excel против Пользовательской функции VBA

Есть несколько сильных преимуществ использования встроенных функций Excel по сравнению с пользовательскими функциями, созданными в VBA.

  • Встроенные функции работают намного быстрее, чем функции VBA.
  • Когда вы создаете отчет / панель мониторинга с использованием функций VBA и отправляете его клиенту / коллеге, им не нужно беспокоиться о том, включены макросы или нет. В некоторых случаях клиенты / клиенты пугаются, увидев предупреждение в желтой полосе (которое просто просит их включить макросы).
  • Благодаря встроенным функциям Excel вам не нужно беспокоиться о расширениях файлов. Если у вас есть макросы или пользовательские функции в рабочей книге, вам нужно сохранить их в формате .xlsm

Хотя существует множество веских причин для использования встроенных функций Excel, в некоторых случаях лучше использовать пользовательскую функцию.

  • Лучше использовать пользовательскую функцию, если ваша встроенная формула огромна и сложна. Это становится еще более актуальным, когда вам нужен кто-то еще, чтобы обновить формулы. Например, если у вас есть огромная формула, состоящая из множества различных функций, даже изменение ссылки на ячейку может быть утомительным и подверженным ошибкам. Вместо этого вы можете создать пользовательскую функцию, которая принимает только один или два аргумента и выполняет всю тяжелую работу с бэкэндом.
  • Когда вам нужно что-то сделать, что не может быть сделано встроенными функциями Excel. Примером этого может быть случай, когда вы хотите извлечь все числовые символы из строки. В таких случаях польза от использования пользовательской функции gar перевешивает ее недостатки.

Где разместить код VBA для пользовательской функции

При создании пользовательской функции необходимо поместить код в окно кода для книги, в которой вы хотите использовать функцию.

Ниже приведены инструкции по размещению кода для функции «GetNumeric» в книге.

  1. Перейдите на вкладку Разработчик.IF Then Else in Excel VBA - Developer Tab in ribbon
  2. Нажмите на Visual Basic. Это откроет редактор VB в бэкэнде.Создание и примеры пользовательской функции
  3. На панели Project Explorer в редакторе VB щелкните правой кнопкой мыши любой объект для книги, в которую вы хотите вставить код. Если вы не видите Project Explorer, перейдите на вкладку View и щелкните Project Explorer.
  4. Перейти к Вставить и нажмите на модуль. Это вставит объект модуля для вашей книги.                 Saving a Custom Function code in the module
  5. Скопируйте и вставьте код в окно модуля. User Defined function in the module code window

На этом шаге мы рассмотрим ввод функций вручную и вставку функций.

Ввод функций вручную

Пользоваться таким способом ввода функций можно лишь в том случае, если Вы знакомы с функциями и знаете о том, какое количество аргументов и какого типа аргументы содержатся в функции.

При вводе функции вручную Excel всегда преобразует символы в их имени к верхнему регистру. Если программа не преобразует введенный текст к верхнему регистру, значит, она не распознала запись как функцию, т.е. Вы ввели ее неправильно.

Вставка функций с помощью Мастера функций Осуществить вставку функции можно с помощью диалогового окна Мастер функций, которое можно вызвать одним из следующих способов:

В результате на экране будет отображено диалоговое окно Мастер функций (рис. 1).

В разделе Категория представлен список категорий функций. При выборе одной из категорий в списке Функция появляется перечень функций, включенных в эту категорию.

В категории 10 недавно использовавшихся перечислены те функции, которые были использованы совсем недавно. В категории Полный алфавитные перечень включены все имеющиеся функции из всех категорий.

. Чтобы самым быстрым способом выбрать функцию из категории 10 недавно использовавшихся, нужно щелкнуть на пиктограмме Изменить формулу, в строке формул, а затем выбрать нужную функцию из списка, который появится там, где обычно находится поле Имя.

При выборе функции в списке Функция внизу диалогового окна появляется список ее аргументов вместе с кратким описанием.

После того, как нужная функция найдена, можно щелкнуть на кнопке OK. Появится палитра формул Excel (рис. 2), которая используется для задания аргументов функции.

При работе со средством Палитра формул следует помнить о следующих рекомендациях:

На следующем шаге мы рассмотрим математические и тригонометрические функции.

Предыдущий шаг Содержание Следующий шаг

Возможности Эксель позволяют не только создавать и редактировать таблицы, но и производить всевозможные расчеты: математические, финансовые, статистические и т.д. Делается это с помощью формул или функций (операторов), для выбора и настройки которых предусмотрен специальный инструмент под названием “Мастер функций”. Алгоритм его использования мы и разберем в данной статье.

  • Шаг 1: вызов Мастера функций

  • Шаг 2: выбор функции

  • Шаг 3: заполнение аргументов функции

  • Шаг 4: выполнение функции

  • Заключение

Шаг 1: вызов Мастера функций

Для начала выбираем ячейку, в которую планируется вставить функцию.

Выбор ячейки в Эксель

Затем у нас есть несколько способов открытия Мастера функций:

  1. Первый способ, пожалуй, пользуется наибольшей популярностью. Независимо от того, в какой вкладке программы мы находимся, слева от строки формул есть значок “fx (Вставить функцию)”. Именно по нему и следует щелкнуть.Вставка функции в ячейку таблицы Эксель
  2. Также мы можем переключиться во вкладку “Формулы”, в которой представлена аналогичная кнопка в левом углу ленты программы (группа “Библиотека функций”).Вставка функции в ячейку таблицы Excel через вкладку Формулы
  3. Все в той же вкладке и группе (“Формулы”“Библиотека функций”) представлены категории функций. Кликаем по требуемому варианту и в раскрывшемся перечне можем выбрать нужный оператор. Но т.к. нам нужен именно Мастер функций, то кликаем по пункту “Вставить функцию” в самом конце списка.Вставка функции в ячейку таблицы Эксель через вкладку Формулы
  4. И напоследок, можно воспользоваться комбинацией Shift+F3, хотя не все пользователи готовы запоминать горячие клавиши для работы в Excel.

Шаг 2: выбор функции

Итак, независимо от того, какой из описанных выше способов был выбран, перед нами появится окно Мастера функций (Вставка функции). Оно состоит из следующих элементов:

  1. В самом верху расположено поле для поиска конкретной функции. Все что мы делаем – это набираем название (например, “сумм”) и жмем “Найти”. Результаты отобразятся в поле под надписью “Выберите функцию”.Поиск в Мастере функций в Эксель
  2. Параметр “Категория”. Щелкаем по текущему значению и в раскрывшемся списке выбираем категорию, к которой относится наша функция (допустим, “Математические”).Выбор категории в Мастере функций в ExcelВсего предлагается 15 вариантов:
  3. После того, как категория задана, остается только определиться с функцией в поле “Выберите функцию” (выбираем ее с помощью щелчка левой кнопкой мыши). Когда все готово, жмем кнопку OK (или Enter).Выбор оператора СРЗНАЧ в Мастере функций в Эксель

Шаг 3: заполнение аргументов функции

В следующем окне предстоит заполнить аргументы (один или несколько), перечень и тип которых зависит от выбранной функции.

Аргументы функции в Эксель

Рассмотрим на примере “СРЗНАЧ” (для вычисления среднего арифметического значения), работающего с числовыми данными.

Поле напротив аргумента можно заполнить вручную, введя конкретное число (или несколько числовых значений, разделенных точкой с запятой) с помощью клавиш на клавиатуре.

Указание конкретного числа в качестве аргумента функции в Эксель

Либо можно указать ссылку на ячейку или диапазон ячеек, содержащих числа.

Указание ссылки на ячейку в качестве аргумента функции в Эксель

Здесь возможны два варианта – это можно сделать либо вручную (т.е. с помощью клавиатуры), либо с помощью мыши. Последний вариант удобнее – просто щелкаем по нужному элементу в самой таблице, находясь в поле напротив нужного аргумента.

Выбор ячейки в таблице в качестве аргумента функции в Excel

Возможна комбинация способов заполнения значений аргументов, а переключаться между ними можно с помощью щелчков мыши внутри нужного поля или клавиши Tab.

Заполненные аргументы функции в Эксель

Примечания:

  • В нижней части окна представлено описание функции, а также комментарии/рекомендации касательно того, как именно следует заполнить тот или иной аргумент.
  • Иногда количество аргументов может увеличиться. Например, как это произошло в нашем случае с функцией “СРЗНАЧ”. По умолчанию предусмотрено всего два аргумента, но если мы перейдем к заполнению второго, добавится третий и т.д.
  • Принцип заполнения текстовых данных в других функциях, где это предполагается, аналогичен рассмотренному выше – либо мы указываем конкретные значения, либо ссылки на ячейки или диапазоны ячеек.

Шаг 4: выполнение функции

Как только все аргументы заполнены, жмем OK.

Подтверждение выполнения функции в Эксель

Окно Мастера функций закроется. И если все сделано правильно, мы увидим в выбранной ячейке результат согласно заданным значениям аргументов.

Результат выполнения функции в ячейке таблицы Excel

А в строке формул будет отображаться автоматически заполненная формула функции.

Заключение

Таким образом, Мастер функций позволяет максимально упростить работу с функциями, что делает его одним из самых незаменимых инструментов в Excel. Благодаря нему не нужно запоминать сложные формулы и правила их написания, т.к. все предельно просто реализовано через заполнение специальных полей.

Содержание

  1. Встроенные функции VBA
  2. Пользовательские процедуры «Function» и «Sub» в VBA
  3. Аргументы
  4. Необязательные аргументы
  5. Передача аргументов по значению и по ссылке
  6. VBA процедура «Function»
  7. Пример VBA процедуры «Function»: Выполняем математическую операцию с 3 числами
  8. Вызов VBA процедуры «Function»
  9. Вызов VBA процедуры «Function» из другой процедуры
  10. Вызов VBA процедуры «Function» из рабочего листа
  11. VBA процедура «Sub»
  12. VBA процедура «Sub»: Пример 1. Выравнивание по центру и изменение размера шрифта в выделенном диапазоне ячеек
  13. VBA процедура «Sub»: Пример 2. Выравнивание по центру и применение полужирного начертания к шрифту в выделенном диапазоне ячеек
  14. Вызов процедуры «Sub» в Excel VBA
  15. Вызов VBA процедуры «Sub» из другой процедуры
  16. Вызов VBA процедуры «Sub» из рабочего листа
  17. Область действия процедуры VBA
  18. Ранний выход из VBA процедур «Function» и «Sub»

Встроенные функции VBA

Перед тем, как приступить к созданию собственных функций VBA, полезно знать, что Excel VBA располагает обширной коллекцией готовых встроенных функций, которые можно использовать при написании кода.

Список этих функций можно посмотреть в редакторе VBA:

  • Откройте рабочую книгу Excel и запустите редактор VBA (нажмите для этого Alt+F11), и затем нажмите F2.
  • В выпадающем списке в верхней левой части экрана выберите библиотеку VBA.
  • Появится список встроенных классов и функций VBA. Кликните мышью по имени функции, чтобы внизу окна отобразилось её краткое описание. Нажатие F1 откроет страницу онлайн-справки по этой функции.

Кроме того, полный список встроенных функций VBA с примерами можно найти на сайте Visual Basic Developer Centre.

Пользовательские процедуры «Function» и «Sub» в VBA

В Excel Visual Basic набор команд, выполняющий определённую задачу, помещается в процедуру Function (Функция) или Sub (Подпрограмма). Главное отличие между процедурами Function и Sub состоит в том, что процедура Function возвращает результат, процедура Sub – нет.

Поэтому, если требуется выполнить действия и получить какой-то результат (например, просуммировать несколько чисел), то обычно используется процедура Function, а для того, чтобы просто выполнить какие-то действия (например, изменить форматирование группы ячеек), нужно выбрать процедуру Sub.

Аргументы

При помощи аргументов процедурам VBA могут быть переданы различные данные. Список аргументов указывается при объявлении процедуры. К примеру, процедура Sub в VBA добавляет заданное целое число (Integer) в каждую ячейку в выделенном диапазоне. Передать процедуре это число можно при помощи аргумента, вот так:

Sub AddToCells(i As Integer)

...

End Sub

Имейте в виду, что наличие аргументов для процедур Function и Sub в VBA не является обязательным. Для некоторых процедур аргументы не нужны.

Необязательные аргументы

Процедуры VBA могут иметь необязательные аргументы. Это такие аргументы, которые пользователь может указать, если захочет, а если они пропущены, то процедура использует для них заданные по умолчанию значения.

Возвращаясь к предыдущему примеру, чтобы сделать целочисленный аргумент функции необязательным, его нужно объявить вот так:

Sub AddToCells(Optional i As Integer = 0)

В таком случае целочисленный аргумент i по умолчанию будет равен 0.

Необязательных аргументов в процедуре может быть несколько, все они перечисляются в конце списка аргументов.

Передача аргументов по значению и по ссылке

Аргументы в VBA могут быть переданы процедуре двумя способами:

  • ByVal – передача аргумента по значению. Это значит, что процедуре передаётся только значение (то есть, копия аргумента), и, следовательно, любые изменения, сделанные с аргументом внутри процедуры, будут потеряны при выходе из неё.
  • ByRef – передача аргумента по ссылке. То есть процедуре передаётся фактический адрес размещения аргумента в памяти. Любые изменения, сделанные с аргументом внутри процедуры, будут сохранены при выходе из процедуры.

При помощи ключевых слов ByVal или ByRef в объявлении процедуры можно задать, каким именно способом аргумент передаётся процедуре. Ниже это показано на примерах:

Sub AddToCells(ByVal i As Integer)

...

End Sub
В этом случае целочисленный аргумент i передан по значению. После выхода из процедуры Sub все сделанные с i изменения будут утрачены.
Sub AddToCells(ByRef i As Integer)

...

End Sub
В этом случае целочисленный аргумент i передан по ссылке. После выхода из процедуры Sub все сделанные с i изменения будут сохранены в переменной, которая была передана процедуре Sub.

Помните, что аргументы в VBA по умолчанию передаются по ссылке. Иначе говоря, если не использованы ключевые слова ByVal или ByRef, то аргумент будет передан по ссылке.

Перед тем как продолжить изучение процедур Function и Sub более подробно, будет полезным ещё раз взглянуть на особенности и отличия этих двух типов процедур. Далее приведены краткие обсуждения процедур VBA Function и Sub и показаны простые примеры.

VBA процедура «Function»

Редактор VBA распознаёт процедуру Function, когда встречает группу команд, заключённую между вот такими открывающим и закрывающим операторами:

Function

...

End Function

Как упоминалось ранее, процедура Function в VBA (в отличие от Sub), возвращает значение. Для возвращаемых значений действуют следующие правила:

  • Тип данных возвращаемого значения должен быть объявлен в заголовке процедуры Function.
  • Переменная, которая содержит возвращаемое значение, должна быть названа так же, как и процедура Function. Эту переменную не нужно объявлять отдельно, так как она всегда существует как неотъемлемая часть процедуры Function.

Это отлично проиллюстрировано в следующем примере.

Пример VBA процедуры «Function»: Выполняем математическую операцию с 3 числами

Ниже приведён пример кода VBA процедуры Function, которая получает три аргумента типа Double (числа с плавающей точкой двойной точности). В результате процедура возвращает ещё одно число типа Double, равное сумме первых двух аргументов минус третий аргумент:

Function SumMinus(dNum1 As Double, dNum2 As Double, dNum3 As Double) As Double

   SumMinus = dNum1 + dNum2 - dNum3

End Function

Эта очень простая VBA процедура Function иллюстрирует, как данные передаются процедуре через аргументы. Можно увидеть, что тип данных, возвращаемых процедурой, определён как Double (об этом говорят слова As Double после списка аргументов). Также данный пример показывает, как результат процедуры Function сохраняется в переменной с именем, совпадающим с именем процедуры.

Вызов VBA процедуры «Function»

Если рассмотренная выше простая процедура Function вставлена в модуль в редакторе Visual Basic, то она может быть вызвана из других процедур VBA или использована на рабочем листе в книге Excel.

Вызов VBA процедуры «Function» из другой процедуры

Процедуру Function можно вызвать из другой VBA процедуры при помощи простого присваивания этой процедуры переменной. В следующем примере показано обращение к процедуре SumMinus, которая была определена выше.

Sub main()

   Dim total as Double
   total = SumMinus(5, 4, 3)

End Sub

Вызов VBA процедуры «Function» из рабочего листа

VBA процедуру Function можно вызвать из рабочего листа Excel таким же образом, как любую другую встроенную функцию Excel. Следовательно, созданную в предыдущем примере процедуру FunctionSumMinus можно вызвать, введя в ячейку рабочего листа вот такое выражение:

=SumMinus(10, 5, 2)

VBA процедура «Sub»

Редактор VBA понимает, что перед ним процедура Sub, когда встречает группу команд, заключённую между вот такими открывающим и закрывающим операторами:

VBA процедура «Sub»: Пример 1. Выравнивание по центру и изменение размера шрифта в выделенном диапазоне ячеек

Рассмотрим пример простой VBA процедуры Sub, задача которой – изменить форматирование выделенного диапазона ячеек. В ячейках устанавливается выравнивание по центру (и по вертикали, и по горизонтали) и размер шрифта изменяется на заданный пользователем:

Sub Format_Centered_And_Sized(Optional iFontSize As Integer = 10)

   Selection.HorizontalAlignment = xlCenter
   Selection.VerticalAlignment = xlCenter
   Selection.Font.Size = iFontSize

End Sub

Данная процедура Sub выполняет действия, но не возвращает результат.

В этом примере также использован необязательный (Optional) аргумент iFontSize. Если аргумент iFontSize не передан процедуре Sub, то его значение по умолчанию принимается равным 10. Однако же, если аргумент iFontSize передается процедуре Sub, то в выделенном диапазоне ячеек будет установлен размер шрифта, заданный пользователем.

VBA процедура «Sub»: Пример 2. Выравнивание по центру и применение полужирного начертания к шрифту в выделенном диапазоне ячеек

Следующая процедура похожа на только что рассмотренную, но на этот раз, вместо изменения размера, применяется полужирное начертание шрифта в выделенном диапазоне ячеек. Это пример процедуры Sub, которой не передаются никакие аргументы:

Sub Format_Centered_And_Bold()

   Selection.HorizontalAlignment = xlCenter
   Selection.VerticalAlignment = xlCenter
   Selection.Font.Bold = True

End Sub

Вызов процедуры «Sub» в Excel VBA

Вызов VBA процедуры «Sub» из другой процедуры

Чтобы вызвать VBA процедуру Sub из другой VBA процедуры, нужно записать ключевое слово Call, имя процедуры Sub и далее в скобках аргументы процедуры. Это показано в примере ниже:

Sub main()

   Call Format_Centered_And_Sized(20)

End Sub

Если процедура Format_Centered_And_Sized имеет более одного аргумента, то они должны быть разделены запятыми. Вот так:

Sub main()

   Call Format_Centered_And_Sized(arg1, arg2, ...)

End Sub

Вызов VBA процедуры «Sub» из рабочего листа

Процедура Sub не может быть введена непосредственно в ячейку листа Excel, как это может быть сделано с процедурой Function, потому что процедура Sub не возвращает значение. Однако, процедуры Sub, не имеющие аргументов и объявленные как Public (как будет показано далее), будут доступны для пользователей рабочего листа. Таким образом, если рассмотренные выше простые процедуры Sub вставлены в модуль в редакторе Visual Basic, то процедура Format_Centered_And_Bold будет доступна для использования на рабочем листе книги Excel, а процедура Format_Centered_And_Sized – не будет доступна, так как она имеет аргументы.

Вот простой способ запустить (или выполнить) процедуру Sub, доступную из рабочего листа:

  • Нажмите Alt+F8 (нажмите клавишу Alt и, удерживая её нажатой, нажмите клавишу F8).
  • В появившемся списке макросов выберите тот, который хотите запустить.
  • Нажмите Выполнить (Run)

Чтобы выполнять процедуру Sub быстро и легко, можно назначить для неё комбинацию клавиш. Для этого:

  • Нажмите Alt+F8.
  • В появившемся списке макросов выберите тот, которому хотите назначить сочетание клавиш.
  • Нажмите Параметры (Options) и в появившемся диалоговом окне введите сочетание клавиш.
  • Нажмите ОК и закройте диалоговое окно Макрос (Macro).

Внимание: Назначая сочетание клавиш для макроса, убедитесь, что оно не используется, как стандартное в Excel (например, Ctrl+C). Если выбрать уже существующее сочетание клавиш, то оно будет переназначено макросу, и в результате пользователь может запустить выполнение макроса случайно.

Область действия процедуры VBA

В части 2 данного самоучителя обсуждалась тема области действия переменных и констант и роль ключевых слов Public и Private. Эти ключевые слова так же можно использовать применительно к VBA процедурам:

Public Sub AddToCells(i As Integer)

...

End Sub
Если перед объявлением процедуры стоит ключевое слово Public, то данная процедура будет доступна для всех модулей в данном проекте VBA.
Private Sub AddToCells(i As Integer)

...

End Sub
Если перед объявлением процедуры стоит ключевое слово Private, то данная процедура будет доступна только для текущего модуля. Её нельзя будет вызвать, находясь в любом другом модуле или из рабочей книги Excel.

Помните о том, что если перед объявлением VBA процедуры Function или Sub ключевое слово не вставлено, то по умолчанию для процедуры устанавливается свойство Public (то есть она будет доступна везде в данном проекте VBA). В этом состоит отличие от объявления переменных, которые по умолчанию бывают Private.

Ранний выход из VBA процедур «Function» и «Sub»

Если нужно завершить выполнение VBA процедуры Function или Sub, не дожидаясь её естественного финала, то для этого существуют операторы Exit Function и Exit Sub. Применение этих операторов показано ниже на примере простой процедуры Function, в которой ожидается получение положительного аргумента для выполнения дальнейших операций. Если процедуре передано не положительное значение, то дальнейшие операции не могут быть выполнены, поэтому пользователю должно быть показано сообщение об ошибке и процедура должна быть тут же завершена:

Function VAT_Amount(sVAT_Rate As Single) As Single

   VAT_Amount = 0
   If sVAT_Rate <= 0 Then
      MsgBox "Expected a Positive value of sVAT_Rate but Received " & sVAT_Rate
      Exit Function
   End If

...

End Function

Обратите внимание, что перед тем, как завершить выполнение процедуры FunctionVAT_Amount, в код вставлена встроенная VBA функция MsgBox, которая показывает пользователю всплывающее окно с предупреждением.

Оцените качество статьи. Нам важно ваше мнение:

Понравилась статья? Поделить с друзьями:
  • Как в excel выровнять ширину всех ячеек
  • Как в excel вызвать найти
  • Как в excel выровнять число в ячейке
  • Как в excel вызвать мастер функций в excel
  • Как в excel выровнять текст по вертикали