Excel - макрос для об'єднання вибраних рядків

Проблема

Я маю вихідні дані в Excel, які виглядають так:

CustomerID SalesMonth SalesAmount

 12345 січня 150 12345 березня 100 12345 квіт. 200 56789 січня 800 56789 травень 10 78945 20 листопада 44444 січ. 

Поєднання CustomerID і SalesMonth є унікальним.

Я хотів би об'єднати вихідні дані в іншій вкладці Excel у такій формі:

CustomerID 1stMonth 1stAmount 2ndMonth 2ndAmount 3rdMonth 3rdAmount

 12345 січ. 150 березень 100 квіт. 200 56789 січ. 800 травень 10 78945 20 листопада 44444 січ 

Всього може бути до 10 різних місяців для клієнта (деякі мають лише 1 або 2). Важливо, що в жодному з вихідних рядків немає "прогалин", наприклад, якщо клієнт має продажі тільки в листопаді, тоді клітина "1stMonth" повинна читати "Nov" для цього клієнта.

Рішення

Спробуйте цей макрос і див. Аркуш 2 (скопіюйте дані в аркуші 1 на лист 3 як запобіжний засіб безпеки)

 Sub-тест () Dim-клієнт As Range, ddata () As Range, custunq As Range, cunq As Range, filt As Range Діапазон, як діапазон, j як довго, k як довго з робочими аркушами ("sheet1") Встановити клієнта = Діапазон ( Зміни ("A1"), .Range ("A1"). End (xlDown)) Встановити custunq = .Range ("A1"). End (xlDown) .Offset (5, 0) customer.AdvancedFilter xlFilterCopy,, custunq, True Set custunq = Діапазон (custunq.Offset (1, 0), custunq.End (xlDown)) Для кожного custunq У custunq .Range ("A1"). Поле CurrentRegion.AutoFilter: = 1, Criteria1: = custunq.Value Встановити filt = .Range ("A1"). CurrentRegion.Offset (1, 0) .Resize (Rows.Count - 1, Columns.Count). _ SpecialCells (xlCellTypeVisible) j = WorksheetFunction.CountA (filt.Columns (1)) 'MsgBox j ReDim ddata (1 до j) з робочими аркушами ("sheet2") Встановити dest = .Cells (Rows.Count, "A"). End (xlUp) .Offset (1, 0) dest = filt (1, 1) End With Для k = 1 До j Set ddata (k) = .Range (filt (k, 2), filt (k, 3)) Копіювати з робочими аркушами ("sheet2"). Клітинки (dest.Row, Columns.Count) .End (xlToLeft) .Offset (0, 1) .PasteSpecial Завершити наступний k .Range ("A1"). CurrentRegion.AutoFilter Наступний діапазон custunq (.Range ("a1"). End (xlDown) .Offset (1, 0), .Cells (Rows.Count, "A"). End (xlUp)). End Sub Sub undo () Робочі листи ("sheet2"). Cells.Clear End Sub 

Завдяки Venkat1926 для цього чайові.

Попередня Стаття Наступна Стаття

Кращі Поради