Именованные и аргументы Optional
При вызове процедур Sub или Function возможна позиционная передача аргументов, т.е. в порядке следования в описании процедуры. Кроме того, аргументы могут передаваться по именам, вне зависимости от позиции.
Например следующая процедура Sub имеет три аргумента:
Sub PassArgs(strName As String, intAge As Integer, dteBirth As Date)
Debug.Print strName, intAge, dteBirth
End Sub
Эту процедуру можно вызвать, передавая ее аргументы в соответствии с позициями и разделяя их запятой, как показано в следующем примере:
PassArgs "Маша", 26, #2-21-69#
Возможен также вызов этой процедуры с передачей именованных аргументов, разделенных запятыми.
PassArgs intAge:=26, dteBirth:=#2/21/69#, strName:="Маша"
Именованный аргумент состоит из имени аргумента, за которым следует двоеточие со знаком равенства (:=) и значение аргумента.
Именованные аргументы особенно полезны при вызове процедуры с необязательными аргументами (Optional). Если используются именованные аргументы, то запятые для обозначения отсутствующих позиционных аргументов не нужны. С помощью именованных аргументов проще проследить, какие аргументы переданы, а какие опущены.
В описании процедуры перед необязательными аргументами должно стоять ключевое слово Optional. Кроме того, в описании процедуры можно присвоить значение необязательному аргументу, которое он принимает по умолчанию. Например:
Sub OptionalArgs(strState As String, Optional strCountry As String = "USA")
. . .
End Sub
При вызове процедуры с аргументом Optional можно как указывать, так и не указывать необязательный аргумент. Если аргумент не описан, то для него используется имеющееся значение по умолчанию. Если по умолчанию значение не присвоено, аргумент обрабатывается так же, как любая другая переменная указанного типа.
В следующей процедуре имеется необязательный аргумент, переменная varCountry. Функция IsMissing определяет, был ли передан в процедуру необязательный аргумент.
Sub OptionalArgs(strState As String, Optional intRegion As Integer, _
Optional strCountry As String = "USA")
If IsMissing(intRegion) And IsMissing(strCountry) Then
Debug.Print strState
ElseIf IsMissing(strCountry) Then
Debug.Print strState, intRegion
ElseIf IsMissing(intRegion) Then
Debug.Print strState, strCountry
Else
Debug.Print strState, intRegion, strCountry
End If
End Sub
Эту процедуру можно вызвать с помощью именованного аргумента, как показано в следующих примерах.
OptionalArgs strCountry:="USA", strState:="MD"
OptionalArgs strState:= "MD", intRegion:=5