Страницы: 1
RSS
Многоуровневый поиск и вывод результатов, Поиск внутри поиска и вывод результатов
 
Доброго времени суток всем. Помогите советом.
Есть лист- 3 колонки: 1-список клиентов (они могут повторятся);2-коды приходов, они могут повторятся только у одного клиента;3-сумма прихода.
Цель: найти нужного клиента, найти все "коды приходов" и по каждому "коду приходов" просуммировать "сумму приходов"  
Код
 iLastRow = .Cells(Rows.Count, 1).End(xlUp).Row
    For i = 4 To iLastRow 
        If .Cells(i, 1) = Klient Then ' находим клиента по запросу 
        kPrih = .Cells(i, 2).Value 'вытаскиваем код прихода
        
        .............
        
        End If
    Next i
Клиента нахожу. Не могу сообразить как дальше строить логику. Получаю первый код, а как искать остальные коды, чтобы еще и по клиенту нужному был.
Заранее спасибо.
 
От Вас файл-пример с исходными данными и с желаемым результатом.
 
Вам именно макрос? Если да - может кусок файла с частью данных будет полезнее - вот какая таблица, вот где надо получить данные...
Или, может, посмотреть в сторону использования Данные - промежуточные итоги (с предварительной сортировкой исходных данных). Или посмотреть в сторону сводной таблицы.
Кому решение нужно - тот пример и рисует.
 
Можно с вложенными словарями. Но лучше приложить файл с примером данных, чтобы не изобретать на коленке.
F1 творит чудеса
 
Вот пример.
Цитата
Вам именно макрос?
Да, как построить логику чтобы обработать все критерии поиска по всем уровням и вывод соответствующих результатов
 
Достаточно одного словаря - как ключ берём Наименование фирмы + Код.
Код
Private Sub CommandButton1_Click()
    Dim i As Long, iLastRow As Long, n As Long
    Dim d As Object, t$, k, s$
    Set d = CreateObject("Scripting.Dictionary"): d.comparemode = 1

    With Лист1
        iLastRow = .Cells(Rows.Count, 2).End(xlUp).Row    'получаем последнюю занятую ячейку

        For i = 4 To iLastRow    'ЦИКЛ ПОИСКА КОДА>>>>>>>>>>>>>>>>>>>>>>>>
            If .Cells(i, 2) = ComboBox1.Value Then    ' если код клиента найден то сумируем данные по ГТД
                t = .Cells(i, 2) & "|" & .Cells(i, 3)
                d.Item(t) = d.Item(t) + .Cells(i, 4)
                '        kPrih = .Cells(i, 3).Value
                '        MsgBox kPrih
            End If
        Next i

    End With

    For Each k In d.keys
        s = s & k & "=" & d.Item(k) & vbNewLine
    Next
    MsgBox s
End Sub

Изменено: Hugo - 25.02.2015 11:03:55
 
Hugo спасибо большое за помощь.

Я тоже смог сделать, в самой таблице ввел дополнительные параметры и по ним уже поиск выполняет. Может он и не грамотен, но тем не менее кому то понадобиться.
Изменено: DSH - 25.02.2015 11:20:38
 
Подскажите, если мне нужно обрабатывать еще значения в таблице, то для каждого нужно будет создавать отдельную библиотеку
Код
Set d = CreateObject("Scripting.Dictionary"): d.comparemode = 1
    Set f = CreateObject("Scripting.Dictionary"): f.comparemode = 1
     Set m = CreateObject("Scripting.Dictionary"): m.comparemode = 1
 ......................
     d.item(t) = d.item(t) + .Cells(i, 4)
        m.item(t) = .Cells(i, 7)
        f.item(t) = .Cells(i, 8)
Или можно закинуть в одну. Если можно то как вытаскивать нужный элемент из библиотеки.
Заранее спасибо.
Изменено: DSH - 26.02.2015 09:16:59
 
это Словарь  - принципы его работы посмотрите, например,здесь
по вашему коду - создаётся один словарь, в котором ключу t соответстует составной item (состоит из нескольких значений)... а дальше, наверно, я бы посоветовала бы эту тему рассматривать на различных примерах (коих на форуме много)... так в вашем случае
Код
Set d = CreateObject("Scripting.Dictionary"): d.comparemode = 1    
 ......................
     d.item(t) =  .Cells(i, 7) & "|" & .Cells(i, 7)  
RAN здесь (№6) высказался по этому поводу...

p.s. d.item(t) = d.item(t) + .Cells(i, 4) - просто рассчитывает суммарно по ячейке(i,4)... возможно, для этих целей лучше сформировать d2 (т.е. 2-й словарь) ...
Изменено: JeyCi - 26.02.2015 08:53:35
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
 
Ок, спасибо за наставления, обязательно почитаю.

Цитата
возможно, для этих целей лучше сформировать d2 (т.е. 2-й словарь) ...
А для чего, ведь его задача одна, именно подсчитать сумму. На ум пришел такой выход, чтобы избежать многих библиотек.
Код
Set d = CreateObject("Scripting.Dictionary"): d.comparemode = 1
         Set m = CreateObject("Scripting.Dictionary"): m.comparemode = 1
 ......................
     d.item(t) = d.item(t) + .Cells(i, 4)
        m.item(t) = .Cells(i, 7) & " " & .Cells(i, 8)  & " " & . ..... n
...............
For Each k In d.keys
      kVal=split(m.item(k)," ")
msg "1= " & kVal(0) & "2= " & kVal(1).......
    Next

Изменено: DSH - 26.02.2015 09:34:54
 
и для инфо - можно писать так (как обычно)
Код
kVal=split(m.item(k)," ") (1)  ' или (2) или т д
вобщем всё как обычно - всё зависит от того что и зачем и в каком контексте захотите доставать...
Изменено: JeyCi - 26.02.2015 09:52:39
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
 
Можно создать два словаря - в однм суммы, во втором строка названий, но тогда эту строку достаточно собрать один раз на каждый уникальный ключ, а не на каждый повтор ключа повторять сбор строки.
Можно 3 или 5 словарей, и тоже обновлять только один, остальные только при появлении уникальных.
Можно всё собирать в одном - в item класть массив, где в одном поле сумма, в других значения, но кажется это неоптимально.
Думаю оптимально - один словарь и один отдельный массив (сразу создаём по возможному максимуму значений, ну по задаче можно делать отимальнее) - в массиве собираем суммы и значения, а в словаре уникальные и индексы этого словаря.
 
Цитата
DSH написал: А для чего... На ум пришел такой выход...
так вы сделали ТО ЖЕ самое - только назвали не "d2", а назвали "m"  8)  - создав 2-й словарь
Изменено: JeyCi - 26.02.2015 09:56:14
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
 
Спасибо за разъяснения.
HUGO, получается  что в одной библиотеке можно сделать так:
Код
d.item(t) =Cells(i, 7) & " " & Cells(i, 8) & " " &................ & " " &  d.item(t) + .Cells(i, 4)
Изменено: DSH - 26.02.2015 10:07:16
 
Цитата
JeyCi написал: это Словарь  - принципы его работы посмотрите, например,здесь
Мдааа.... Хорошо, когда английский знаешь... ну или хотя бы - учил. ( :) )
А когда не учил - ... Я вот - немецкий учил...
Так что ихь нихьт фэрштеен, что там, на ...
Всё сложное - не нужно. Всё нужное - просто /М. Т. Калашников/
 
Поищите описание на немецком :)
Я кстати тоже учил только немецкий (из иностранных). Живу не в Англии :)
Изменено: Hugo - 26.02.2015 10:41:32
 
Цитата
DSH написал: получается  что в одной библиотеке можно сделать так:
Нет, из d.item(t) + .Cells(i, 4) получится ерунда, т.е. не сумма, а строка из букв и цифр....
Я предлагал помещать туда массив - но с ним затруднительно работать, тогда его перед обработкой нужно извлечь, с ним поработать, поместить назад - что время, и код на 3 строки больше.
 
То что ерунда, проверил на практике.
В принципе подход с 2мя библиотеками оптимален для данной задачи, поэтому не буду усложнять жизнь))
Все равно спасибо, за вариант решения.
 
Цитата
Михаил Лебедев написал: А когда не учил - ... Я вот - немецкий учил...
ich verstehe nicht warum sehen Sie  nicht die  Vorbilden ? (?)  ;)
но был ведь и 2-й вариант в моём пост№9...
3-й вариант
Изменено: JeyCi - 28.02.2015 07:52:36
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
Страницы: 1
Наверх