Передача аргументов VBA

Передача аргументов при вызове процедуры в VBA. Урок №34

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

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

Пример передачи аргументов

Sub myArg(a As String, b As String)
    a = "Все"
    b = "працює"
End Sub
Sub myCode()
Dim Ta As String, Tb As String
    Call myArg(Ta, Tb)
    MsgBox Ta & " " & Tb
End Sub

В данном примере мы создали процедуру myArg с двумя аргументами – a и b. Оба этих аргумента имеют тип строка. В этой же процедуре, мы присвоили переменной a значение «Все», а переменной b значение «працює».

Далее мы создали процедуру myCode. В ней объявили две строковые переменные Ta и Tb. Потом, с помощью ключевого слова Call, вызвали процедуру myArg и передали переменные Ta и Tb в процедуру myArg. В результате этого они получили значения «Все» и «працює» соответственно.

В завершение, чтобы убедиться в том, что всё работает как надо, мы вывели на экран сообщение. И если вы всё сделали правильно, то в этом сообщении будет текст «Все працює».

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

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

Sub myArg(a As String, b As String, Optional c As String, Optional d As String)
    a = "Все"
    b = "працює"
    c = "10"
    d = "ВІТАЮ"
End Sub
Sub myCode()
Dim Ta As String, Tb As String, Tc As String, Td As String
    Call myArg(Ta, Tb, , Td)
    MsgBox Ta & " " & Tb & ". " & Td
End Sub

В данном примере, мы добавили ещё 2 необязательных аргумента c и d. Этим аргументам были присвоены значения «10» и «ВІТАЮ» соответственно. Наши новые аргументы имеют тип строка.

При вызове процедуры, мы решили не использовать третий аргумент – c. Поэтому в строке Call myArg(Ta, Tb, , Td) мы его не указали, но зато указали отделяющую его запятую.

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

Пример

Sub myArg(a As String, b As String, Optional c As String, Optional d As String)
    a = "Все"
    b = "працює"
    c = "10"
    d = "ВІТАЮ"
End Sub
Sub myCode()
Dim Ta As String, Tb As String, Tc As String, Td As String
    Call myArg(Ta, Tb)
    MsgBox Ta & " " & Tb
End Sub

Именованные аргументы

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

 где,

  • argument – имя аргумента в объявлении процедуры;
  • := – оператор присваивания;
  • value – значение присваиваемое данному аргументу.

Пример

Sub myArg(A, B, Optional C, Optional D)
    A = "Все"
    B = "працює"
    C = "10"
    D = "ВІТАЮ"
End Sub
Sub myCode()
Dim Ta, Tb, Tc, Td
    Call myArg(D:=Td, A:=Ta, B:=Tb)
    MsgBox Td & "! " & Ta & " " & Tb
End Sub

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

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

Пример

Sub myArg(A, B, Optional C, Optional D)
    A = "Все"
    B = "працює"
    C = "10"
    D = "ВІТАЮ"
End Sub
Sub myCode()
Dim Ta, Tb, Tc, Td
    Call myArg(Ta, D:=Td, B:=Tb)
    MsgBox Td & "! " & Ta & " " & Tb
End Sub

В данном примере, в строке Call myArg(Ta, D:=Td, B:=Tb) мы сначала начинаем использовать список аргументов (Ta), а потом именованные аргументы (D:=Td, B:=Tb).

Main Menu