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

标签 arrays vba call parentheses byref

我在通过引用将数组传递给子对象时遇到了问题,但数组实际上并没有被修改。 我设法解决了这个问题,但我想知道原因。

这是例子。

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 设为私有(private),因为它至少需要一个必需的参数,因此不会在宏对话框中向用户公开。)

我也使用 String 对此进行了测试并观察到相同的行为。

更新

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

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

Placing the argument in its own set of parentheses forces evaluation of it as an expression...The result of the evaluation is placed in a temporary location, and a reference to the temporary location is received by the procedure. Thus, the original MyVar retains its value.

关于arrays - VBA 带或不带括号的调用 Sub 或 Function 之间的根本区别是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23796803/

相关文章:

java - 为什么 Arrays.binarySearch(Object[],Object) 采用 Object args?

python - 自动查找非 nan 值及其对应的索引点

c - 传递给 C 函数时丢失 char 数组的值

Excel VBA 脚本动态添加系列到图表

excel - VBA - 如何测试是否提供了可选字符串参数?

c - 在C中,如何存储长字符串(例如密码)

javascript - 调用 KeyDown 事件

javascript - 使用调用来传递上下文

python - 在 subprocess.call 中使用大于运算符

excel - 如何使用 VBA 获取组中所有成员的列表?