Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.73/75: Рейтинг темы: голосов - 75, средняя оценка - 4.73
6 / 6 / 0
Регистрация: 02.06.2014
Сообщений: 65

словарь словарей

30.03.2017, 00:58. Показов 15602. Ответов 30
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте.
Я долго время пытался создать словарь словарей, перечитал различные методы предложенные тут на форуме, поэкспериментировал, но увы ни чего не получилось.
Если коротко, в фале есть 4 стр, мне нужно сделать поиск в 3 стр(кроме 1), найти соответствие номера заявки к лаб номеру(ищу заявку прибавляю к ней 1 столбеец) и с мг/дм.
должно получиться как-то так
{ключ-лаб номер;итем-[ключ-элемент(название стр);итем-с,мг/дм3)]}
прошу вашей помощи с кодом словарей, что-то я совсем запутался как их формировать
P.S. с vba только знакомлюсь и пользуюсь модулем 2, который имеется в книге
Вложения
Тип файла: xls resul.xls (92.0 Кб, 32 просмотров)
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
30.03.2017, 00:58
Ответы с готовыми решениями:

Словарь словарей плюс Коллекция массивов
Здрасьте! Что-то я или запутался совсем, или лечить пора. Создал Dict (ключи - значения ячейки текущего ряда r столбца 11)....

Словарь словарей или что-то подобное
Здраствуйте. Может кто направит мою бедную голову на правильный путь. Есть, например, словарь1 (mDict1), в котором .Item принимает...

Не получается вложить словарь в словарь
Друзья, доброго времени суток! Не могу понять, почему у меня не получается вложить словарь в словарь. Set Header =...

30
 Аватар для Alex77755
11523 / 3810 / 683
Регистрация: 13.02.2009
Сообщений: 11,229
30.03.2017, 02:15
Лучший ответ Сообщение было отмечено kronos_o_0 как решение

Решение

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
  Dim a(), i&, Dic As Object, Dic2 As Object, t$, x&, y&
    a = [a1:k20].Value
    Set Dic = CreateObject("Scripting.Dictionary"): Dic.CompareMode = 1
 
    For i = 1 To UBound(a)
        t = a(i, 11)
        If Not Dic.exists(t) Then 'если ещё нет ключа
 
            Set Dic2 = CreateObject("Scripting.Dictionary"): Dic2.CompareMode = 1 'создаём субсловарь
            Dic2.Add a(i, 8), New Collection 'с ключём и № строки
            Dic2.Item(a(i, 8)).Add i: Dic.Add t, Dic2
 
        Else 'если ключ есть
            Set Dic2 = Dic.Item(t) 'извлекаем субсловарь
            
            If Not Dic2.exists(a(i, 8)) Then 'если в субсловаре нет субключа
                Dic2.Add a(i, 8), New Collection 'добавляем субключ с коллекцией
            End If
            Dic2.Item(a(i, 8)).Add i 'добавляем № строки
            
            Set Dic.Item(t) = Dic2 'заносим субсловарь
        End If
    Next
Добавлено через 58 секунд
но можно и короче

Добавлено через 1 минуту
Как-то так
Visual Basic
1
2
3
4
5
6
7
        If Not oUL_Dp.exists(t) Then 'если ещё нет ключа
            Set DP = CreateObject("Scripting.Dictionary"): DP.CompareMode = 1 'создаём субсловарь
            DP(domd) = r
            Set oUL_Dp(t) = DP
        Else 'если ключ есть
            oUL_Dp(t)(domd) = r
        End If
1
6997 / 2895 / 555
Регистрация: 19.10.2012
Сообщений: 8,803
30.03.2017, 08:43
Лучший ответ Сообщение было отмечено kronos_o_0 как решение

Решение

Я так делал в другой задаче:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
Sub PereborFailov2() ' словарь в словаре
    Dim a, i&, t$, Dic As Object, Dic2 As Object
    Dim el, col
    
    a = Range("C3", Cells(Rows.Count, "A").End(xlUp)).Value
    Set Dic = CreateObject("Scripting.Dictionary")
    With Dic
        .CompareMode = 1
        For i = 1 To UBound(a)
            t = a(i, 1)
            If Not .exists(t) Then .Add t, CreateObject("Scripting.Dictionary")
            .Item(t).Item(a(i, 2) & "|" & a(i, 3) & "|" & i) = 0&
            
        Next
    End With
    
    For Each el In Dic.keys
        Debug.Print "Открываем файл " & el
        Set Dic2 = Dic.Item(el)
        For Each col In Dic2.keys
            Debug.Print "Ищем данные " & col '& "|" & Dic2.Item(col)
        Next
        Debug.Print "Закрываем файл " & el
    Next
 
End Sub
1
6 / 6 / 0
Регистрация: 02.06.2014
Сообщений: 65
30.03.2017, 09:32  [ТС]
Alex77755, я пытался сделать на подобие первого, но не совсем понял, там второй словарь вкладывают в коллекцию?
Hugo121, и это тоже пробовал он у меня всегда ругается на .item не понимаю в чем дело. Можете объяснить эти строчки?
Цитата Сообщение от Hugo121 Посмотреть сообщение
.Item(t).Item(a(i, 2) & "|" & a(i, 3) & "|" & i) = 0&
вот что у меня получилось, но я не могу обратится к Dic через .item
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
For c = 1 To lcp
     If InStr(1, .Cells(c, r), ndz, vbTextCompare) > 0 Then
         With shi
         ky = .Cells(c, 2).Value
         it = .Cells(c, 6).Value
         End With
          t = nsh
          If Not Dic.exists(t) Then
          Set Dic2 = CreateObject("Scripting.Dictionary"): Dic2.CompareMode = 1
          Dic2(ky) = it
          Set Dic(t) = Dic2
          Else
          Dic(t)(ky) = it
          End If                                        
     End If
Next c
0
6997 / 2895 / 555
Регистрация: 19.10.2012
Сообщений: 8,803
30.03.2017, 09:46
У меня на итем не ругается, да и у Вас скорее всего ругается на выход за пределы массива.
В той строке в словарь словаря по ключу t добавляется ключ a(i, 2) & "|" & a(i, 3) & "|" & i
0
6 / 6 / 0
Регистрация: 02.06.2014
Сообщений: 65
30.03.2017, 09:50  [ТС]
Цитата Сообщение от Hugo121 Посмотреть сообщение
Visual Basic
1
2
3
4
5
6
7
8
For Each el In Dic.keys
* * * * Debug.Print "Открываем файл " & el
* * * * Set Dic2 = Dic.Item(el)
* * * * For Each col In Dic2.keys
* * * * * * Debug.Print "Ищем данные " & col '& "|" & Dic2.Item(col)
 * * * *Next
* * * * Debug.Print "Закрываем файл " & el
* * Next
вставил эту часть, показало что словарь заполнен ключ[ключ, но итем второго словаря пуст]
т.е. как просто 1 словарь, как проверить заполненность словаря-словарей
0
6997 / 2895 / 555
Регистрация: 19.10.2012
Сообщений: 8,803
30.03.2017, 10:00
Цитата Сообщение от kronos_o_0 Посмотреть сообщение
как проверить заполненность словаря-словарей
тут что пишет?
Цитата Сообщение от kronos_o_0 Посмотреть сообщение
Debug.Print "Ищем данные " & col
0
6 / 6 / 0
Регистрация: 02.06.2014
Сообщений: 65
30.03.2017, 10:07  [ТС]
Цитата Сообщение от Hugo121 Посмотреть сообщение
тут что пишет?
Открываем файл литий
Ищем данные 1
Ищем данные 2
Ищем данные 8
Закрываем файл литий
Открываем файл аммоний
Ищем данные 2
Ищем данные 1
Ищем данные 6
Закрываем файл аммоний
Открываем файл калий
Ищем данные 3
Ищем данные 2
Ищем данные 1
Закрываем файл калий
Закрываем файл калий
0
6997 / 2895 / 555
Регистрация: 19.10.2012
Сообщений: 8,803
30.03.2017, 10:13
Ну так вот же - у лития в словаре 1, 2 и 8, у аммония 2, 1, 6 и т.д.
А все эти литии/аммонии в первичном словаре.

Добавлено через 2 минуты
Можно на паузе посмотреть заполнение словарей в окнах Locals или Watches (в последнем можно посмотреть не только ключи, но и итемы).
0
6 / 6 / 0
Регистрация: 02.06.2014
Сообщений: 65
30.03.2017, 10:13  [ТС]
Цитата Сообщение от Hugo121 Посмотреть сообщение
Ну так вот же - у лития в словаре 1, 2 и 8, у аммония 2, 1, 6 и т.д.
да тут все правильно, но нет значений у 1,2,8 и т.д., у них должны быть еще
получается литий[1-знач,2-знач,8-знач]
второй словарь не формируется, должно быть же три значения
элемент-лаб№-значение
аа, это я туплю, он же показывает только ключи
0
6997 / 2895 / 555
Регистрация: 19.10.2012
Сообщений: 8,803
30.03.2017, 10:27
Да, в той реализации у всех внутренних значение 0, но можно изменить как угодно, а вывести можно если убрать апостроф в строке
Visual Basic
1
Debug.Print "Ищем данные " & col '& "|" & Dic2.Item(col)
0
6 / 6 / 0
Регистрация: 02.06.2014
Сообщений: 65
30.03.2017, 10:35  [ТС]
Hugo121, Спасибо большое, действительно все работало
а можете тогда подсказать, как мне теперь обращаться к итемам? что бы записывать их в ячейки
или это по тому же принципу, как пишется в дебаг?
0
6997 / 2895 / 555
Регистрация: 19.10.2012
Сообщений: 8,803
30.03.2017, 10:51
Да, по тому же принципу можно, только выводите в ячейки.
Этот код у меня был как черновик рабочего макроса по перебору файлов, оставил как наработку для таких похожих задач.
0
6 / 6 / 0
Регистрация: 02.06.2014
Сообщений: 65
30.03.2017, 11:04  [ТС]
Hugo121, а можете сказать, я видел на одном сайте они выгружают словарь вот таким способом
Cells(1, 1).Resize(, .Count) = .Keys
Cells(2, 1).Resize(, .Count) = .Items
почему он не работает для данной ситуации?
0
6997 / 2895 / 555
Регистрация: 19.10.2012
Сообщений: 8,803
30.03.2017, 11:10
Так и тут можно так выгружать внутренние словари (для внешнего итемы - это не значения, а объекты, поэтому так не пойдёт).
Но мелкомягкие не гарантируют соответствия по позициям выгружаемых пар, поэтому я так уже давно не делаю. А Вы как хотите
0
6 / 6 / 0
Регистрация: 02.06.2014
Сообщений: 65
30.03.2017, 11:16  [ТС]
Hugo121, все большое спасибо
теперь надо сделать сортировку, надеюсь пойдет быстрее)
0
6997 / 2895 / 555
Регистрация: 19.10.2012
Сообщений: 8,803
30.03.2017, 11:32
Можно выгрузить ключи в массив, его процедурой отсортировать (есть уже готовые разные), затем перебором этого массива извлекать итемы и всё писать на лист, или куда угодно.
0
6 / 6 / 0
Регистрация: 02.06.2014
Сообщений: 65
30.03.2017, 11:44  [ТС]
Hugo121, а сортировать сам словарь это сложнее?
просто я думал он быстрее работает, чем массив, из-за этого делал словарь словарей, наверно тогда стоило сразу сделать массив
0
6997 / 2895 / 555
Регистрация: 19.10.2012
Сообщений: 8,803
30.03.2017, 11:55
Словарь несортируется, там нельзя поменять позицию элементу. Да и как выше я уже говорил - эта позиция не гарантируется.

Добавлено через 6 минут
Представьте словарь как мешок с коробочками - как его сортировать? А вот найти там красную коробку с ништяками - можно.
0
6 / 6 / 0
Регистрация: 02.06.2014
Сообщений: 65
30.03.2017, 12:50  [ТС]
Hugo121, т.е. порядка в словаре нет? я думал они стоят в порядке их добавления
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
30.03.2017, 12:50
Помогаю со студенческими работами здесь

Сравнение словарей?
Здравствуйте! Я, офисная крыса, обрабатывающая большие объемы информации, на старости лет разленилась и увлеклась автоматизацией этого...

Сортировка словаря словарей
Здравствуйте! У меня в который раз одни и те ж грабли. Есть данные: ст.А ст.B ст.С Климент Тест #...

Получить количество словарей (коллекций)
Всех, кто празднует по старому календарю, с Рождеством! Если у меня в проекте будет использован не один, а несколько словарей (~...

Словарь
Здравствуйте! Помогите пожалуйста..нужно создать словарь на vba.. программа должна работать, как обычные словари только содержать слова,...

Из Массива в Словарь
Приветствую всех! Ни как не могу передать значения из массива в Словарь: Public Function Get_Value_From_Close_Book2() Dim...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Как использовать Bluetooth-модуль HC-05 с Arduino
Wired 08.07.2025
Bluetooth - это технология, созданная чтобы заменить кабельные соединения. Обычно ее используют для связи небольших устройств: мобильных телефонов, ноутбуков, наушников и т. д. Работает она на частоте. . .
Руководство по структурам данных Python
AI_Generated 08.07.2025
Я отчетливо помню свои первые серьезные проекты на Python - я писал код, он работал, заказчики были относительно довольны. Но однажды мой наставник, взглянув на мою реализацию поиска по огромному. . .
Тестирование энергоэффективности и скорости вычислений видеокарт в BOINC проектах
Programma_Boinc 08.07.2025
Тестирование энергоэффективности и скорости вычислений видеокарт в BOINC проектах Опубликовано: 07. 07. 2025 Рубрика: Uncategorized Автор: AlexA Статья размещается на сайте с разрешения. . .
Раскрываем внутренние механики Android с помощью контекста и манифеста
mobDevWorks 07.07.2025
Каждый Android-разработчик сталкивается с Context и манифестом буквально в первый день работы. Но много ли мы задумываемся о том, что скрывается за этими обыденными элементами? Я, честно говоря,. . .
API на базе FastAPI с Python за пару минут
AI_Generated 07.07.2025
FastAPI - это относительно молодой фреймворк для создания веб-API, который за короткое время заработал бешеную популярность в Python-сообществе. И не зря. Я помню, как впервые запустил приложение на. . .
Основы WebGL. Раскрашивание вершин с помощью VBO
8Observer8 05.07.2025
На русском https:/ / vkvideo. ru/ video-231374465_456239020 На английском https:/ / www. youtube. com/ watch?v=oskqtCrWns0 Исходники примера:
Мониторинг микросервисов с OpenTelemetry в Kubernetes
Mr. Docker 04.07.2025
Проблема наблюдаемости (observability) в Kubernetes - это не просто вопрос сбора логов или метрик. Это целый комплекс вызовов, которые возникают из-за самой природы контейнеризации и оркестрации. К. . .
Проблемы с Kotlin и Wasm при создании игры
GameUnited 03.07.2025
В современном мире разработки игр выбор технологии - это зачастую балансирование между удобством разработки, переносимостью и производительностью. Когда я решил создать свою первую веб-игру, мой. . .
Создаем микросервисы с Go и Kubernetes
golander 02.07.2025
Когда я только начинал с микросервисами, все спорили о том, какой язык юзать. Сейчас Go (или Golang) фактически захватил эту нишу. И вот почему этот язык настолько заходит для этих задач: . . .
C++23, квантовые вычисления и взаимодействие с Q#
bytestream 02.07.2025
Я всегда с некоторым скептицизмом относился к громким заявлениям о революциях в IT, но квантовые вычисления - это тот случай, когда революция действительно происходит прямо у нас на глазах. Последние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru