Страницы: 1
RSS
Собрать новую таблицу из дубликатов
 
Всем доброго времени суток. Заранее извиняюсь перед всем за вероятно криво поставленный вопрос.

Постараюсь максимально точно донести суть.

Есть таблица с данными, (пример прикреплю) в ней 4 колонки первая из которых повторяется, остальные уникальные. Как мне на основании первой колонки сгруппировать их таким образом чтобы получить строку вида ID + содержимое по каждой смежной ячейки. Трудность еще и в том, что мне нужно полученный результат обрамлять текстом.

Постараюсь описать пример который прикрепил:

В колонке категории ID = 1 повторяется пять раз. Мне нужно В отдельной таблице вывести колонку ID = 1 единожды, а в соседнюю собрать все строки с данными и вывести по примеру ="Товар" & "(Ячейка с названием)" & "(ячейка с описанием)" & "продается по цене" & "(ячейка с ценой)"

Это вероятно трудно дается к восприятию, но я надеюсь вы поможете мне найти решение.

ps. Данных ~ 80 тысяч строк, с примерно 9 тысячами уникальных ID
 
Код
Sub Main()
    Dim dic As Object
    Set dic = GetDic()
    
    Dim arr As Variant
    arr = GetArr(dic)
    
    Sheets("Лист1").Range("F2").Resize(UBound(arr, 1), UBound(arr, 2)) = arr
End Sub
'
Function GetDic() As Object
    Dim d As Object
    Set d = CreateObject("Scripting.Dictionary")
    
    With ActiveSheet
        Dim y As Long
        Dim a As Variant
        y = .Cells(.Rows.Count, 1).End(xlUp).Row
        a = .Range(.Cells(2, 1), .Cells(y, 4))
    End With
    
    Dim s As String
    For y = 1 To UBound(a, 1)
        If Not d.Exists(a(y, 1)) Then
            Set d.Item(a(y, 1)) = CreateObject("Scripting.Dictionary")
        End If
        s = Join(Array("Товар (", a(y, 2), ") (", a(y, 3), ") продаётся по цене (", a(y, 4), ")"), "")
        d.Item(a(y, 1)).Item(s) = 0
    Next
    
    Set GetDic = d
End Function
'
Function GetArr(dic As Object) As Variant
    Dim a As Variant
    If dic.Count = 0 Then
        ReDim a(1 To 1, 1 To 2)
    Else
        ReDim a(1 To dic.Count, 1 To 2)
        Dim y As Long
        For y = 1 To UBound(a, 1)
            a(y, 1) = dic.Keys()(y - 1)
            a(y, 2) = Join(dic.Items()(y - 1).Keys(), vbCrLf)
            
        Next
    End If
    GetArr = a
End Function
 
МатросНаЗебре, мое уважение! огромное спасибо за помощь!
Страницы: 1
Наверх