似乎调用以数组为参数的函数时,如果未使用返回值,则不会更新数组(通过引用调用)。这是一个错误还是我遗漏了什么?下面是一个简短的测试宏,其生成的输出如下:
Sub Makro1()
'
' Makro1 Makro
'
' Kortkommando: Ctrl+t
'
Dim xyzArray() As Double
ReDim xyzArray(1 To 3)
xyzArray(1) = 1
xyzArray(2) = 2
xyzArray(3) = 3
Range("D2:F2").Value = xyzArray
TestFunction (xyzArray)
Range("D3:F3").Value = xyzArray
newXYZ = TestFunction(xyzArray)
Range("D4:F4").Value = xyzArray
TestSub xyzArray
Range("D5:F5").Value = xyzArray
TestFunction (xyzArray)
Range("D6:F6").Value = xyzArray
TestFunctionNoReturn (xyzArray)
Range("D7:F7").Value = xyzArray
End Sub
Private Function TestFunction(XYZ) As Double()
XYZ(1) = XYZ(1) + 1
XYZ(2) = XYZ(2) + 1
XYZ(3) = XYZ(3) + 1
TestFunction = XYZ
End Function
Private Sub TestSub(XYZ)
XYZ(1) = XYZ(1) + 1
XYZ(2) = XYZ(2) + 1
XYZ(3) = XYZ(3) + 1
End Sub
Private Function TestFunctionNoReturn(XYZ) As Double()
XYZ(1) = XYZ(1) + 1
XYZ(2) = XYZ(2) + 1
XYZ(3) = XYZ(3) + 1
End Function
您的问题是误解了何时在参数周围使用括号,何时不使用括号。
如果调用函数并读取结果,则需要将参数放在括号中:
要调用子程序,有两种不同的方法:要么省略括号,要么使用
Call
命令。以下两行都执行相同的操作:不太为人所知的是你也可以使用函数来做到这一点(当你对结果不感兴趣时):
然而,下列语句中的括号却具有完全不同的含义:
如您所见,现在例程名称和参数之间有一个空格。这是因为括号表示您想要在调用例程之前
3*(4+5)
评估括号内的项(类似于 这样的项) 。VBA 运行时将“评估”
xyzArray
。没有什么可做的,但评估总是意味着分配一个新的内存空间来保存结果。在3*(4+5)
这样的术语中很明显,您需要一个空间来保存结果27
,但同样适用于xyzArray
:创建数据的副本。现在您通过引用传递副本,此副本在您的例程中被修改,但在调用之后,此副本就消失了,因为它不再使用。的原始内容xyzArray
保持不变,这就是您的问题。有时(非常少见)会使用该语法来防止通过引用传递的参数被例程修改。然而,在几乎所有情况下,这都是由于错误造成的。
为了证明括号不用于定义参数,请尝试以下内容:
这将引发编译器错误,因为
(xyzArray, "Hello World")
无法评估该术语。