gpt4 book ai didi

VBA 为什么我必须将类变量变暗为变体,而不是其类型?

转载 作者:行者123 更新时间:2023-12-02 23:36:16 25 4
gpt4 key购买 nike

在 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com