VBA 调用带或不带括号的 Sub 或函数之间的根本区别是什么



我有一个问题,通过引用传递一个数组,但数组实际上没有得到修改。我设法解决了这个问题,但我想知道为什么。

下面是示例。

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)没有通过引用传递?

问得好!我相信括号引起计算,所以即使函数接受参数ByRef,你实际上并没有传递给调用过程的本地数组,你传递的本质上是它的副本。

为了避免歧义,我倾向于让Sub所有没有显式返回值的过程。我使用Function只返回值/计算表达式,从不操作对象等。

所以我会写:

Sub fCountArray(ByRef arrayVar As Variant)
    arrayVar(0) = 333
End Sub

然后你可以简单地调用这个子元素,比如:

fCountArray notChangedArr

(您可能不需要创建此Private,因为它至少需要一个必需的参数,它将不会在宏对话框中暴露给用户。)

我也用String测试了这一点,并观察到相同的行为。

这似乎证实了我的怀疑,传递的是求值表达式的副本/临时实例,而不是ByRef变量实例。

http://msdn.microsoft.com/en-us/library/office/gg251769 (v = office.15) . aspx

将实参放在自己的圆括号中,强制将其作为表达式求值…求值的结果被放置在一个临时位置,过程接收到对这个临时位置的引用。因此,原来的MyVar保留了它的值。

相关内容

  • 没有找到相关文章

最新更新