VBA问题。我用它来制作Solidworks宏,但这并不重要。
有人可以解释将数组(Double-1维,长度为3)传递给子程序或函数的语法,以便我可以修改内容。我知道他们必须通过引用传递。我正在谈论确切的语法,因为我尝试的所有内容都会在子例程/函数调用中出现类型不匹配错误。
我正在寻找的是Doubles数组的正确Dim语句,initialize语句使所有数组值为零,然后是我需要的子程序调用语句和子程序头。如果我需要使用变量类型或动态数组,请具体说明,即使我已经知道数组的类型和大小。使用函数或子函数,我不关心它。
我的代码现在工作正常,但是当我使用数组时,我已经厌倦了避免函数和子程序调用。我在这里看了无数的文档和类似的问题,但我无法弄清楚。非常感谢。
答案 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。