Имена переменных не совпадают, но все еще работают - PullRequest
3 голосов
/ 06 марта 2019

Я смотрю на файл, созданный кем-то в моей работе, он имеет следующий код:

Sub Inputs(zDOB As Date, zRetAge As Double, zRetDate As Date, zDOJ As Date, zEmployer As Double, zEmployee As Double, _
           zSalary() As Double, zInflation As Double, zFund As Double, zAVCRate As Double, zEvalDate As Date, zAVCFund As Double, _
           zCharge As Double, zFund2 As Double, zAVCFund2 As Double)

    zDOB = Range("B1")
    zRetAge = Range("B7")
    zRetDate = Range("B8")
    zDOJ = Range("B11")
    zEmployer = Range("B15")
    zEmployee = Range("B16")
    zSalary(0) = Range("B14")
    zInflation = Range("B19")
    zFund = Range("B20")
    zFund2 = Range("B20")
    zAVCRate = Range("B24")
    zAVCFund = Range("B27")
    zAVCFund2 = Range("B27")
    zEvalDate = Range("B6")
    zCharge = Range("J7")

End Sub

Достаточно справедливо, это настройка входов, которые будут использоваться позже.

Моя проблема в том, что этот саб вызывается снова:

Call Module3.Inputs(xDOfB, xRetirementAge, xDateRetire, xDOJ, xEmployer, xEmployee, xSalary, _
                         xInflation, xFund, xAVC, xEvalDate, xAVCFund, xCharge, xFund2, xAVCFund2)

Z теперь x, это имеет значение? Как это работает?

Ответы [ 2 ]

1 голос
/ 06 марта 2019

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

Public zDOB As Variant
Public zRetAte As Variant
Sub textSub()
    Call Inputs
End Sub
Sub Inputs()
    zDOB = Range("B1")
    zRetAge = Range("B7")
End Sub
0 голосов
/ 06 марта 2019

Когда вы вызываете 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 возможные причины:

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

     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 переменных

  2. Процедура использует передачу аргументов по умолчанию ByRef и фактически предназначена для перезаписи всех этих переменных на месте (причина, по которой x назначается 2, даже если она объявлена ​​вне функции)

    В этом случае подпись должна быть явной:

    Sub Inputs(ByRef zDOB As Date, ByRef zRetAge As Double, ByRef zRetDate As Date ...)
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...