Страницы: 1
RSS
Объединить в скобках значения второго столбца, соответствующие одинаковым значения первого
 
Здравствуйте, имеется две колонки, нужно сгруппировать значения как показано на картинке....

Не знаю как объяснить, нужно из первой колонки взять значения, а из второй колонки в скобках сгруппировать значения соответствующие первой колонке. Это вообще возможно? Строк может быть несколько тысяч...
Изменено: vikttur - 17.10.2021 12:16:01
 
Код
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
Изменено: Бахтиёр - 18.06.2021 08:48:37
 
В доп. столбец формулу:
=B2+C2/100
И сортируйте по нему
Изменено: msi2102 - 18.06.2021 08:43:10
 
Допустим ввести в 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
Изменено: Бахтиёр - 18.06.2021 09:18:11
 
Посмотрите "Копилку идей"
https://www.planetaexcel.ru/forum/index.php?PAGE_NAME=read&FID=2&TID=10&TITL...
Там выложена прекрасная функция от Hugo.
 
а я обычно так делаю
 
А если немного изменить код Бахтиёр, из 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
Изменено: msi2102 - 21.06.2021 09:09:06
 
Всем спасибо огромное!!! Даже и не думал, что так много возможных решений!
 
Здравствуйте
Можно ли усложнить задачу и сделать так, чтоб эксель не перечислял все значения из второй колонки через запятую, а группировал их и ставил через тире, например не 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
Спасибо
Страницы: 1
Наверх