【问题标题】:VBA Create new dictionary on loopVBA循环创建新字典
【发布时间】:2018-11-27 16:01:36
【问题描述】:

我在做什么?假设 5 个样本表。我遍历项目,并使用 dictionary.exists 方法仅添加唯一项目。这样我得到了 1 个具有唯一值的字典对象,问题是,我为此使用了相同的字典“IDsDict”,我必须删除 dict.items 以便获得下一组唯一 ID。

我想 a) 将字典与循环分开“存储”,以便 dict.RemoveAll 不会影响该字典的副本 b)或为循环的每个新运行动态添加一个新字典

有两种可能吗?

For uniqueRow = LBound(IDsDataFiltered, 2) To UBound(IDsDataFiltered, 2)
            If Not IDsDict.Exists(IDsDataFiltered(1, uniqueRow)) Then
                counter = counter + 1
                globalcounter = globalcounter + 1
                'Add to Dictionaries
                IDsDict.Add IDsDataFiltered(1, uniqueRow), globalcounter
            End If
Next uniqueRow

collUniqueDicts.Add IDsDict, timeStampsIDs
IDsDict.RemoveAll

编辑:最终,我想找出位于不同表中的唯一 ID 集,并从这些表中返回其他列。应用:假设每个表都有 ID、时间戳和位置。这样我就可以随着时间的推移跟踪 ID 的位置。

【问题讨论】:

  • 不完全确定您在尝试什么,但您可以创建 5 个首字母 dicts 并将它们放入一个数组并循环执行您的内部循环添加到每个 dict 吗?
  • 我可能会将该部分代码移动到一个返回字典对象的函数中。把前面代码中的变量改成函数参数,然后就可以在需要新字典的时候调用了。
  • @Mistella 谢谢我考虑过这种方法。我的估计是作为函数值返回的字典将具有相同的“生命周期”问题,一旦我重新运行该函数以获取下一个字典,它将覆盖旧的字典变量(即函数值)。这是正确的吗?
  • @Hunzen 我不这么认为;如果您让该函数在每次调用时都创建一个新字典,它应该与@Pragmateek's answer 具有相同的效果;是在将返回的字典放入 collUniqueDicts 之前将其分配给变量,还是直接将其插入。您原始代码的问题不在于字典被覆盖,而在于您一直在使用同一个字典对象。
  • 详细说明:有一个字典对象:填充 - 分配给 collUniquDicts - removeall - 重新填充 - 再次分配 - removeall 等 @Prmateek's answerIDsDict 变量与现有字典解除关联并分配它一个新的。使用函数,任何引用的对象(包括字典)在函数结束后都会“丢失”到函数中。因此,下一个函数调用将导致字典与之前的任何字典完全分开。 (例外 - 全局变量)

标签: excel vba dictionary unique


【解决方案1】:

您将相同的对象指针存储 5 次 - .RemoveAll 会清除您在上一次运行中添加的项目,因此您最终会得到同一个字典的 5 个副本,其中只有最后添加的项目(假设 @ 987654322@ 没有在最后一次迭代中运行?)。

如果你想要 5 个对象,你需要 5 个不同的指针。

我会将字典填充代码提取到它自己的字典返回函数中。

Private Dictionarize(...) As Dictionary
    Dim result As Dictionary
    Set result = New Dictionary
    '...populate one dictionary
    Set Dictionarize = result
End Function

为函数提供它需要使用的参数,然后根据需要调用它 5 次:

collUniqueDicts.Add Dictionarize(...)

【讨论】:

    【解决方案2】:

    在每个样本处理后创建一个新的Dictionary,而不是IDsDict.RemoveAll

    Set IDsDict = New Dictionary
    

    【讨论】:

    • 对此进行了快速测试,它做到了。使用它,我可以保留我存储在 collUniqueDicts 中的字典值,并且我仍然可以在下一次迭代中适当地填充 IDsDict,而字典中没有旧值。
    • @Hunzen 没错,因为您正在使用新的Dictionary
    猜你喜欢
    • 2023-03-12
    • 2018-12-04
    • 2017-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-17
    相关资源
    最近更新 更多