Вопрос по dictionary, scripting, vba, excel-vba, excel – Объект словаря, добавляющий элементы перед вызовом .add ()

4

Я использую объект словаря изMS Scripting Runtime library хранить серию массивов и при необходимости выполнять операции над ячейками массива. Для создания всех этих записей есть цикл for. Моя проблема в том, что при использовании.exists собственность, она возвращаетсяTrue еще до того, как предмет был добавлен.

Более тесная отладка указывает, что ключ добавляется в словарь в начале цикла for, хотя нет.add Команда используется и не будет использоваться до конца цикла.

Я пробовал несколько разных конфигураций, но вот простой пример, который терпит неудачу:

Dim dTotals As Dictionary
Set dTotals = New Dictionary

dTotals.CompareMode = BinaryCompare

For Each cell In rAppID
    If Not dTotals.Exists(cell) Then
    Set rAppIDCells = Find_Range(cell, rAppID)
    Set rAppIDValues = rAppIDCells.Offset(0, 6)
    dAppIDTotal = WorksheetFunction.Sum(rAppIDValues)
    dTotals.Add Key:=cell.Value, Item:=dAppIDTotal
    End If
Next cell

Где каждая ячейка содержит строку / уникальный идентификатор. В операторе If код возвращает false, даже на первой итерации.

хммм, проверено, но не в состоянии повторить. Можете ли вы показать полный код? Siddharth Rout
ПытатьсяIf Not dTotals.Exists(cell.Value) Then Tim Williams
Исправлена исходная проблема, исправляя команду set в:Dim dTotals As Object Set dTotals = CreateObject("scripting.Dictionary"), Так что эта проблема решена, к следующему. Спасибо. riddley_w
Что происходит вFind_Range функционировать? ЯвляетсяdTotals частная переменная в вашем реальном коде, или она общедоступна? Brad
пожалуйста, опубликуйте свой ответ и отметьте его как ответ, чтобы другие, кто смотрят, увидели, что вы нашли решение. Malachi

Ваш Ответ

2   ответа
4

официальная документация & # x200C;& # X200B; для среды ыполнения сценарие он гоорит: «Если ключ не найден при попытке ернуть сущестующий элемент, создается ноый ключ, а соотетстующий ему элемент остается пустым».

... и да, когда ы ыполняете отладку цикле, она пояляется прямо из неба до того, как ".exists" функция даже назыается. Все хорошо...

Вместо того, чтобы пытаться добаить элемент, который только что был добален, как :

dTotals.Add Key:=cell.Value, Item:=dAppIDTotal

... просто устаноите пустой объект ашем ключе на ноый:

dTotals(cell.Value) = dAppIDTotal

Таким образом, аш блок кода станоится:

If Not dTotals.Exists(cell) Then
    Set rAppIDCells = Find_Range(cell, rAppID)
    Set rAppIDValues = rAppIDCells.Offset(0, 6)
    dAppIDTotal = WorksheetFunction.Sum(rAppIDValues)
    dTotals(cell.Value) = dAppIDTotal
End If

Вуаля. Я склонен заноо открыать эту «функцию» на каждый пересмотр VBA. Вы также можете заметить последстия этого, если у ас утечка памяти, ызанная добалением ноых ключей, которые ы не собираетесь хранить.

Снова открыта!
2

когда у меня были часы, которые пытались вернуть «отсутствующие» сообщения. ключевой элемент. На самом деле, дальнейшая расстроенная отладка имела ту же проблему, когда я буквально наблюдал за [scriptingdictonaryObject] .exists () condtional); Я полагаю, что «отсутствует» ключ добавлен из-за часов. Когда я снял часы и вместо этого создал временную рабочую таблицу для копирования массива во время работы, ненужные ключи больше не добавлялись.

Подтверждено. Я только что проверил это, и часы для mydictionary.item (ключ) действительно добавляют элемент в словарь. Довольно расстраивает, но приятно знать.

Похожие вопросы