Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Создание пользовательских п ÒÉÌÏÖÅÎÉÊ ÓÒÅÄÓÔÁÍ...doc
Скачиваний:
6
Добавлен:
18.11.2019
Размер:
2.02 Mб
Скачать

Поименованные аргументы

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

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

Использование поименованных аргументов исключает влияние позиции аргумента на его интерпретацию. Для задания поименованных аргументов после названия формального параметра вызываемой процедуры поставьте оператор назначения – двоеточие и знак равенства (:=), за которым укажите передаваемое значение аргумента.

Преимущества

  • Поименованные аргументы улучшают читабельность программы.

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

  • Облегчается перечисление аргументов в случае пропуска необязательных аргументов.

Используя поименованные аргументы, к функции расчета выплат можно было бы обратиться так: salary_em(ra:=r, ho:=h).

Пример

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

Public Sub input_named()

Dim nm As String, fm As String

nm = InputBox("Введи имя", , , 100, 100)

fm = InputBox(prompt:="Введи фамилию", xpos:=100, ypos:=100)

Debug.Print "Email=", Left(nm, 1) & fm & "@yandex.ru"

End Sub

Диалоговое окно запроса на ввод имени и фамилии размещается на экране, используя координаты xpos=100 и ypos=100. В первом операторе InputBox используются позиционные аргументы – пропущенные два аргумента отмечены запятыми. Во втором операторе InputBox используются поименованные аргументы.

Функция Left выделяет первую букву имени. Подробно об аргументах функций InputBox и Left см. ниже.

Использование необязательных аргументов

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

Пример

Функция рассчитывает налоговые выплаты и имеет два параметра S – доход, R – ставка налога. Если ставка налога не задана, то налог рассчитывается, исходя из 13%.

Function NS(ByRef S As Double, Optional ByRef R As Variant) As Double

Dim Fund As Double

If IsMissing(R) Then

Fund = 0.13

Else

Fund = R

End If

NS = S * Fund

End Function

Оператор Debug.Print NS(1000) в вызывающей процедуре распечатает в окне Immediate Window размер 13%-го налога, а оператор Debug.Print NS(1000, 0.1) выведет в это окно размер 10%-го налога от заданного дохода.

Использование параметра ParamArray

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

Замечание

  • Используйте функцию Ubound для определения количества элементов в передаваемом массиве.

Пример

Составить функцию умножения аргументов.

Function multb(x, y) As Single

multb = x * y

End Function

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

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

С вычислением верхней границы передаваемого массива

Без вычисления верхней границы передаваемого массива

Function multa(ParamArray x()) As Double

Dim m As Double

m=1

For i = 0 To UBound(x())

m = m * x(i)

Next i

multa = m

End Function

Function multr(args() As Variant) As Double

Dim d As Variant, m As Double

m = 1

For Each d In args

m = m * d

Next d

multr = m

End Function

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

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

Sub mult_arr()

Dim A(7) As Variant, i As Integer

For i = 0 To 7

A(i) = i + 1

Next i

Debug.Print multr(A) ‘или Debug.Print multa(A)

End Sub

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

Результат умножения выводится в окно Immediate Window.