Здравствуйте, имеется две колонки, нужно сгруппировать значения как показано на картинке....
Не знаю как объяснить, нужно из первой колонки взять значения, а из второй колонки в скобках сгруппировать значения соответствующие первой колонке. Это вообще возможно? Строк может быть несколько тысяч...
Sub ddd()
Set dic = CreateObject("Scripting.Dictionary")
mas = Sheets("Лист1").Range("B2:C16").Value
For i = 1 To UBound(mas)
n = n + 1
If Not dic.exists(mas(i, 1)) Then Set dic(mas(i, 1)) = CreateObject("Scripting.Dictionary")
dic(mas(i, 1))(n) = mas(i, 2)
Next
For Each y In dic
dic(y) = y & " (" & Join(dic(y).items, ", ") & ")"
Next
Workbooks.Add
[A1].Value = Join(dic.items, ", ")
End Sub
Допустим ввести в J2 и протянуть вниз. Результат получите в J2. =ЕСЛИ($B2=ИНДЕКС($B:$B;СТРОКА()-1);"";$B2&"(")&$C2&ЕСЛИ($B2=ИНДЕКС($B:$B;СТРОКА()+1);",";")"&ЕСЛИ(ДЛСТР(ИНДЕКС($B:$B;СТРОКА()+1));", ";""))&ЕСЛИ(ДЛСТР(ИНДЕКС($B:$B;СТРОКА()+1));ИНДЕКС(J:J;СТРОКА()+1);"") Проверяйте.
Формула массива (ФМ) вводится Ctrl+Shift+Enter Memento mori
решение формулой, =ОБЪЕДИНИТЬ появился в 2019-м офисе. список уникальных значений в столбце E можно получить стандартным инструментом Данные - Удалить дубликаты, если у вас не 365
А если немного изменить код Бахтиёр, из 2-ого сообщения, то будет сортировать значения внутри группы
Код
Sub Сборка()
Set dic = CreateObject("Scripting.Dictionary")
mas = Sheets("Лист1").Range("B2:C16").Value
For i = 1 To UBound(mas)
n = n + 1
If Not dic.exists(mas(i, 1)) Then Set dic(mas(i, 1)) = CreateObject("System.Collections.ArrayList")
dic(mas(i, 1)).Add mas(i, 2)
Next
For Each y In dic
dic(y).Sort
dic(y) = y & " (" & Join(dic(y).ToArray, ", ") & ")"
Next
[F1].Value = Join(dic.items, ", ")
End Sub
Или вот так функцией
Код
Public Function Sborka(myrange As Range) As String
Set dic = CreateObject("Scripting.Dictionary")
mas = myrange.Value
For i = 1 To UBound(mas)
n = n + 1
If Not dic.exists(mas(i, 1)) Then Set dic(mas(i, 1)) = CreateObject("System.Collections.ArrayList")
dic(mas(i, 1)).Add mas(i, 2)
Next
For Each y In dic
dic(y).Sort
dic(y) = y & " (" & Join(dic(y).ToArray, ", ") & ")"
Next
Sborka = Join(dic.items, ", ")
End Function
Здравствуйте Можно ли усложнить задачу и сделать так, чтоб эксель не перечислял все значения из второй колонки через запятую, а группировал их и ставил через тире, например не 1,2,3,4,5,6, а 1-6, а если значений подряд идет два, то ставил их через запятую? пример 2,3,4,5,6,8,9,12,13,14,15,16 ->2-6,8,9,12-16 Спасибо