在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中检查对象的属性似乎对我没有任何影响。

这是怎么回事?

最佳答案

CopyFromRecordSet需要一个Variant参数。当您(偶然地?)按值发送记录集时,由于oRecSet周围的(),类型匹配似乎非常严格,从而导致错误。

如果您将呼叫更改为:

ActiveSheet.Range("a1").CopyFromRecordset oRecSet


当oRecSet是RecordSet时,它将起作用,但是您将不会强制按值传递参数。实际上,函数声明没有指定参数是ByVal还是ByRef,但是不会期望“从记录集复制”方法来更改其内容。

10-08 20:11