Проблема целостности данных в словаре Excel VBA - PullRequest
0 голосов
/ 27 мая 2019

У меня, кажется, есть серьезная проблема с целостностью данных при использовании словарей в Excel VBA, которые я широко использую в своем коде.У меня есть подпрограмма, в которой я использую словарь для получения наилучших результатов от подпрограммы оптимизации.После этого я обновляю существующую таблицу данных, используя результаты расчетов, где нулевое значение приведет к ошибкам.Эта процедура широко использовалась в прошлом без ошибок.Поэтому я был удивлен, когда начали появляться ошибки.Я отследил ошибку до того, что данные словаря были повреждены вне фактического кода.

Словарь с ошибкой загружается другим словарем, который постоянно ищет обновления и сохраняет только те значения, которые лучше, чемпредыдущие, таким образом, оптимизация.Как только эти значения были получены, словарь (DataItems), который вызывает ошибку, загружает новые значения в таблицу данных переменной за раз.Вот код, который я использовал, чтобы перехватить ошибку:

If KeyCount <> DataItems.Count Then: Stop
NewValue = DataItems(NewData)
If KeyCount <> DataItems.Count Then: Stop

Я записал количество элементов в DataItems перед чтением данных в переменную NewValue.До чтения данных словарь имел счетчик 1, но после считывания данных счетчик становился равным 2. Исходный ключ стал ключом новой записи со значением элемента ноль, а исходный элемент получил новый ключ, которыйПохоже, что это значение в исходных объемных данных, которые сканируются.Похоже, что это происходит почти всегда только с одной записью в словаре DataItems.

Я могу использовать ту же процедуру с другими вызывающими приложениями без каких-либо проблем, поэтому проблема, похоже, связана с вызывающим приложением, которое несмысл, так как используемые словари зародились в подпрограмме, где возникает ошибка.Я пытался устранить потенциальные проблемы с синхронизацией, шагая по коду и другим действиям по отладке, но я остаюсь крайне озадаченным.Это действительно заставляет меня усомниться в потенциальной целостности данных при использовании словарей в Excel для критически важных данных приложения.Любые идеи будут оценены.

1 Ответ

2 голосов
/ 27 мая 2019

Я предполагаю, что вы используете окно Watch и / или панель Immediate во время отладки, и это то, что вызывает проблему (или, по крайней мере, делает ее хуже) ... Если вы добавите определенные выражения, такие как DataItems("keyHere") в список часов, тогда, когда код приостановлен, эти часы фактически добавят этот ключ, если он не существует.

Аналогичным образом, если в режиме паузы вы сделаете что-то вроде ? DataItems("thisKeyDoesNotExist") в окне Immediate, вы не увидите никаких выходных данных, но этот ключ будет автоматически создан.

Для иллюстрации:

Sub DictWatch()

    Dim d As Object, k

    Set d = CreateObject("scripting.dictionary")

    d.Add "one", 1
    Stop 'add a watch on the expression d("one") before proceeding
    d.RemoveAll

    Stop  'enter "? d("test")" in Immediate pane and hit enter before proceeding

    For Each k In d.keys
        Debug.Print k  'output is "one" and "test"
    Next k

End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...