VBA Дополнительные пары ключ / элемент в scripting.dictionary
Этот код работал в течение нескольких дней, просто просматривая словарь. Цикл начал разрываться, и у меня есть дополнительные ключи в словаре, и я понятия не имею, откуда они взялись.
Я создаю scripting.dictionary со следующим:
Dim riskDict As New Scripting.Dictionary
После чего объект пуст, как видно на часах:
Затем я добавляю свою первую пару ключ / элемент:
riskDict.Add "Weight", Array("WP", 0)
И после выполнения этой одной строки кода у меня теперь есть это:
Откуда взялись эти два дополнительных ключа (2 и 3)? Это проблема, так как позже в моем коде я использую:
For Each key In riskDict
temp = riskDict(key)
...
Next key
И этот цикл прерывается, так как он начинает ссылаться на пустые ключи. Похоже, что это не происходило до сих пор, и код работал нормально в течение нескольких дней. (Я изменил некоторые вещи в другом месте кода, но совершенно не связан с этим.)
Дайте мне знать, если я делаю что-то смешное или упускаю что-то очевидное, и спасибо!
2 ответа
Сделайте riskDict приватным или очистите ваш массив перед его использованием. Трудно сказать, что вы делаете с ним, так как отсутствуют важные элементы.
Dim riskDict As New Scripting.Dictionary
Хотя это старый вопрос, он все еще может представлять интерес для других пользователей.
До того, как в инициализированный объект словаря будет добавлен первый элемент, локальное окно редактора VBA не должно быть включено, если в области действия этого объекта словаря существует точка останова. В противном случае в словарь может быть вставлена пара ключ-значение (0, Empty). Эта запись словаря не может быть снова удалена в ближайшем окне, даже если Dictionary.RemoveAll завершается ошибкой. Это имеет место, даже если локальное окно тем временем снова было закрыто.
Точные обстоятельства, при которых происходит такое поведение, мне не ясны: до сих пор я наблюдал такое поведение объектов Dictionary только в модулях классов, но в одной и той же строке кода это иногда происходит, иногда нет.
В этом обсуждении SO также описывается поведение, когда для объекта Dictionary установлены часы. Там такое поведение связано со свойством словарей, что при запросе неизвестного ключа этот ключ автоматически добавляется со значением «Пустой».