VB Clear Scripting.Dictionary объект - PullRequest
5 голосов
/ 23 марта 2012

Я пишу макрос Excel , и у меня возникают проблемы с очисткой 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 будет равен test и будет равняться количеству добавленных объектов.

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

Ответы [ 2 ]

7 голосов
/ 23 марта 2012

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

        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, а test равен 1.

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

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

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

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

        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

Надеюсь, что поможет ...

5 голосов
/ 23 марта 2012

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

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

EDIT

Для Сиддхарта: Протестировано с Excel 2003 и 2010.

Создать новую книгу.
Откройте VBA IDE.
Введите это в модуле Sheet1:

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. До сих пор вы могли подумать, что часы создали запись, что странно, потому что вы не ожидаете, что часы будут иметь побочные эффекты.

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

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

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