将项添加到VBA / VB6集合时出错

时间:2010-07-30 07:55:01

标签: vba collections vb6 excel-vba ms-office

我还在学习VBA,我无法弄清楚我是否遇到过Collections对象的这么多问题。

我有一个添加自定义对象的函数(我创建了一个非常简单的类来存储一些数据),这些函数执行典型的“读取数据,创建对象表示,将其粘贴到集合中”这类东西。

如果我尝试在bag.add调用中添加“密钥”,则会收到“编译错误。预期:=”消息。

如果我不这样做,那么当我运行该程序时,它会显示“编译错误。参数不是可选的”并突出显示“getRevColumns = bag”行。

我不能为我的生活弄清楚是不是正在发生!我怀疑我的包包初始化有什么问题?! PS:columnMap是我的自定义类的名称。

Function getRevColumns() As Collection

Dim rng As Range
Dim i As Integer
Dim bag As Collection
Dim opManCol As Integer, siebelCol As Integer
Dim opManColName As String, siebelColName As String
Dim itm As columnMap

Set bag = New Collection
Set rng = shSiebelMap.UsedRange.Columns(5)

i = 1
For i = 1 To rng.Rows.count

    If StrComp(UCase(rng.Cells(i).value), "Y") = 0 Then

        opManCol = rng.Rows(i).OffSet(0, -2).value
        opManColName = rng.Rows(i).OffSet(0, -4)
        siebelCol = rng.Rows(i).OffSet(0, -1).value
        siebelColName = rng.Rows(i).OffSet(0, -3)

        Set itm = New columnMap
        itm.opManColName = opManColName
        itm.opManColNumber = opManCol
        itm.siebelColName = siebelColName
        itm.siebelColNumber = siebelCol

        'WHY DOESN'T IT WORK!''
        bag.Add (itm)

        'MsgBox "opMan Col: " & opManColName & " : " & opManCol & ". Siebel Col: " & siebelColName & " : " & siebelCol'

    End If

Next i

getRevColumns = bag

End Function

4 个答案:

答案 0 :(得分:11)

尝试在add:

中删除它周围的parens
bag.Add itm

bag.Add itm, key

已经有一段时间了,因为我不得不使用VBA / VB6,但我相信包括parens导致它通过值而不是通过引用传递。我错了。

答案 1 :(得分:3)

袋子是一个物体。对象的规则#1使用Set

Set getRevColumns = bag

答案 2 :(得分:0)

你需要说

set getRevColumns = bag

我猜你在添加时遇到了问题。我不知道为什么会这样,但它适用于

bag.add itm

我以简单的方式尝试了整个事情,这是我的工作代码

Sub myroutine()

     Dim bag As Collection
     Dim itm As clsSimple

     Set bag = getTheCollection()

     Set itm = bag.Item(1)
     MsgBox (itm.someObjectValue)

     Set itm = bag.Item(2)
     MsgBox (itm.someObjectValue)


End Sub

Function getTheCollection() As Collection

        Dim bag As Collection
        Dim itm As clsSimple

        Set bag = New Collection

        Set itm = New clsSimple
        itm.someObjectValue = "value 1"
        bag.Add itm

        Set itm = New clsSimple
        itm.someObjectValue = "value 2"
        bag.Add itm

        Set getTheCollection = bag

End Function

课程非常简单:

Public someObjectValue As String

希望有所帮助

答案 3 :(得分:-1)

我的收藏品有类似的问题。

我昏暗但没有用新的或初始化它。

基本上我有

Dim collection1 As Collection
...
collection1.Add item     'no compile error just empty

我在添加

之前添加了以下内容
Set collection1 = New Collection
Call collection1.init

然后它就像一个魅力......我还将Dim语句从Sub移到模块的顶部,使其成为一个类变量