传递给函数的VBA变量被修改

时间:2017-06-02 04:27:46

标签: vba excel-vba excel

我已将变量作为参数传递给VBA函数,但只引用了函数中的参数,而不是原始变量。似乎原始变量正在由函数修改,这意味着它共享相同的地址空间?这里发生了什么,我该如何防止它发生?

这是函数:(单位,数十,数百和数千是全局整数变量)

Function Components(qty As Integer, stringSize As Integer)

If qty < stringSize Then
    units = qty

ElseIf qty >= stringSize * 100 Then
    thousands = qty \ (stringSize * 100)
    qty = qty - (thousands * stringSize * 100)
    Components qty, stringSize


ElseIf qty >= stringSize * 10 Then
    hundreds = qty \ (stringSize * 10)
    qty = qty - (hundreds * stringSize * 10)
    Components qty, stringSize

ElseIf qty >= stringSize Then
    tens = qty \ (stringSize)
    qty = qty - (tens * stringSize)
    Components qty, stringSize

End If

End Function

我使用

从另一个函数调用它
Components charQty, 26

当charQty = 565时,它作为参数传递给Components和 组件完成后,charQty = 19。我通过在函数调用之前和之后立即打印值来确定这一点。

我对VBA很新。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:5)

与大多数其他语言不同,VBA中参数的默认行为是传递它们ByRef - 这意味着传递对原始对象/变量的引用,因此原始对象/变量可以通过被调用的函数。

另一种方法是使用ByVal,在这种情况下,值的临时副本将传递给被调用的函数。因为它是临时的,所以当函数结束时,所做的任何更改都会丢失。

Function Components(ByVal qty As Integer, ByVal stringSize As Integer)

要注意的一件事......因为对象总是通过对对象的引用来引用,该引用的临时副本仍将指向原始对象。因此,即使指定*,对象传递ByRef也好像ByVal。 (*除非函数要对某个其他对象执行该参数的Set,否则原始对象仍将被指向函数外部。)

MSDN documentation