通过引用和修改内容的VBA传递数组

时间:2015-02-04 16:28:34

标签: arrays vba function pass-by-reference subroutine

VBA问题。我用它来制作Solidworks宏,但这并不重要。

有人可以解释将数组(Double-1维,长度为3)传递给子程序或函数的语法,以便我可以修改内容。我知道他们必须通过引用传递。我正在谈论确切的语法,因为我尝试的所有内容都会在子例程/函数调用中出现类型不匹配错误。

我正在寻找的是Doubles数组的正确Dim语句,initialize语句使所有数组值为零,然后是我需要的子程序调用语句和子程序头。如果我需要使用变量类型或动态数组,请具体说明,即使我已经知道数组的类型和大小。使用函数或子函数,我不关心它。

我的代码现在工作正常,但是当我使用数组时,我已经厌倦了避免函数和子程序调用。我在这里看了无数的文档和类似的问题,但我无法弄清楚。非常感谢。

2 个答案:

答案 0 :(得分:15)

这非常简单,使用函数签名中的ByRef关键字将通过引用而不是值传递数组。这意味着操作该数组将被保留并冒泡到调用范围。这可能过于简单了,但是这样想:

  • ByRef:您正在传递对 thing (数组,对象等)的引用,并且对 thing 的任何转换都将是显而易见 thing 存在的任何地方。
  • ByVal:您正在传递该事物的表示。从本质上讲,你正在通过一个"副本"它的。你可以操作这个对象,但是不是来自调用范围的同一个对象,它只是一个副本。因此,当封闭范围结束时,您仍然只剩下原始内容。

将数组初始化为数字类型,这将为您提供默认的0值。

示例如下:

Option Explicit
Sub foo()
    Dim myArray(1 To 3) As Double  'The array is initialized with zero-values 

    Call bar(myArray)

    MsgBox myArray(3)

End Sub

Sub bar(ByRef dblArray() As Double)

    dblArray(1) = 123
    dblArray(2) = 345
    dblArray(3) = 33456

End Sub

答案 1 :(得分:1)

默认情况下,数组是通过引用传递的。我在一些地方看到传递“ByVal”会引发异常。但是,我已经能够在 O365 中毫无问题地使用 ByVal。