Arrays VBA什么&x27;s带括号或不带括号的调用子函数或函数之间的根本区别

Arrays VBA什么&x27;s带括号或不带括号的调用子函数或函数之间的根本区别,arrays,vba,call,parentheses,byref,Arrays,Vba,Call,Parentheses,Byref,我在通过引用将数组传递给Sub时遇到了一个问题,但是数组实际上没有得到修改。 我设法解决了这个问题,但我想知道为什么 这是一个例子 Private Function fCountArray(ByRef arrayVar As Variant) arrayVar(0) = 333 End Function Sub Test1() Dim changedArr As Variant Dim notChangedArr As Variant ' create

我在通过引用将数组传递给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(notchangedar)fCountArray changedar


为什么fCountArray(notchangedar)不通过引用传递?

好问题!我相信括号会导致求值,因此即使函数采用参数
ByRef
,实际上并不是将其传递给调用过程的本地数组,而是传递它的一个副本

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

因此,我会:

Sub fCountArray(ByRef arrayVar As Variant)
    arrayVar(0) = 333
End Sub
然后你可以简单地称之为sub,比如:

fCountArray notChangedArr
(您可能不需要将此
设为私有
,因为它至少需要一个必需的参数,因此不会在“宏”对话框中向用户公开。)

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

更新

这似乎证实了我的怀疑,即传递的是已计算表达式的copy/temp实例,而不是
ByRef
变量实例

将参数放在它自己的一组括号中会强制将其作为表达式进行求值…求值的结果将放置在临时位置,并且过程将接收到对临时位置的引用。因此,原始MyVar保留其值


我想你指的是末日潜艇。回答不错。+1,这是我最喜欢的关于这个话题的讨论:@DavidZemens Greate-answer。帮了大忙。谢谢