Функция VBA - вызов, возвращаемое значение и параметры

Это руководство научит вас создавать и использовать функции с параметрами и без них в VBA.

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

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

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

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

123 Функция GetValue () как целое числоGetValue = 50Конечная функция

Если бы вы запускали функцию, она всегда возвращала бы значение 50.

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

123 Функция GetRange () как диапазонУстановить GetRange = Range ("A1: G4")Конечная функция

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

Вызов функции из подпроцедуры

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

Всегда будет возвращено значение 50.

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

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

Создание функций

Один аргумент

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

123 Функция ConvertKilosToPounds (dblKilo as Double) как DoubleConvertKiloToPounds = dblKilo * 2.2Конечная функция

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

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

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

Множественные аргументы

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

123 Функция CalculateDayDiff (Date1 как Date, Date2 как Date) как DoubleCalculateDayDiff = Date2-Date1Конечная функция

Затем мы можем вызвать функцию для вычисления количества дней между двумя датами.

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

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

123456 Функция CalculateDayDiff (Date1 как Date, необязательная Date2 как Date) как Double'проверьте вторую дату и, если ее нет, сделайте Date2 равной сегодняшней дате.Если Date2 = 0, то Date2 = Date'вычислить разницуCalculateDayDiff = Date2-Date1Конечная функция

Значение аргумента по умолчанию

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

1234 Функция CalculateDayDiff (Date1 как Date, необязательная Date2 как Date = "06/02/2020") как Double'вычислить разницуCalculateDayDiff = Date2-Date1Конечная функция

ByVal и ByRef

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

ByVal означает, что вы передаете копию переменной функции, тогда как ByRef означает, что вы имеете в виду исходное значение переменной. Когда вы передаете копию переменной (ByVal) исходное значение переменной равно НЕТ изменено, но когда вы ссылаетесь на переменную, исходное значение переменной изменяется функцией.

1234 Функция GetValue (ByRef intA как целое число) как целое числоintA = intA * 4GetValue = intAКонечная функция

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

1234 Функция GetValue (intA как целое число) как целое числоintA = intA * 4GetValue = intAКонечная функция

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

123456789 Sub TestValues ​​()Dim intVal как целое число'заполняем переменную значением 10intVal = 10'запускаем функцию GetValue и показываем значение в ближайшем окнеDebug.Print GetValue (intVal)'показать значение переменной intVal в ближайшем окнеDebug.Print intValКонец подписки

Обратите внимание, что в окнах отладки оба раза отображается значение 40. Когда вы передаете в функцию переменную IntVal - в функцию передается значение 10 и умножается на 4. Использование ключевого слова ByRef (или его полное исключение) приводит к ИЗМЕНЕНИЮ значения переменной IntVal. Это отображается, когда вы сначала показываете результат функции в непосредственном окне (40), а затем значение переменной IntVal в окне отладки (также 40).

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

1234 Функция GetValue (ByVal intA как целое число) как целое числоintA = intA * 4GetValue = intAКонечная функция

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

Функция выхода

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

12345678910111213 Функция FindNumber (strSearch As String) как целое числоDim i как целое число'перебрать каждую букву в строкеДля i = 1 To Len (strSearch)'если буква числовая, вернуть значение функцииЕсли IsNumeric (Mid (strSearch, i, 1)), тоFindNumber = Mid (strSearch, i, 1)'затем выйдите из функцииФункция выходаКонец, еслиСледующийFindNumber = 0Конечная функция

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

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

1234567 Sub CheckForNumber ()Dim NumIs как целое число'передать текстовую строку в функцию поиска числаNumIs = FindNumber («Верхний этаж, 8 Оук-Лейн, Техас»)'показать результат в ближайшем окнеDebug.Print NumIsКонец подписки

Использование функции из листа Excel

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

Нажать на FX для отображения диалогового окна "Вставить функцию".

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

Выберите нужную функцию из доступных Пользовательские функции (UDF).

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

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

123 Частная функция CalculateDayDiff (Date1 как Date, Date2 как Date) как DoubleCalculateDayDiff = Date2-Date1Конечная функция

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

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

Если вы объявили второй аргумент как По желанию, вы можете опустить его как на листе Excel, так и в коде VBA.

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

Вы поможете развитию сайта, поделившись страницей с друзьями

wave wave wave wave wave