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

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

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

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

Пример

Процедура высвечивает приветствие после ввода пользователем своего имени.

' Вызываемая процедура

Sub DisplayName(sName As String)

MsgBox "Hello, " & sName

End Sub

Возможны два способа вызова процедуры: DisplayName "Conrad" или Call DisplayName("Conrad"). В результате выполнения любого из перечисленных операторов высвечивается приветствие "Hello, Conrad".

sName это параметр вызываемой процедуры, а значение Conrad – аргумент.

Замечания

  • Идентификаторы аргументов и параметров процедуры могут совпадать.

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

Синтаксис описания каждого параметра процедуры имеет следующий вид:

[[Optional][ByVal|ByRef][ParamArray] varname[( )] As type][= defaultvalue]

  • Optional – ключевое слово. Указывает, что параметр может быть опущен.

Важно

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

  • Тип необязательного параметра – Variant.

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

  • В процедуре можно проверить, передается необязательный параметр или нет, используя функию IsMissing(argname). Она возвращает значение True, если значение параметра опущено, и False в противном случае.

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

  • ByRef1 – передача параметров по ссылке. Предполагается, что процедуре передается адрес переменной. В этом случае вызывающая процедура может не только использовать переданное значение переменной, но и изменить его в процессе выполнения. Используется по умолчанию.

  • ParamArray означает передачу необязательного аргумента – массива типа Variant с неопределенным количеством элементов.

Важно

Ключевое слово ParamArray

  • используется только для последнего параметра процедуры;

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

  • не допускает использование ключевых слов ByVal, ByRef и Optional для описываемого параметра.

  • Varname – идентификатор переменной.

  • type – тип передаваемого аргумента. Если тип данных не указан, то VBA трактует аргумент как Variant.

Важно

  • Разрешены все элементарные типы данных и типы, определенные пользователем.

  • Aргумент типа String должен иметь переменную длину.

  • Если для параметра процедуры описан тип данных, то передаваемый аргумент должен иметь тот же тип данных.

  • Если параметром процедуры является массив, то передаваемый массив должен иметь ту же размерность.

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

  • Value on default – для необязательных аргументов устанавливает значение по умолчанию.

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

Пример.

Для сотрудников фирмы (максимально 2000 сотрудников) рассчитать выплаты в соответствии с количеством отработанных часов и ставкой оплаты за час работы. Налог составляет 13%. Если зарплата превышает 300$, то страховой взнос составляет 5%.

Sub salary_employee()

Dim h As Long, r As Long, id As Integer

Dim i As Integer

For i = 1 To 2000

id=Val(InputBox("Код сотрудника"))

h = Val(InputBox("Enter hours"))

If h = 0 Then

Exit For

Else

r = Val(InputBox("Enter rate"))

If r = 0 Then Exit For

End If

salary_em_proc id,h,r ‘ вызов процедуры

Next i

End Sub

Sub salary_em_proc (ByVal io As Integer, ByVal ho As Long, ByVal ra As Long)

Dim Fund As Double, s As Double

s = ho * ra

If s > 300 Then

Fund = s * 0.05

End If

MsgBox io & " salary " & s – Fund – s * 0.13

End Sub

Процедура salary_employee (основная) запрашивает ввод количества отработанных часов и размер почасовой оплаты максимально для 2000 сотрудников и передает по значению эти данные в процедуру salary_em_proc.

Вызываемая процедура salary_em_proc рассчитывает и распечатывает денежную выплату. В вызываемой процедуре salary_em_proc определены три параметра. Это io – код сотрудника, ho – количество часов, ra – ставка почасовой оплаты.

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

Sub salary_em_sum(ByVal io As Integer,ByVal ho As Long, ByVal ra As Long, ByRef SI as Double )

Dim Fund As Double, s As Double

s = ho * ra

If s > 300 Then

Fund = s * 0.05

End If

MsgBox io & " salary " & s – Fund – s * 0.13

SI=SI+ s-Fund-s*0.13

End Sub

В основной процедуре salary_employee объявите переменную AC (Dim AC as Double), в которой будет накапливаться суммарная выплата. В вызываемой процедуре введите четвертый параметр SI – накапливаемая сумма.

Этот параметр передается по ссылке, т.к. его значение изменяется в вызываемой процедуре. Оператор вызова процедуры будет выглядеть так: salary_em_sum id, h, r, AC.