Приветствую! Вот какая суть проблемы , необходимо сцепить горизонтальные ячейки с первым столбцом каждой ячейки в горизонтальной строке, и перенести это все друг под друга. Во вложение пример. Есть строка 11, необходимо что бы бренд из первого столбца встал перед кодами на его строке ,и в дальнейшем переместился друг под друга что бы в столбик стал в одной ячейке бренд ,а рядом код.(пример есть в файле на листе 2)
Приветствую! Вот какая суть проблемы , необходимо сцепить горизонтальные ячейки с первым столбцом каждой ячейки в горизонтальной строке, и перенести это все друг под друга. Во вложение пример. Есть строка 11, необходимо что бы бренд из первого столбца встал перед кодами на его строке ,и в дальнейшем переместился друг под друга что бы в столбик стал в одной ячейке бренд ,а рядом код.(пример есть в файле на листе 2)ilyamihilev
ilyamihilev, думаю формулами на практике не наработаете, а вот макросом можно пробовать (первая версия была не то, выгрузка не так сделалась... )) ) [vba]
Код
Option Explicit
Sub Perebor() 'коллекция в словаре Dim a, i&, ii&, t$, tt$, Dic As Object Dim el, col, mx&
a = [a1].CurrentRegion.Value Set Dic = CreateObject("Scripting.Dictionary") With Dic .CompareMode = 1 For i = 1 To UBound(a) t = a(i, 1) If Not .exists(t) Then .Add t, New Collection For ii = 2 To UBound(a, 2) tt = Trim(a(i, ii)) If Len(tt) Then .Item(t).Add "'" & tt: mx = mx + 1 Next Next End With
ReDim b(1 To mx, 1 To 2): i = 0 For Each el In Dic.keys For Each col In Dic.Item(el) i = i + 1 b(i, 1) = el b(i, 2) = col Next Next
With Workbooks.Add.Sheets(1) .Cells(1, 1).Resize(UBound(b), UBound(b, 2)) = b .Cells.EntireColumn.AutoFit End With End Sub
[/vba] Выполнить на активном листе с исходными данными в показанном виде.
ilyamihilev, думаю формулами на практике не наработаете, а вот макросом можно пробовать (первая версия была не то, выгрузка не так сделалась... )) ) [vba]
Код
Option Explicit
Sub Perebor() 'коллекция в словаре Dim a, i&, ii&, t$, tt$, Dic As Object Dim el, col, mx&
a = [a1].CurrentRegion.Value Set Dic = CreateObject("Scripting.Dictionary") With Dic .CompareMode = 1 For i = 1 To UBound(a) t = a(i, 1) If Not .exists(t) Then .Add t, New Collection For ii = 2 To UBound(a, 2) tt = Trim(a(i, ii)) If Len(tt) Then .Item(t).Add "'" & tt: mx = mx + 1 Next Next End With
ReDim b(1 To mx, 1 To 2): i = 0 For Each el In Dic.keys For Each col In Dic.Item(el) i = i + 1 b(i, 1) = el b(i, 2) = col Next Next
With Workbooks.Add.Sheets(1) .Cells(1, 1).Resize(UBound(b), UBound(b, 2)) = b .Cells.EntireColumn.AutoFit End With End Sub
[/vba] Выполнить на активном листе с исходными данными в показанном виде.Hugo
ilyamihilev, это было в первой версии )) Кстати можете код где-то сохранить, вдруг понадобится так преобразовать что-то... Он в основном отличается только выгрузкой, верхняя часть совсем чуть изменена. Но его больше нигде нет ))
ilyamihilev, это было в первой версии )) Кстати можете код где-то сохранить, вдруг понадобится так преобразовать что-то... Он в основном отличается только выгрузкой, верхняя часть совсем чуть изменена. Но его больше нигде нет ))Hugo
Я вот тоже в начале - собрал всё это в словарь с коллекцией, затем разложил всё назад в новой книге )) Кстати тем кодом можно было бы провернуть всё назад. Ну если вдруг нужно. Или собрать из такого же негруппированого в сгрупированное. И можно было в процессе ещё и отсортировать. Только вот тот код остался только у ТС, если остался...
Я вот тоже в начале - собрал всё это в словарь с коллекцией, затем разложил всё назад в новой книге )) Кстати тем кодом можно было бы провернуть всё назад. Ну если вдруг нужно. Или собрать из такого же негруппированого в сгрупированное. И можно было в процессе ещё и отсортировать. Только вот тот код остался только у ТС, если остался...Hugo