Страницы: 1
RSS
VBA. Добавление (чтение) словарей в коллекцию
 
Добрый день!

У меня в программе по логике создается некоторое количество словарей, которые постепенно добавляются в коллекцию.
Потом мне нужно считать все значения каждого из словаря в коллекции.
Посмотрите плиз мой код, почему ничего не печатается в отладке?
P.S. Пример тестовый, решение нужно не для него, а чтобы понять, можно ли добавлять в коллекцию словари и как потом с ними работать.

В примере я заполняю 3 словаря по 7 значений и каждый словарь добавляю в коллекцию.
Ключи это первая строка, а 3 последующие - значения.
По идее, на экран должно выводится 21 значение каждой строки со 2 по 4
1234567
ЯнварьФевральМартАпрельМайИюньИюль
1999200020012002200320042005
ПонедельникВторникСредаЧетвергПятницаСубботаВоскресенье
Код
Sub Test_collection_of_dic()
    
    Dim Dic7 As Dictionary
    Dim collDic As Collection
    Dim collCount As Integer, dicCount As Integer
    
    Set Dic7 = New Dictionary
    Set collDic = New Collection
    
    For collCount = 2 To 4
        For dicCount = 1 To 7
            Dic7.Add Cells(1, dicCount), Cells(collCount, dicCount)
        Next dicCount
        
        collDic.Add Dic7
        Dic7.RemoveAll
    Next collCount
    
    Dim obDic As Object
    Dim itemCollDic As Variant, itemDicKey As Variant
    For Each itemCollDic In collDic
        For Each itemDicKey In itemCollDic.Keys
            Debug.Print itemCollDic.item(itemDicKey)
        Next
    Next
End Sub
 
Доброе время суток
Цитата
Иван Поно написал:
В примере я заполняю 3 словаря
В примере вы заполняете 3 раза один и тот же словарь и три раза кладёте ссылку на него в коллекцию, затем три раза очищаете тот самый словарь.
 
Т.е. я правильно понимаю, что каждый раз нужно менять имя словаря? Разве в коллекции не может быть 3 одноименных словаря Dic7?
У меня есть код, где в коллекцию добавляется множество  безразмерных массивов massiv() с переопределенными размерами и все работает.
Каждый раз добавляется одноименный массив.
 
Все, я понял.
Словарь это объект и по сути я добавляю в коллекцию не новый словарь, а ссылку на все тот же Dic7.

Спасибо!
 
Не смотрел ваш код, но вот тут вы создаёте 1 словарь
Код
Set Dic7 = New Dictionary

пока не будет ещё 2 таких же строчек с другими названиями словарей у вас 3 словаря не появятся
Изменено: New - 15.03.2021 01:02:24
 
Цитата
New написал:
пока не будет ещё 2 таких же строчек с другими названиями словарей
Коллега - это перебор. И одной переменной достаточно.
Код
Sub Test_collection_of_dic()
     
    Dim Dic7 As Dictionary
    Dim collDic As Collection
    Dim collCount As Integer, dicCount As Integer
     
    
    Set collDic = New Collection
     
    For collCount = 2 To 4
        Set Dic7 = New Dictionary
        For dicCount = 1 To 7
            Dic7.Add Cells(1, dicCount), Cells(collCount, dicCount)
        Next dicCount
         
        collDic.Add Dic7
        'Dic7.RemoveAll
    Next collCount
     
    Dim obDic As Object
    Dim itemCollDic As Variant, itemDicKey As Variant
    For Each itemCollDic In collDic
        For Each itemDicKey In itemCollDic.Keys
            Debug.Print itemCollDic.Item(itemDicKey)
        Next
    Next
End Sub
 
Цитата
Андрей VG написал:
И одной переменной достаточно
да, главное - инициировать в нужном месте кода
и я обычно собираю не коллекцию, а словарь словарей
Изменено: Ігор Гончаренко - 15.03.2021 08:46:27
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Цитата
Ігор Гончаренко написал:
и я обычно собираю не коллекцию, а словарь словарей
++++
"Все гениальное просто, а все простое гениально!!!"
 
Цитата
Ігор Гончаренко написал:
я обычно собираю не коллекцию, а словарь словарей
Поддерживаю такое решение.
Причём на некоторых данных это решение работает быстрее.
Например, сравнивал быстродействие словаря с 1 000 000 ключей и словаря словарей с 1 000 ключей.
Словарь словарей работает быстрее.
 
Цитата
МатросНаЗебре: сравнивал быстродействие словаря с 1 000 000 ключей и словаря словарей с 1 000 ключей
тесты показывают, что после 100 тыс ключей словарь начинает сильно тупить
Я заменял на бинарный поиск по отсортированному массиву, но ваш вариант выглядит интереснее  :)

По задаче: на ошибку уже указали, а по способу скажу, что я, например, часто использую словарь только как хранилище указателей на массив (ключ-строка массива)
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Всем спасибо, что так быстро и активно откликнулись, указали на ошибку и еще предложили иные варианты!
Страницы: 1
Наверх