我遇到了将数组传递给Sub By Reference的问题,但实际上没有修改数组。 我设法解决了这个问题,但我想知道原因。
这是一个例子。
Private Function fCountArray(ByRef arrayVar As Variant)
arrayVar(0) = 333
End Function
Sub Test1()
Dim changedArr As Variant
Dim notChangedArr As Variant
' create 2 quick array
changedArr = Array(1, 2, 33, 56, 76, 89, 10)
notChangedArr = Array(1, 2, 33, 56, 76, 89, 10)
'intest = Array(3, 1, 2)
fCountArray (notChangedArr)
Debug.Print notChangedArr(0) 'Print Out 1
fCountArray changedArr
Debug.Print changedArr(0) 'Print Out 333
End Sub
那么 fCountArray(notChangedArr)和 fCountArray changedArr
之间的根本区别是什么?为什么 fCountArray(notChangedArr)不通过引用传递?
答案 0 :(得分:3)
好问题!我相信括号正在引起评估,所以即使函数正在使用参数ByRef
,你实际上并没有将数组本地传递给调用过程,你和# 39;基本上是一份副本。
为避免含糊不清,我倾向于Sub
使所有不明确返回值的程序。我只使用Function
返回值/评估表达式,从不操纵对象/等。
所以我会这样做:
Sub fCountArray(ByRef arrayVar As Variant)
arrayVar(0) = 333
End Sub
然后你可以简单地称那个子像:
fCountArray notChangedArr
(您可能不需要创建此Private
,因为它至少需要一个必需的参数,它不会在宏对话框中向用户公开。)
我也用String
对此进行了测试并观察了相同的行为。
<强>更新强>
这似乎证实了我的怀疑,传递了评估表达式的copy / temp实例,而不是ByRef
变量实例。
http://msdn.microsoft.com/en-us/library/office/gg251769(v=office.15).aspx
将参数放在其自己的括号集中强制将其作为表达式进行评估...评估结果放在临时位置,并且过程接收对临时位置的引用。因此,原始的MyVar保留了它的价值。