【发布时间】: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 answer 将
IDsDict变量与现有字典解除关联并分配它一个新的。使用函数,任何引用的对象(包括字典)在函数结束后都会“丢失”到函数中。因此,下一个函数调用将导致字典与之前的任何字典完全分开。 (例外 - 全局变量)
标签: excel vba dictionary unique