作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在 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 定义为 ADODB.Recordset
,则在执行 CopyFromRecordset
时会出现运行时错误。
当我将 oRecSet
定义为 Variant
时,错误消失。
运行时错误为430类不支持自动化或不支持预期的接口(interface)
。
发生错误时,Watch 告诉我 oRecSet
的类型是 Recordset/Recordset
当我使用变体方法时,Watch 告诉我 oRecSet
的类型是 Variant/Object/Recordset
在 Watch 中检查对象的属性对我来说似乎没有什么区别。
发生什么事了?
最佳答案
CopyFromRecordSet 需要一个 Variant 参数。当您(不小心?)按值发送记录集时,由于 oRecSet 周围的 (),类型匹配似乎相当严格,导致错误。
如果您将通话更改为:
ActiveSheet.Range("a1").CopyFromRecordset oRecSet
当 oRecSet 是 RecordSet 时,它将起作用,但随后您将不会强制按值参数传递。实际上,函数声明并没有指定参数是 ByVal 还是 ByRef,但人们不会期望“copy from recordset”方法来更改其内容。
关于VBA 为什么我必须将类变量变暗为变体,而不是其类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10246893/
我是一名优秀的程序员,十分优秀!