2

在 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.

当我定义oRecSetVariant.

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

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

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

在 Watch 中检查对象的属性对我来说似乎没有什么不同。

这是怎么回事?

4

2 回答 2

7

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

如果您将呼叫更改为:

ActiveSheet.Range("a1").CopyFromRecordset oRecSet

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

于 2012-04-20T13:27:54.877 回答
3

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

ActiveSheet.Range("a1").CopyFromRecordset oRecSet
于 2012-04-20T13:26:51.193 回答