将变量数组传递给方法会产生"类型不匹配"错误

时间:2014-09-03 13:52:06

标签: vba

我有以下两种方法:

Sub Start()
    Dim x As Dictionary
    Set x = New Dictionary
    Call x.Add("first", 1)
    MsgBox TypeName(x.Items) 'Displays "Variant()"
    Call Test(x.Items) 
End Sub

Sub Test(withArray() As Variant)

End Sub

我的项目正在引用" Microsoft Scripting Runtime"提供上面使用的Dictionary类。尽管x.Items返回Variant()MsgBox TypeName(x.Items)所示),我在Call Test(x.Items)上收到以下编译错误:

  

类型不匹配:预期的数组或用户定义类型

有什么问题?

注意:如果我将Test方法更改为:

Sub Test(withArray)
    MsgBox TypeName(withArray)
End Sub

成功并显示Variant()。为什么我不能将参数明确声明为Variant()类型?

1 个答案:

答案 0 :(得分:8)

Items是未声明类型的Variant,这意味着就编译器而言,它可以是运行时的任何东西 - 不一定是数组。当然,我们知道它将是一个数组,因为它是字典的一部分,但它没有声明的类型(对象浏览器显示它是一个没有返回类型的函数)所以它默认为Variant。由于编译器无法保证它在运行时是一个数组,因此它不允许您在Test()proc中尝试声明。 在运行时,它变为一个数组,因此TypeName()将其显示为Variant()

有趣的是,VBA确实允许赋值给变量数组,所以这可行:

Sub Start()
    Dim x As Dictionary
    Dim y() As Variant
    Set x = New Dictionary
    Call x.Add("first", 1)
    MsgBox TypeName(x.Items) 'Displays "Variant()"
    y = x.Items ' this is fine
    Call Test(y) 'this works 
End Sub

Sub Test(withArray() As Variant)

End Sub