Страницы: 1
RSS
Метод exists при повторах
 
Доброго времени суток, уважаемые форумчане. Подскажите, как можно решить небольшую проблему или избавьте от иллюзий (ниже объясню поподробней :oops: ). Итак, словарем отбираются данные и затем выгружаются на лист:        
Код
    y = Sheets("Расход").Range("A2:E" & Sheets("Расход").Cells(Rows.Count, [Date_dokumenta_rashoda].Column).End(xlUp).Row).Value 
            Set dicRashod = CreateObject("Scripting.Dictionary"): dicRashod.CompareMode = 1
                            
                For i = 1 To UBound(y)
                    key = y(i, 1) & "|" & y(i, 2) & "|" & y(i, 3)
                    dicRashod.Item(key) = dicRashod.Item(key) + y(i, 4)
                Next i
                
                On Error Resume Next
                ReDim Arr_r(1 To dicRashod.Count, 1 To 4)
                    For Each k In dicRashod.keys
                        Data = Split(k, "|")
                        j = j + 1
                        Arr_r(j, 1) = Data(2)
                        Arr_r(j, 2) = Data(1)
                        Arr_r(j, 3) = Data(0)
                        Arr_r(j, 4) = CDbl(dicRashod.Item(k))
                    Next k
                        Range("A20").Resize(UBound(Arr_r, 1), 4).Value = Arr_r
Все в принципе ОК, но иногда данных по расходу за один день у какого-либо подразделения несколько (в примере у подразделения БУЗООБСМЭ 22.06.2018 имеются 3 документа расхода). Сейчас все 3 документа отображаются в 3 строках, а как сделать так, чтобы в подобном случае номера расходных документов (сколько бы их не было) перечислялись бы через запятую в 1 ячейке, а сумма всех этих документов также отображалась в соответствующей ячейке? Пытался применить exists, типа если комбинация дата|подразделение уже встречалась, то к имеющимся данным добавить номер документа, но не вышло.

Теперь об избавлении от иллюзий 8-0 , скажу честно, вариант решения (в свое время подсказанный мне на нашем глубокоуважаемом мною форуме) у меня уже есть, но он подразумевает использование 2-х последовательных циклов (сначала дата|подразделение + сумма, затем к данным номера документов). Но никак не могу избавиться от мысли что можно обойтись 1 циклом. Поэтому прошу не кидать слишком тяжелых тапок за то, что я имея решение, прошу показать другой вариант, а либо подсказать как это можно реализовать за 1 цикл, либо указать (желательно с разъяснением) почему вариант с 1 циклом невозможен.
Заранее спасибо всем откликнувшимся.
 
OlegO, с мин. переделкой так. В словарь помещается массив из двух элементов: номер, сумма.
Код
Private Sub FormPrintButton_Click()
    Application.ScreenUpdating = False
        Dim dicRashod As Object, i As Long, j As Long, key As String, Arr_r(), y(), Data As Variant, k As Variant
            y = Sheets("Расход").Range("A2:E" & Sheets("Расход").Cells(Rows.Count, [Date_dokumenta_rashoda].Column).End(xlUp).Row).Value 'данные в массив
            Set dicRashod = CreateObject("Scripting.Dictionary"): dicRashod.CompareMode = 1
                            
                For i = 1 To UBound(y)
                    key = y(i, 2) & "|" & y(i, 3)
                    If dicRashod.exists(key) Then
                      dicRashod(key) = Array(dicRashod(key)(0) & "," & y(i, 1), dicRashod(key)(1) + y(i, 4))
                    Else
                      dicRashod(key) = Array(y(i, 1), y(i, 4))
                    End If
                Next i
                
                On Error Resume Next
                ReDim Arr_r(1 To dicRashod.Count, 1 To 4)
                    For Each k In dicRashod.keys
                        Data = Split(k, "|")
                        j = j + 1
                        Arr_r(j, 1) = Data(1)
                        Arr_r(j, 2) = Data(0)
                        Arr_r(j, 3) = dicRashod(k)(0)
                        Arr_r(j, 4) = dicRashod(k)(1)
                    Next k
                        Range("A20").Resize(UBound(Arr_r, 1), 4).Value = Arr_r
    Application.ScreenUpdating = True
End Sub
 
Спасибо огромное, Казанский. Все работает как надо! Не зря мне все-таки мысль в голову прибежала :) . Еще раз спасибо.
 
Казанский, Очень полезный код Вы дали. Однако, если номер документы трех или более значный, то запятая между номерами не ставится. Как это можно исправить?
 
Цитата
thunder написал:
то запятая между номерами не ставится
Не знаю ,thunder, как у Вас так получается. Специально проверил Ваше утверждение, проставив 4 значные номера тестовому подразделению - все нормально. Единственно, для пущей красоты, добавил к коду от Казанского пробел после запятой в 10 строке кода. При нескольких 4 значных номерах в ячейку они не влезут конечно, так это совсем уже другой вопрос ,да и лечится легко (автоподбором ширины)
 
OlegO, вот как у меня работает
 
thunder, как ни странно, но моя корректировка кода (из поста №5) решает проблему
Изменено: OlegO - 12.12.2018 08:27:10
 
OlegO, Точно  :)  
 
thunder, Не вдавался в подробности почему именно это происходит, но дело в запятой. Варианты решения

1) Заменить "," на что то другое (например как подсказали выше, добавить пробел)
2) Выставить формат ячеек столбца в который идет вставка - ТЕКСТОВЫЙ
Изменено: Александр П. - 12.12.2018 08:38:13
 
Александр П., Спасибо!  
Страницы: 1
Наверх