为什么可以使用其他参数调用返回Variant的函数?

时间:2015-03-12 08:18:22

标签: vba excel-vba ms-access compiler-errors excel

这会产生编译时错误(参数数量错误):

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

为什么?

1 个答案:

答案 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崩溃并刻录