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

Я использую объект словаря из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, даже на первой итерации.

 Tim Williams09 июл. 2012 г., 21:36
ПытатьсяIf Not dTotals.Exists(cell.Value) Then
 Brad09 июл. 2012 г., 21:04
Что происходит вFind_Range функционировать? ЯвляетсяdTotals частная переменная в вашем реальном коде, или она общедоступна?
 riddley_w09 июл. 2012 г., 22:29
Исправлена исходная проблема, исправляя команду set в:Dim dTotals As Object Set dTotals = CreateObject("scripting.Dictionary"), Так что эта проблема решена, к следующему. Спасибо.
 Malachi19 сент. 2012 г., 22:20
пожалуйста, опубликуйте свой ответ и отметьте его как ответ, чтобы другие, кто смотрят, увидели, что вы нашли решение.
 Siddharth Rout09 июл. 2012 г., 20:39
хммм, проверено, но не в состоянии повторить. Можете ли вы показать полный код?

Ответы на вопрос(2)

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

 01 мая 2015 г., 14:46
Подтверждено. Я только что проверил это, и часы для mydictionary.item (ключ) действительно добавляют элемент в словарь. Довольно расстраивает, но приятно знать.
Решение Вопроса

официальная документация & # 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. Вы также можете заметить последстия этого, если у ас утечка памяти, ызанная добалением ноых ключей, которые ы не собираетесь хранить.

 29 июл. 2016 г., 00:07
Снова открыта!

Ваш ответ на вопрос