При вызове процедуры у которой есть аргументы, в операторе, который её вызывает, должен быть указан список аргументов. Элементы этого списка разделяются запятыми и располагаются в таком же порядке, что и при объявлении процедуры.
В качестве аргументов при вызове процедуры могут использоваться переменные, константы, символьные строки, массивы и объекты.
Пример передачи аргументов
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
где,
- 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).
Таким образом, помечаем себе, что аргументы можно передавать:
- Списком. Например Call myArg(A, B, C, D).
- Списком опуская необязательные аргументы. Например Call myArg(A, B, , D).
- Списком и по имени одновременно. Например Call myArg(Ta, D:=Td, B:=Tb).
- Используя только именованные аргументы. Например Call myArg(D:=Td, A:=Ta, B:=Tb).
