Excel VBA在循环中创建新字典

Excel VBA在循环中创建新字典,excel,vba,dictionary,unique,Excel,Vba,Dictionary,Unique,我在做什么?假设5个样本表。我循环遍历这些项,并使用dictionary.exists方法仅添加唯一的项。通过这种方式,我得到了一个具有唯一值的dictionary对象,问题是,我使用了相同的dictionary“IDsDict”,并且我必须删除dict.items,以便获得下一组唯一ID 我想 a) 或者将字典与循环分开“存储”,以便dict.RemoveAll不会影响此字典的副本 b) 或者为循环的每个新运行过程动态添加一个新字典 有两种可能吗 For uniqueRow = LBound(

我在做什么?假设5个样本表。我循环遍历这些项,并使用dictionary.exists方法仅添加唯一的项。通过这种方式,我得到了一个具有唯一值的dictionary对象,问题是,我使用了相同的dictionary“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的位置。

而不是
IDsDict.RemoveAll
在每次样本处理后创建一个新的
字典

Set IDsDict = New Dictionary

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

Set IDsDict = New Dictionary

您将同一对象指针存储了5次-
。RemoveAll
清除您在上一次运行中添加的项,因此您将得到同一词典的5个副本,其中只有最后添加的项(假设上次迭代中没有运行
RemoveAll

如果需要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(...)

您将同一对象指针存储了5次-
。RemoveAll
清除您在上一次运行中添加的项,因此您将得到同一词典的5个副本,其中只有最后添加的项(假设上次迭代中没有运行
RemoveAll

如果需要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(...)

不完全确定您正在尝试什么,但是您可以创建5个初始值dict并将它们放入一个数组和循环中,将内部循环添加到每个dict中吗?我可能会将这段代码移动到一个返回dictionary对象的函数中。将代码前面的变量更改为函数参数,然后您可以在需要新字典时调用它。@Mistella谢谢您我考虑过这个方法。我的估计是,作为函数值返回的字典将有相同的“生存期”问题,一旦我重新运行该函数以获取下一个字典,它将覆盖旧的字典变量(即函数值)。这是对的吗?@Hunzen我不这么认为;如果您让函数在每次被调用时创建一个新的字典,那么它应该具有与相同的效果;是否在将返回的字典放入
collUniqueDicts
之前将其分配给变量,或者直接插入它。原始代码的问题不是字典被重写,而是您一直在使用同一个字典对象。详细说明:有一个字典对象:populate-assign To collUniquDicts-removeall-repopulate-assign-reach-removeall,etc.解除
IDsDict
变量与现有字典的关联,并为其分配一个新字典。对于函数,任何引用的对象(包括字典)在函数结束后都会“丢失”到函数中。因此,下一个函数调用将生成一个与以前任何函数完全分离的字典。(例外-全局变量)不完全确定您正在尝试什么,但您是否可以创建5个初始值dict并将它们放入数组和循环中,这样做可以将内部循环添加到每个dict?我可能会将该代码段移动到一个返回dictionary对象的函数中。将代码前面的变量更改为函数参数,然后您可以在需要新字典时调用它。@Mistella谢谢您我考虑过这个方法。我的估计是,作为函数值返回的字典将有相同的“生存期”问题,一旦我重新运行该函数以获取下一个字典,它将覆盖旧的字典变量(即函数值)。这是对的吗?@Hunzen我不这么认为;如果您让函数在每次被调用时创建一个新的字典,那么它应该具有与相同的效果;是否在将返回的字典放入
collUniqueDicts
之前将其分配给变量,或者直接插入它。原始代码的问题不是字典被重写,而是您一直在使用同一个字典对象。详细说明:有一个字典对象:populate-assign To collUniquDicts-removeall-repopulate-assign-reach-removeall,etc.解除
IDsDict
变量与现有字典的关联,并为其分配一个新字典。对于函数,任何引用的对象(包括字典)在函数结束后都会“丢失”到函数中。因此,下一个函数调用将生成一个与以前任何函数完全分离的字典。(例外-全局变量)Quick对此进行了测试,并成功了。使用它,我可以保留我存储在collUniqueDicts中的字典值,并且我仍然可以在下一次迭代中适当地填充IDsDict,而不在dict中使用旧值。@Hunzen正是因为您正在使用一个新的
字典
。Quick对此进行了测试,它做到了。使用此功能,我可以保留我存储在collUniqueDicts中的字典值,并且我仍然可以在下一次迭代中适当地填充IDsDict,而不必在dict中使用旧值。@Hunzen确切地说,因为您正在使用新的
字典