我已将变量作为参数传递给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很新。任何帮助将不胜感激。
答案 0 :(得分:5)
与大多数其他语言不同,VBA中参数的默认行为是传递它们ByRef
- 这意味着传递对原始对象/变量的引用,因此原始对象/变量可以通过被调用的函数。
另一种方法是使用ByVal
,在这种情况下,值的临时副本将传递给被调用的函数。因为它是临时的,所以当函数结束时,所做的任何更改都会丢失。
Function Components(ByVal qty As Integer, ByVal stringSize As Integer)
要注意的一件事......因为对象总是通过对对象的引用来引用,该引用的临时副本仍将指向原始对象。因此,即使指定*
,对象传递ByRef
也好像ByVal
。 (*
除非函数要对某个其他对象执行该参数的Set
,否则原始对象仍将被指向函数外部。)