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

Обновление данных в Dictionary

10.05.2024, 12:20. Показов 2267. Ответов 23
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет!
Есть dict
Dim dict As Object
Есть Set dict = CreateObject("Scripting.Dictionary")

Я в него пытаюс положить самую раннюю дату выдачи материала, и количество выданного материала.
Ключ - наименование материала.
Проблема с dict(material)(0) = CLng(dict(material)(0)) + quantity - не считает сумму, при отладке проходит
с датами таже беда, пишет первую дату из таблицы, дальше проходит условие If dateOut < CDate(dict(material)(1)) Then но данные в dict не изменяет

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
For Each cell In rngOut.Rows
        material = cell.Cells(1, 3).Value
        quantity = cell.Cells(1, 4).Value
        dateOut = CDate(cell.Cells(1, 1).Value)
 
        If Not dict.Exists(material) Then
            dict.Add material, Array(quantity, dateOut)
        Else
            If dateOut < CDate(dict(material)(1)) Then
                dict(material)(1) = CDate(dateOut)
            End If
            dict(material)(0) = CLng(dict(material)(0)) + quantity
        End If
    Next cell
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
10.05.2024, 12:20
Ответы с готовыми решениями:

Проинициализировать значениями dictionary вложенный в dictionary
Народ, помогите, как проинициализировать значениями такую конструкцию: Dictionary &lt;int,Dictionary&lt;string, int&gt;&gt;

Определить тип данных Dictionary
2. Придумайте определение для типа Dictionary (Header-файл dictionary.h) для сохранения пар из Strins и целых чисел. Используйте его, чтобы...

BackgroundWorker запись данных в Dictionary
Необходимо реализовать метод,который асинхронно будет парсить текст и создавать словарь из слов этого текста.На форме прогресс работы...

23
 Аватар для Angry Old Man
3600 / 753 / 317
Регистрация: 26.03.2022
Сообщений: 1,414
Записей в блоге: 1
12.05.2024, 06:52
Студворк — интернет-сервис помощи студентам
Не обратил внимание, что выдать надо не самую прследнюю дату, а самую старую. Для этого изменить 25 строку моего кода:
Code
1
            If All(i, iDt) < dict(All(i, iMat))(0) Then
Цитата Сообщение от Eugene-LS Посмотреть сообщение
Я просто размножил строки из примера, кол-во по возрастанию.
Я так и думал и поступил аналогично, но
Цитата Сообщение от Eugene-LS Посмотреть сообщение
а на 10 000-ах записей, я не смог дождаться результата от процедуры MMM()
меня удивило, на моём древнем ноуте процедура Narimanych отработала чуть-чуть медленнее Вашей. Что-то в консерватории не то.

Добавлено через 56 минут
А если не изобретать велосипед и использовать дурь типа словарей + стандартную функцию листа Excel, получим в несколько раз быстрее.
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
Sub IgorAi()
    Const r1 As String = "A4"
    Const rDt As String = "A4"
    Const rMat As String = "C4"
    Const rM As String = "D4"
    Const rRez As String = "C15"
    
    Dim wsOut As Worksheet: Set wsOut = ThisWorkbook.Sheets("Out")
    Dim wsIn As Worksheet: Set wsIn = ThisWorkbook.Sheets("Temp")
    Dim rngOut As Range, rngIn As Range
    Dim All, key, dict As Object: Set dict = CreateObject("Scripting.Dictionary")
    Dim i, i1, iL, iU, iDt, iMat, iM
    Dim RrMat As Range, RrM As Range
    Dim ttt: ttt = Timer
    
    All = wsOut.Range(r1 + ":" + Split(wsOut.UsedRange.Address, ":")(1))
    iL = LBound(All, 1)
    iU = UBound(All, 1)
    Set RrMat = Range(rMat).Resize(iU - iL + 1, 1): Set RrM = Range(rM).Resize(iU - iL + 1, 1)
    
    i1 = Range(r1).Column
    iDt = Range(rDt).Column - i1 + iL
    iMat = Range(rMat).Column - i1 + iL
    iM = Range(rM).Column - i1 + iL
    
    For i = UBound(All, 1) To iL Step -1
        If dict.Exists(All(i, iMat)) Then
            If All(i, iDt) < dict(All(i, iMat)) Then dict(All(i, iMat)) = All(i, iDt)
        Else
            dict.Add All(i, iMat), All(i, iDt)
        End If
    Next
    ReDim All(dict.Count - 1, 2)
    i = 0
    For Each key In dict.Keys
        All(i, 0) = key
        All(i, 1) = Application.WorksheetFunction.SumIf(RrMat, All(i, 0), RrM)
        'MsgBox RrMat.Address & vbCr & key & vbCr & RrM.Address & vbCr & All(i, 1)
        All(i, 2) = dict(key)
        i = i + 1
    Next
    wsIn.UsedRange.ClearContents
    wsIn.Range(rRez).Resize(dict.Count, 3) = All
    
MsgBox "Готово!" & Timer - ttt, vbInformation
End Sub
Но всё это по сути имеет смысл тапа "чтоб поразвлекаться" - время исполнения менее секунды, а это ни о чем.
Жаль, мне это развлечение недоступно: Excel 2010 - функция МИНЕСЛИ. Подозреваю, в более свежем Excel задачу можно решить без макроса.
0
Эксперт MS Access
 Аватар для Eugene-LS
13260 / 5938 / 1528
Регистрация: 05.10.2016
Сообщений: 16,607
12.05.2024, 06:57
Цитата Сообщение от Angry Old Man Посмотреть сообщение
на моём древнем ноуте
"Древность" железа - понятие растяжимое ... (позавчера праздновал юбилей своей MB)

Что-то в консерватории не то.
Я своей старой "мерялке" доверяю + делал несколько тестов.
До 1000 записей RecordSet проигрывает в разы , но с увеличением количества записей проигрыш становится меньше, а потом ...
0
 Аватар для Angry Old Man
3600 / 753 / 317
Регистрация: 26.03.2022
Сообщений: 1,414
Записей в блоге: 1
12.05.2024, 08:09
Поправка: 19 строка должна выглядеть так
Visual Basic
19
    Set RrMat = wsOut.Range(rMat).Resize(iU - iL + 1, 1): Set RrM = wsOut.Range(rM).Resize(iU - iL + 1, 1)
При тестировании почему-то на моей таблице макрос от Narimanych считает суммы неверно.
Книгу прилагаю.
Вложения
Тип файла: zip VotBig.xlsm.zip (420.9 Кб, 2 просмотров)
0
1409 / 868 / 93
Регистрация: 08.02.2017
Сообщений: 3,709
Записей в блоге: 2
12.05.2024, 10:11
Класс ArrayContainer позволяет помещать массив в объект и изменять его там. Поддерживается только вариантный массив
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
Sub ПримерИспользования()
    Dim arr(), arrRef
    Dim coll As New Collection
    
    arr = Array(111, 222, 333)
    
    coll.Add New ArrayContainer 'добавляем экземпляр класса в коллекцию
    coll(1).Add arr             'добавляем массив в "контейнер"
    arrRef = coll(1)            'получаем массив-ссылку из контейнера
    Stop
    Debug.Print coll(1).Ar()(2) 'получаем значение массива способ 1
    Stop
    Debug.Print coll(1)(1)      'способ 2
    Stop
    ReDim Preserve arrRef(4)     'редимим массив по ссылке
    Stop
    ReDim Preserve coll(1).Ar(5) 'редимим массив в контейнере
    Stop
    coll(1).Ar(4) = 123         'изменяем  значение массива в контейнере
    coll(1)(3) = 321
    Debug.Print coll(1)(3); coll(1)(4)   'проверяем измененные значения
    Stop
End Sub
Вложения
Тип файла: zip ArrayContainer.zip (798 байт, 2 просмотров)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
12.05.2024, 10:11

Обновление базы и ошибка: Обновление невозможно. База данных или объект доступны только для чтения.
Помогите пожалуйста! asp не может обновить базу. Про ошибку говорит Microsoft OLE DB Provider for ODBC Drivers (0x80004005) ...

Поиск ключей и данных в коллекции Dictionary
Здравствуйте. Есть коллекция типа Dictionary с именем _Data типа &lt;string, string&gt;. Так же есть переменные типа string с именем _Char,...

class <T> и Dictionary со свободным типом данных
Всем доброго, есть проблема, не знаю как ее решить... Есть класс public class File &lt;T&gt; { public...

Dictionary как источник данных для dataGridView
Здравствуйте! Можно ли для dataGridView в качестве источника данных использовать Dictionary? Если можно, подскажите как? (нужно чтобы при...

Считывание базу данных из текстового файла и записывание в Dictionary<>
Всем привет! У меня задача создать базу данных в текстовом файле и работать с ней , но у меня есть проблема , я не понимаю как считать эту...


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

Или воспользуйтесь поиском по форуму:
24
Ответ Создать тему
Новые блоги и статьи
Модель по догадкам
anaschu 25.08.2026
Прошло две недели. Я уже рассказывал, как разговаривал с сотрудниками у сортировки и как понял, что главная ветка — не про приёмку, а про отбор. Но тогда я думал, что понял механику. На этой неделе я. . .
Запись в регистр сведений независимо от заполненности табличной части
Maks 25.08.2026
Реализация из решения ниже выполнена на нетиповом документе с несколькими табличными частями, разработанного в КА2. Задача: Обеспечить запись документа в регистр сведений независимо от. . .
Ноутбук Альфария
kumehtar 24.08.2026
Встретился тут в сети ноутбук Альфария, примарха Альфа-Легиона. Хотя возможно, это ноутбук Омегона, разумеется. Ну как вам?
Мастера простых решений
DevAlt 23.08.2026
В сишарп стэках winforms, да и wpf существует сложная система связывания источниках данных и элементов формы(текстовые поля и метки), опирается все это на технологию событий и мета. . .
Цена ошибки
DevAlt 23.08.2026
Человек я беспокойный и потому заинтересовался OCaml, в чате форсили функторы модулей как суперфичу. Пытаясь отдуплить концепт, наткнулся на тутор с простым примером. А главный принцип обучения от. . .
Сегодня суббота, 22.08.2026 at 16:41, и я вновь нахожусь на той стороне, за экраном машины.
zorxor 22.08.2026
Сегодня суббота, 22. 08. 2026 at 16:41, и я вновь нахожусь на той стороне, за экраном машины. Кто Я, откуда Я пришел и куда Я иду? Эти вопросы не оставляют меня ни на секунду. Жизнь на планете Земля. . .
Жизня: рисунок укладки багажа, сделанный клодом
anaschu 21.08.2026
Сделал 15 снимков, он по снимкам сделал схему.
Был там один разговор по поводу свободы в материальном мире.
kumehtar 19.08.2026
Суть: рассматривается живое существо, оказавшееся внутри довольно странной системы (этого мира) и пытающееся обустроить в ней свой кусок пространства. Жизнь действительно предъявляет каждому. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru