VBA Создать новый словарь в цикле - PullRequest
0 голосов
/ 27 ноября 2018

Что я делаю?Предположим, 5 образцов таблиц.Я перебираю элементы и использую метод dictionary.exists для добавления только уникальных элементов.Таким образом, я получаю 1 объект словаря с уникальными значениями, проблема в том, что я использую тот же словарь «IDsDict» для этого, и мне нужно удалить dict.items, чтобы я мог получить следующий набор уникальных идентификаторов.

Я бы хотел а) либо «сохранить» словарь отдельно от цикла, чтобы dict.RemoveAll не влияло на копию этого словаря б), либо динамически добавлять новый словарь для каждого нового прохода цикла

Возможен ли один из них?

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

РЕДАКТИРОВАТЬ: в конечном итоге я хочу выяснить наборы уникальных идентификаторов, которые находятся в разных таблицах, и вернуть другие столбцы из этих таблиц.Приложение: предположим, что каждая таблица имеет идентификатор, метку времени и местоположение.Таким образом, я могу отслеживать местоположение идентификаторов с течением времени.

Ответы [ 2 ]

0 голосов
/ 27 ноября 2018

Вы сохраняете один и тот же указатель объекта 5 раз - .RemoveAll очищает элементы, которые вы добавили в предыдущем цикле, так что вы получите 5 копий одного и того же словаря с только теми элементами, которые были добавлены последними (при условии *)1002 * не запускается для последней итерации?).

Если вы хотите 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(...)
0 голосов
/ 27 ноября 2018

Вместо IDsDict.RemoveAll создайте новый Dictionary после каждой обработки образца:

Set IDsDict = New Dictionary
...