我已将变量作为参数传递给 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 当它作为参数传递给组件和
组件完成后 charQty = 19。我通过在函数调用之前和之后立即打印值来确定这一点。
我对VBA相当陌生。任何帮助将不胜感激。
最佳答案
与大多数其他语言不同,VBA 中参数的默认行为是传递 ByRef
- 这意味着对原始对象/变量的引用被传递,因此原始对象/变量可以被调用函数修改。
另一种方法是使用 ByVal
,在这种情况下,将值的临时副本传递给被调用函数。因为它是临时的,所以当函数结束时所做的任何更改都会丢失。
Function Components(ByVal qty As Integer, ByVal stringSize As Integer)
需要注意的一件事......因为对象总是由对该对象的引用来引用,所以该引用的临时副本仍将指向原始对象。所以几乎是
*
好像正在传递一个对象 ByRef
即使您指定 ByVal
. ( *
除非函数要对该参数执行 Set
到某个其他对象,否则原始对象仍将被指向函数外部。)MSDN documentation
关于传递给函数的 VBA 变量被修改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44320800/