VBA使用括号或不使用括号调用Sub或Function之间的根本区别是什么

时间:2014-05-22 02:17:25

标签: arrays vba call parentheses byref

我遇到了将数组传递给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)不通过引用传递?

1 个答案:

答案 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保留了它的价值。