VBA 通过引用传递数组并修改内容
VBA Pass Array By Reference and Modify Contents
VBA问题。我用它来制作 Solidworks 宏,但这并不重要。
有人可以解释将数组(Double 类型的一维,长度为三)传递给子例程或函数的语法,以便我可以修改内容。我知道它们必须通过引用传递。我说的是准确的语法,因为我尝试的所有操作都会在 subroutine/function 调用中出现类型不匹配错误。
我要寻找的是双精度数组的正确 Dim 语句、使所有数组值都为零的初始化语句,然后是我需要的子例程调用语句和子例程 header。如果我需要使用变体类型或动态数组,请具体说明,即使我已经知道数组的类型和大小。使用函数还是子函数,我不在乎哪个。
我的代码目前运行良好,但我厌倦了在使用数组时避免调用函数和子例程。我在这里查看了无数文档和类似问题,但我就是想不通。非常感谢。
这很简单,在函数签名中使用 ByRef
关键字将通过引用而不是值传递您的数组。这意味着操作 到 该数组将被保留并冒泡到调用范围。这可能过于简单化了,但可以这样想:
ByRef
:您正在传递对 thing(数组、对象等)的引用以及对该 thing[的任何转换=30=] 将在任何存在 thing 的地方出现。
ByVal
:您正在传递事物的 value 表示。本质上,您正在传递它的 "copy"。您可以操作此对象,但它不是 调用作用域中的同一个对象,它只是一个副本。所以当封闭范围结束时,你仍然只剩下原来的东西。
将您的数组初始化为数字类型,这将为您提供默认的 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
默认情况下,数组通过引用传递。我在一些地方看到传递“ByVal”会引发异常。但是,我已经能够在 O365 中毫无问题地使用 ByVal。
VBA问题。我用它来制作 Solidworks 宏,但这并不重要。
有人可以解释将数组(Double 类型的一维,长度为三)传递给子例程或函数的语法,以便我可以修改内容。我知道它们必须通过引用传递。我说的是准确的语法,因为我尝试的所有操作都会在 subroutine/function 调用中出现类型不匹配错误。
我要寻找的是双精度数组的正确 Dim 语句、使所有数组值都为零的初始化语句,然后是我需要的子例程调用语句和子例程 header。如果我需要使用变体类型或动态数组,请具体说明,即使我已经知道数组的类型和大小。使用函数还是子函数,我不在乎哪个。
我的代码目前运行良好,但我厌倦了在使用数组时避免调用函数和子例程。我在这里查看了无数文档和类似问题,但我就是想不通。非常感谢。
这很简单,在函数签名中使用 ByRef
关键字将通过引用而不是值传递您的数组。这意味着操作 到 该数组将被保留并冒泡到调用范围。这可能过于简单化了,但可以这样想:
ByRef
:您正在传递对 thing(数组、对象等)的引用以及对该 thing[的任何转换=30=] 将在任何存在 thing 的地方出现。ByVal
:您正在传递事物的 value 表示。本质上,您正在传递它的 "copy"。您可以操作此对象,但它不是 调用作用域中的同一个对象,它只是一个副本。所以当封闭范围结束时,你仍然只剩下原来的东西。
将您的数组初始化为数字类型,这将为您提供默认的 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
默认情况下,数组通过引用传递。我在一些地方看到传递“ByVal”会引发异常。但是,我已经能够在 O365 中毫无问题地使用 ByVal。