在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中检查对象的属性似乎对我没有任何影响。
发生了什么事?
答案 0 :(得分:7)
CopyFromRecordSet需要一个Variant参数。因为你(不小心?)按值发送记录集,因为oRecSet周围的(),类型匹配似乎非常严格,导致错误。
如果您将通话更改为:
ActiveSheet.Range("a1").CopyFromRecordset oRecSet
当oRecSet是RecordSet时它会起作用,但是你不会强制通过By Value参数传递。实际上,函数声明并没有指定参数是ByVal还是ByRef,但是人们不会期望"复制来自记录集"改变它的内容的方法。
答案 1 :(得分:3)
您不必,您只需要删除括号
ActiveSheet.Range("a1").CopyFromRecordset oRecSet