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

Tim*_*son 2 excel vba excel-vba

在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
Run Code Online (Sandbox Code Playgroud)

我试图像这样调用函数

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
Run Code Online (Sandbox Code Playgroud)

如果在tester我定义的子过程中oRecSet as ADODB.Recordset,我在执行时遇到运行时错误CopyFromRecordset.

当我定义oRecSet为a 时,错误消失了Variant.

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

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

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

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

这是怎么回事?

GTG*_*GTG 7

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

如果您将通话更改为:

ActiveSheet.Range("a1").CopyFromRecordset oRecSet
Run Code Online (Sandbox Code Playgroud)

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