【问题标题】:Errors adding items to a VBA/VB6 Collection将项目添加到 VBA/VB6 集合时出错
【发布时间】:2011-03-23 03:02:27
【问题描述】:

我仍在学习 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

【问题讨论】:

  • 请问您是否也可以发布“columnMap”类?

标签: vba collections vb6 excel ms-office


【解决方案1】:

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

Set getRevColumns = bag

【讨论】:

  • 是的,你肯定就在那儿!奇怪的 VBA...return 关键字在哪里?!
  • 没有明确的return语句。返回值(或您的情况下的对象)必须与函数的名称匹配。
  • 是的,经过 20 分钟的挠头和另外 10 分钟的谷歌搜索,我明白了!
【解决方案2】:

尝试在添加中删除它周围的括号:

bag.Add itm

bag.Add itm, key

自从我不得不使用 VBA/VB6 以来已经有一段时间了,但我相信包含括号会导致它通过值而不是引用传递。我可能是错的。

【讨论】:

  • 一个字:Bizzare!感谢一百万的伙伴。我仍然遇到错误,但现在是其他问题。
  • StackOverflow 上的问题 Hidden features of VBA 中也讨论了此行为。 stackoverflow.com/questions/1070863/…
【解决方案3】:

你需要说

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

希望对你有帮助

【讨论】:

  • 它绝对可以交配!不明白为什么我不应该在那个 add 方法周围使用 () ......但无论如何只要它有效。
  • 是的很疯狂,但正如文森特之前提到的那样,参数如何传递(通过值或通过引用)背后似乎有一些逻辑。我用谷歌搜索了一段时间,但找不到任何东西。 VBA 在某种程度上是旧的 VB6,并不完美。
【解决方案4】:

我在收藏时遇到了类似的问题。

我把它调暗了,但没有用 New 设置它或初始化它。

基本上我有

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

我在添加之前添加了以下内容

Set collection1 = New Collection
Call collection1.init

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

【讨论】:

    猜你喜欢
    • 2012-01-01
    • 2022-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-09
    • 2018-04-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多