Когда вы вызываете Function / Sub в VBA, вы можете передавать ей значения, обычно называемые arguments . Имена аргументов и их типы определяются в сигнатуре подпрограммы, как у вас здесь:
Sub Inputs(zDOB As Date, zRetAge As Double, zRetDate As Date, ...)
Чтобы вызвать подпрограмму с определенными аргументами, вы можете передать их из вызывающего кода в виде необработанных значений:
Inputs 1, 2, 4 ... 'equiv to the obsolete Call Inputs(1, 2, 4 ...)
ИЛИ, значения, которые вы вводите при вызове подпрограммы, могут быть сохранены в переменных . Таким образом, я могу передать переменную в качестве аргумента:
Dim x as Date 'here I 'declare' x, you don't generally have to do this but it's advised
x = CDate(Range("A1")) 'here I assign a Value (the date in A1) to a variable (x)
Inputs x, 3, 4, ... 'and call Inputs passing a variable (x) and some values(3,4) as argments
или эквивалентно для вашего кода:
Dim xDOfB, xRetirementAge, xDateRetire ...
'xDofB = blah 'we could initialise values here
'xRetirementAge = foo
Inputs xDOfB, xRetirementAge, xDateRetire, ... 'call a function with these variables as arguments
То есть xFoo
и zFoo
- это просто переменные, содержащиеся в разных процедурах, вызывающем коде и подпрограмме Inputs соответственно
Теперь странно то, что на самом деле делает подпрограмма Inputs
. Он принимает множество аргументов, которые обычно содержат значения, которые вы хотите использовать в подпрограмме. Однако все они сразу же перезаписываются. Это немного похоже на следующее:
Option Explicit
Sub Test()
Dim x As Long
x = 5
Debug.Print x 'prints 5; the value initially stored in x
Foo x 'call Foo, passing the variable x which contains the value 5
Debug.Print x 'Actually prints 2! (see below)
End Sub
Sub Foo(arg1 As Long)
arg1 = 2
Debug.Print arg1 'prints 2, the 5 we passed is gone
End Sub
Зачем вам это делать?
Я подозреваю 2 возможные причины:
Подпрограмма объявляет загрузку аргументов, когда на самом деле целью было просто объявить загрузку переменных, и в этом случае код должен фактически быть:
Sub Inputs()
Dim zDOB As Date
Dim zRetAge As Double
Dim zRetDate As Date
...
zDOB = Range("B1")
zRetAge = Range("B7")
zRetDate = Range("B8")
...
End Sub
И может вызываться без передачи xBlah
переменных
Процедура использует передачу аргументов по умолчанию ByRef
и фактически предназначена для перезаписи всех этих переменных на месте (причина, по которой x
назначается 2, даже если она объявлена вне функции)
В этом случае подпись должна быть явной:
Sub Inputs(ByRef zDOB As Date, ByRef zRetAge As Double, ByRef zRetDate As Date ...)