为什么可以使用附加参数调用返回 Variant 的函数?
Why can a function returning Variant be called with additional parameters?
这会产生编译时错误(参数数量错误):
Option Explicit
Sub Test()
Call returnsBoolean(1)
End Sub
Function returnsBoolean() As Boolean
End Function
但是,这可以正常编译(并在从 returnsVariant
返回 后抛出 运行 时间错误 :
Option Explicit
Sub Test()
Call returnsVariant(1)
End Sub
Function returnsVariant() As Variant
End Function
为什么?
希望这可以说明问题:
第一个例子
Option Explicit
Sub Test()
Dim b as Boolean
b = returnsBoolean
Debug.Print b(1) ' error, because b is not an array
End Sub
Function returnsBoolean() As Boolean
End Function
第二个例子
Option Explicit
Sub Test()
Dim V as Variant
V = returnsBoolean
Debug.Print V(1) ' OK, because Variants can contain arrays
End Sub
Function returnsBoolean() As Variant
End Function
这是因为 (1) 被解释为数组索引而不是函数的参数。另一种思考方式是您的代码被解释为
(returnsBoolean())(1)
编辑
回复楼下评论,下面给出下标错误:
Option Explicit
Sub Test()
returnsVariant 1, 2, 5
End Sub
Function returnsVariant() As Variant
Dim x(1 To 1, 2 To 2, 3 To 3) As Long
x(1, 2, 3) = 10
Dim V As Variant
V = x
returnsVariant = V
End Function
所以 returnsVariant 1,2,5
被解释为 (returnsVariant())(1,2,5)
。在我的 Excel 版本中,放置 1,2,3
会导致 VBA 崩溃并烧毁
这会产生编译时错误(参数数量错误):
Option Explicit
Sub Test()
Call returnsBoolean(1)
End Sub
Function returnsBoolean() As Boolean
End Function
但是,这可以正常编译(并在从 returnsVariant
返回 后抛出 运行 时间错误 :
Option Explicit
Sub Test()
Call returnsVariant(1)
End Sub
Function returnsVariant() As Variant
End Function
为什么?
希望这可以说明问题:
第一个例子
Option Explicit
Sub Test()
Dim b as Boolean
b = returnsBoolean
Debug.Print b(1) ' error, because b is not an array
End Sub
Function returnsBoolean() As Boolean
End Function
第二个例子
Option Explicit
Sub Test()
Dim V as Variant
V = returnsBoolean
Debug.Print V(1) ' OK, because Variants can contain arrays
End Sub
Function returnsBoolean() As Variant
End Function
这是因为 (1) 被解释为数组索引而不是函数的参数。另一种思考方式是您的代码被解释为
(returnsBoolean())(1)
编辑
回复楼下评论,下面给出下标错误:
Option Explicit
Sub Test()
returnsVariant 1, 2, 5
End Sub
Function returnsVariant() As Variant
Dim x(1 To 1, 2 To 2, 3 To 3) As Long
x(1, 2, 3) = 10
Dim V As Variant
V = x
returnsVariant = V
End Function
所以 returnsVariant 1,2,5
被解释为 (returnsVariant())(1,2,5)
。在我的 Excel 版本中,放置 1,2,3
会导致 VBA 崩溃并烧毁