这会产生编译时错误(参数数量错误):
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
为什么?
答案 0 :(得分:2)
这有望说清楚:
第一个例子
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崩溃并刻录