VBA为什么我必须将类变量调暗为变量,而不是它的类型?

时间:2012-04-20 13:09:01

标签: vba excel-vba excel

在Excel宏中,我有一个函数定义为像这样返回一个Recordset

Function GetCommissionDataRecordset(doctorCode As String) As ADODB.Recordset
    Set GetCommissionDataRecordset = New ADODB.Recordset
    .
    . ' setup the connection and SQL string...
    .
    GetCommissionDataRecordset.Open strSQL
end function

我试图像这样调用函数

sub tester()
    'Dim oRecSet As ADODB.Recordset  ' this doesn't work, needs to be a variant
    Dim oRecSet As Variant
    Set oRecSet = GetCommissionDataRecordset("GC")
    'Copy Data to Excel'

    ActiveSheet.Range("a1").CopyFromRecordset (oRecSet)
end sub

如果在tester子过程中我定义了oRecSet as ADODB.Recordset,那么在执行CopyFromRecordset时会出现运行时错误。

当我将oRecSet定义为Variant时,错误就消失了。

运行时错误为430 Class does not support Automation or does not support expected interface

发生错误时,Watch告诉我oRecSet的类型为Recordset/Recordset

当我使用变体方法时,Watch告诉我oRecSet的类型为Variant/Object/Recordset

在Watch中检查对象的属性似乎对我没有任何影响。

发生了什么事?

2 个答案:

答案 0 :(得分:7)

CopyFromRecordSet需要一个Variant参数。因为你(不小心?)按值发送记录集,因为oRecSet周围的(),类型匹配似乎非常严格,导致错误。

如果您将通话更改为:

ActiveSheet.Range("a1").CopyFromRecordset oRecSet

当oRecSet是RecordSet时它会起作用,但是你不会强制通过By Value参数传递。实际上,函数声明并没有指定参数是ByVal还是ByRef,但是人们不会期望"复制来自记录集"改变它的内容的方法。

答案 1 :(得分:3)

您不必,您只需要删除括号

ActiveSheet.Range("a1").CopyFromRecordset oRecSet