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告诉我类型oRecSet是Recordset/Recordset
当我使用变体方法时,Watch告诉我类型oRecSet是Variant/Object/Recordset
在Watch中检查对象的属性似乎对我没有任何影响.
这是怎么回事?
CopyFromRecordSet需要Variant参数.因为你(不小心?)按值发送记录集,因为oRecSet周围的(),类型匹配似乎非常严格,导致错误.
如果您将通话更改为:
ActiveSheet.Range("a1").CopyFromRecordset oRecSet
Run Code Online (Sandbox Code Playgroud)
当oRecSet是RecordSet时它会起作用,但是你不会强制By Value参数传递.实际上函数声明没有指定参数是ByVal还是ByRef,但是人们不会期望" 从记录集复制"方法来改变它的内容.