在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,但是不会期望“从记录集复制”方法来更改其内容。