Excel VBA:将集合从类传递到模块问题

Posted

技术标签:

【中文标题】Excel VBA:将集合从类传递到模块问题【英文标题】:Excel VBA: Passing a collection from a class to a module issue 【发布时间】:2010-04-20 10:40:36 【问题描述】:

我一直在尝试将集合从类中的属性返回到普通模块中的例程。我遇到的问题是集合在类(FetchAll)的属性中正确填充,但是当我将集合传递回模块(测试)时,所有条目都填充了列表中的最后一项。

这是标准模块中的Test子例程:

Sub Test()
    Dim QueryType As New QueryType
    Dim Item
    Dim QueryTypes As Collection
    Set QueryTypes = QueryType.FetchAll

    For Each Item In QueryTypes 
        Debug.Print Item.QueryTypeID, _
                    Left(Item.Description, 4)
    Next Item
End Sub

这是 QueryType 类中的 FetchAll 属性:

Public Property Get FetchAll() As Collection

    Dim RS As Variant
    Dim Row As Long

    Dim QTypeList As Collection
    Set QTypeList = New Collection

    RS = .Run ' populates RS with a record set from a database (as an array),
                      ' some code removed

    ' goes through the array and sets up objects for each entry
    For Row = LBound(RS, 2) To UBound(RS, 2)
        Dim QType As New QueryType
        With QType
            .QueryTypeID = RS(0, Row)
            .Description = RS(1, Row)
            .Priority = RS(2, Row)
            .QueryGroupID = RS(3, Row)
            .ActiveIND = RS(4, Row)
        End With

        ' adds new QType to collection                
        QTypeList.Add Item:=QType, Key:=CStr(RS(0, Row))

        Debug.Print QTypeList.Item(QTypeList.Count).QueryTypeID, _
                    Left(QTypeList.Item(QTypeList.Count).Description, 4)
    Next Row

    Set FetchAll = QTypeList

End Property

这是我在 FetchAll 中调试得到的输出:

1 Numb
2 PBM 
3 BPM 
4 Bran
5 Claw
6 FA C
7 HNW 
8 HNW 
9 IFA 
10 Manu
11 New 
12 Non 
13 Numb
14 Repo
15 Sell
16 Sms 
17 SMS 
18 SWPM

这是我在测试中调试得到的输出:

18 SWPM
18 SWPM
18 SWPM
18 SWPM
18 SWPM
18 SWPM
18 SWPM
18 SWPM
18 SWPM
18 SWPM
18 SWPM
18 SWPM
18 SWPM
18 SWPM
18 SWPM
18 SWPM
18 SWPM
18 SWPM

有人有什么想法吗?我可能完全忽略了一些东西!

谢谢, 马丁

【问题讨论】:

【参考方案1】:

您创建的 QueryType:

Dim QType As New QueryType

应该是:

Dim QType As QueryType
Set QType = New QueryType

如果您不这样做,您将重复使用 QueryType 的同一实例(因为没有 Set),因此会将同一引用添加到集合中,从而使每个项目引用您的类的单个实例. (你添加的最后一个)

【讨论】:

你发布这个答案的速度比我快 1 分钟! 更多解释请看这里:***.com/questions/2478097/…

以上是关于Excel VBA:将集合从类传递到模块问题的主要内容,如果未能解决你的问题,请参考以下文章

Excel / VBA代码忽略输入的参数

将 VARIANT 从 mac OS X Excel 2011 VBA 传递到 c++

将多维数组传递到 VBA 中的 Excel UDF

如何在excel vba中传递包含excel文件路径的字符串以访问vba

如何将 Excel 数组公式传递给 VBA UDF?

EXCEL VBA 事件的问题。