2012-03-23 3 views
5

Я пишу Excel макрос, и у меня возникают проблемы очистки объекта Scripting.Dictionary:VB Очистить Scripting.Dictionary объект

Dim test As Integer 
test = CompListDict.Count 
CompListDict.RemoveAll 
Set CompListDict = Nothing 
Set CompListDict = CreateObject("Scripting.Dictionary") 
Dim test1 As Integer 
test1 = CompListDict.Count 

Перед тем, как сделать это, я добавить элементы в в словаре, а затем я попытаюсь очистить его, но test1 будет равно тесту и равным nr объектов, которые я добавил.

Что я делаю неправильно? Спасибо!

ответ

6

Если я запускаю следующий макрос на моей рабочей станции, она работает:

 Set compListDict = CreateObject("Scripting.Dictionary") 

     compListDict.Add 1, "Test" 

     Dim test As Integer 
     test = compListDict.Count 
     compListDict.RemoveAll 

     Set compListDict = Nothing 
     Set compListDict = CreateObject("Scripting.Dictionary") 

     Dim test1 As Integer 
     test1 = compListDict.Count 

После его выполнения, test1 равен 0, и тест равен 1.

Убедитесь, что Option Explicit включен, и что у вас нет опечаток в именах переменных.

Кроме того, убедитесь, что у вас нет оператора «Включение ошибки после завершения», так как он скроет ошибки в вашем коде. Попробуйте поставить «On Error Goto 0» перед фрагментом кода, чтобы Excel отображал любое сообщение об ошибке.

Поскольку вы устанавливаете значение переменной Nothing и назначаете ему новый объект dictionnary, должно быть невозможно, чтобы он сохранял ранее сохраненные значения.

Я также попытался запустить следующий код, и это также дает те же результаты:

 Set compListDict = CreateObject("Scripting.Dictionary") 

     compListDict.Add 1, "Test" 

     Dim test As Integer 
     test = compListDict.Count 
     compListDict.RemoveAll 

     Dim test1 As Integer 
     test1 = compListDict.Count 

Надежда, что помогает ...

3

Ваш код выглядит нормально, хотя на 2 линии, где вы установили свой Dict ни к чему, а воссоздать не нужно.

Не уверен, что это связано, но в некоторых версиях VBA IDE есть ошибка: если вы добавили часы на dict(aKeyThatDoesNotExist), это может привести к тому, что ключ tgat будет добавлен в dict и не будет съемным. единственное решение, которое я знаю: перезапустите Excel, чтобы очистить память.

EDIT

Для Сиддхарта: Испытано с Excel 2003 & 2010.

Создать новую книгу.
Открыть VBA IDE.
Тип этого в модуле Лист1:

Option Explicit 

Sub test() 

    Dim d As Variant 
    Set d = CreateObject("Scripting.Dictionary") 

    d.Add "a", "a" 
    Debug.Print d.Count 

    'Add watch here on d and d("b") 

    Debug.Print d.Count 

End Sub 

Выполнить его в пошаговом режиме и, когда на комментировал линии, добавить часы на d и d("b"). Второй Debug.Print напечатает 2. До сих пор вы могли подумать, что часы создали запись, которая является странной, потому что вы не ожидаете, что часы будут иметь побочные эффекты.

Запустите макрос снова: сначалаDebug.Print напечатает 2, и вы заметите, что словарь уже имеет клавишу «b».

Фактически, в отличие от того, что я сказал выше, удаление часов на d("b") и повторное использование макроса корректно вернет словарь.

+0

Хммм это интересно. Можете ли вы воспроизвести его или это случайная вещь? –

+0

@SiddharthRout Смотрите мое редактирование. – assylias

+0

Спасибо, заглянем в него сегодня :) И если я смогу воспроизвести его, тогда я напишу эту ошибку с MS сегодня :) –

Смежные вопросы