Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.03.2013, 10:33   #11
DiemonStar
Старожил
 
Регистрация: 08.02.2012
Сообщений: 2,173
По умолчанию

Цитата:
можно еще со сводной попробовать
Вариант со сводной не катит - там учитываются повторы одного и того же счета.

Вот так можно с суммированием:

Код:
Sub Cnt()
Dim a(), i&
a = [A2].CurrentRegion.Value

Set Dates = CreateObject("scripting.dictionary")
Set Sums = CreateObject("scripting.dictionary")

With CreateObject("scripting.dictionary")
    For i = 2 To UBound(a)
      If Not .Exists(a(i, 1) & "|" & a(i, 2)) Then
        .Item(a(i, 1) & "|" & a(i, 2)) = 1
        Dates.Item(a(i, 2)) = Dates.Item(a(i, 2)) + 1
      Else
        .Item(a(i, 1) & "|" & a(i, 2)) = .Item(a(i, 1) & "|" & a(i, 2)) + 1
      End If
      Sums.Item(a(i, 2)) = Sums.Item(a(i, 2)) + a(i, 3)
    Next i
End With
If Dates.Count Then [F2].Resize(Dates.Count).Value = Application.WorksheetFunction.Transpose(Dates.Keys)
If Dates.Count Then [G2].Resize(Dates.Count).Value = Application.WorksheetFunction.Transpose(Dates.Items)
If Dates.Count Then [H2].Resize(Sums.Count).Value = Application.WorksheetFunction.Transpose(Sums.Items)
End Sub
Правильно поставленная задача - три четверти решения.
DiemonStar вне форума Ответить с цитированием
Старый 01.03.2013, 10:47   #12
staniiislav
Форумчанин
 
Аватар для staniiislav
 
Регистрация: 16.04.2010
Сообщений: 695
По умолчанию

Цитата:
Сообщение от DiemonStar Посмотреть сообщение
staniiislav,
можно было из вашего же примера сделать намного проще:
Код:
Sub Cnt()
Dim a(), i&
a = [A2].CurrentRegion.Value

Set Dates = CreateObject("scripting.dictionary")

With CreateObject("scripting.dictionary")
    For i = 2 To UBound(a)
      If Not .Exists(a(i, 1) & "|" & a(i, 2)) Then
        .Item(a(i, 1) & "|" & a(i, 2)) = 1
        Dates.Item(a(i, 2)) = Dates.Item(a(i, 2)) + 1
      Else
        .Item(a(i, 1) & "|" & a(i, 2)) = .Item(a(i, 1) & "|" & a(i, 2)) + 1
      End If
    Next i
End With
If Dates.Count Then [F2].Resize(Dates.Count).Value = Application.WorksheetFunction.Transpose(Dates.Keys)
If Dates.Count Then [G2].Resize(Dates.Count).Value = Application.WorksheetFunction.Transpose(Dates.Items)
End Sub
не догадался )))) еще не полностью словари освоил (((
Единственный способ стать умнее, играть с более умным противником...
staniiislav вне форума Ответить с цитированием
Старый 01.03.2013, 11:20   #13
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Думаю тут словарь в словаре нужен.
Собираем словарь дат, ему в итем словарь счетов, в нём каждому счёту в итем собираем суммы.
Выгрузка - в цикле перебираем первый словарь, в цикле вложенный. Можно в промежуточный массив.
Так получите даты/счета/суммы.
В каком виде это выгружать - пока непонятно.
Но писать сейчас некогда - но тут такие коды ранее уже писал, поищите и сделайте по образцу.
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 01.03.2013, 11:53   #14
DiemonStar
Старожил
 
Регистрация: 08.02.2012
Сообщений: 2,173
По умолчанию

Цитата:
Думаю тут словарь в словаре нужен.
словарь в словаре это для создания универсальной БД. Здесь же по условию задачи не требуется такое. Хватает трех словарей - для счета уникальных, для суммирования и для выделения уникальных значений.
Правильно поставленная задача - три четверти решения.
DiemonStar вне форума Ответить с цитированием
Старый 01.03.2013, 12:11   #15
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Вот приспособил нечто уже ранее написанное:

Код:
Sub PereborDatScetov()    ' словарь в словаре
    Dim a, i&, t$, Dic As Object, Dic2 As Object
    Dim el, col

    a = Range("C2", 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, 2)
            If Not .exists(t) Then .Add t, CreateObject("Scripting.Dictionary")
            .Item(t).Item(a(i, 1)) = .Item(t).Item(a(i, 1)) + a(i, 3)
        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
    Next

End Sub
Результат выводится в окно отладки (Ctrl+G в редакторе).
webmoney: E265281470651 Z422237915069 R418926282008

Последний раз редактировалось Hugo121; 01.03.2013 в 12:13. Причина: пробельчик не помешает...
Hugo121 вне форума Ответить с цитированием
Старый 03.03.2013, 18:59   #16
strannick
Форумчанин
 
Регистрация: 21.10.2011
Сообщений: 433
По умолчанию

Спасибо всем принявшим участие в теме. Взял за основу код DiemonStar. В процессе подготовки таблицы с итоговыми данными понадобилось еще выбрать оплаченные/неоплаченные счета по датам. Там было проще, в допстолбце после предобработки были проставлены единички. Вот на всякий случай код с добавкой для таких случаев, может кому понадобиться:
Код:
Sub СчетаДатаОпл()
Dim a(), i&
a = [A2].CurrentRegion.Value

Set Dates = CreateObject("scripting.dictionary")
Set Sums = CreateObject("scripting.dictionary")

With CreateObject("scripting.dictionary")
    For i = 2 To UBound(a)
    If a(i, 8) = 1 Then
      If Not .Exists(a(i, 1) & "|" & a(i, 3)) Then
        .Item(a(i, 1) & "|" & a(i, 3)) = 1
        Dates.Item(a(i, 3)) = Dates.Item(a(i, 3)) + 1
      Else
        .Item(a(i, 1) & "|" & a(i, 3)) = .Item(a(i, 1) & "|" & a(i, 3)) + 1
      End If
      Sums.Item(a(i, 3)) = Sums.Item(a(i, 3)) + a(i, 2)
    End If
    Next i
End With
If Dates.Count Then [P2].Resize(Dates.Count).Value = Application.WorksheetFunction.Transpose(Dates.Keys)
If Dates.Count Then [Q2].Resize(Dates.Count).Value = Application.WorksheetFunction.Transpose(Dates.Items)
If Dates.Count Then [R2].Resize(Sums.Count).Value = Application.WorksheetFunction.Transpose(Sums.Items)
End Sub
Номера счетов в первом столбце, суммы - во втором, пометка оплаты -в восьмом. Точно так же по неоплаченным (пометка в девятом столбце). Увязать все в коде не получилось. Пока не получилось, что-то туговато у меня со словарями идет. Еще раз всем спасибо!!!
strannick вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Генератор уникальных чисел Oct14 Общие вопросы C/C++ 13 21.12.2019 20:34
Не работает подсчет уникальных значений AllenJ Microsoft Office Excel 16 13.10.2012 17:29
по дате рождения и текущей дате (день, месяц, год) определить сколько дней до дня рождения (код на ПАСКАЛЕ) Николай1 Помощь студентам 1 16.02.2012 09:07
подсчет уникальных ячеек с небольшими но... mr.null Microsoft Office Excel 17 21.06.2011 09:21
Подсчет возраста по дате рождения Zemka Microsoft Office Access 1 29.05.2009 17:18