Страницы: 1
RSS
Разделить ячейки по разделителю ВНИЗ (по строкам), вставляя новые строки
 
Приветствую всех!
Очень прошу помощи, то ли я запрос правильно сформулировать не могу, то ли это что-то сложное, но нигде не могу найти решение моей задачи.
Подгрузила, как пример вымышленную таблицу, в моём случае значений далеко за тысячу, больше столбцов и вручную делать перетасовку данных реально, но довольно долго.

Суть - есть данные - год, месяц (рождения) и перечисление имён через запятую (три столбца - Год/Месяц/Имя).
Мне же необходимо, раскидать значения имён в столбец по строкам, и значения, которые им ранее соответствовали скопировать также построчно, при этом те данные где ничего раскидывать не нужно, остаются в том же виде.
Чтобы было понятнее прикрепила табличку - первый лист то, что у меня есть изначально, второй - "итог", то что должно получиться.
Подозреваю, что без макроса тут не обойтись...
Ещё раз обращаю внимание, что у меня данных намного больше, и значений в некоторых ячейках через запятую, достигает 100 и более, их надо превратить в столбец.

Есть ли какие-то варианты решения, не тратя на это много времени?
Заранее спасибо.
Изменено: vikttur - 31.08.2021 13:06:16
 
Екатерина Хлопкова, здравствуйте!
    1. Универсальный вариант: разбить по столбцам с помощью инструмента Текст по столбцам + Редизайнер
    2. 2 макроса: Текст по строкам + Заполнить пустые ячейки значениями из верхних
Изменено: Jack Famous - 31.08.2021 12:42:30
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Комплексные задачи - это в раздел Работа (там платно)
Здесьправило "один вопрос - одна тема". предложите название темы, отражающее вопрос. Заменят модераторы
 
Цитата
vikttur: предложите название
Разделить ячейки по разделителю ВНИЗ (по строкам), вставляя новые строки
По сути, это моя старая тема. Про "заполнить сверху" можно не писать - и так посмотрит
Изменено: Jack Famous - 31.08.2021 12:45:14
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Выделите диапазон, запустите макрос.
Код
Sub ТекстоПоСтрокам()
    Dim arr As Variant
    arr = GetArr()
    
    If Not IsArray(arr) Then
        MsgBox "Выделите диапазон.", vbInformation
        Exit Sub
    End If

    Dim y As Long
    Dim x As Long
    Dim h As Long
    Dim n As Long
    x = UBound(arr, 2)
    For y = 1 To UBound(arr, 1)
        n = n + 1 + Len(arr(y, x)) - Len(Replace(arr(y, x), ",", ""))
    Next
    
    Dim orr As Variant
    ReDim orr(1 To n, 1 To x)
'    For h = 1 To x
'        orr(1, h) = arr(1, h)
'    Next
    
    Dim brr As Variant
    Dim v As Variant
    n = 0
    For y = 1 To UBound(arr, 1)
        brr = Split(arr(y, x), ",")
        For Each v In brr
            n = n + 1
            For h = 1 To x - 1
                orr(n, h) = arr(y, h)
            Next
            orr(n, x) = Trim(v)
        Next
    Next
        
    OutArr orr
End Sub

Sub OutArr(arr As Variant)
    With Workbooks.Add(1)
        .Sheets(1).Cells(1, 1).Resize(UBound(arr, 1), UBound(arr, 2)) = arr
        .Saved = True
    End With
End Sub

Function GetArr() As Variant
    Dim arr As Variant
    arr = Intersect(Selection, ActiveSheet.UsedRange)
    GetArr = arr
End Function
Изменено: МатросНаЗебре - 31.08.2021 12:56:07
 
Екатерина Хлопкова,
Код
Sub mrshkei()
Dim arr, arr2, arr3, i As Long, n As Long, lr As Long
lr = Cells(Rows.Count, 1).End(xlUp).Row
arr = Range("A2:C" & lr)
For i = LBound(arr) To UBound(arr)
    arr2 = Split(arr(i, 3), ", ")
    For n = LBound(arr2) To UBound(arr2)
        k = k + 1
    Next n
Next i
ReDim arr3(1 To k, 1 To 3)
k = 1
For i = LBound(arr) To UBound(arr)
    arr2 = Split(arr(i, 3), ", ")
    For n = LBound(arr2) To UBound(arr2)
        arr3(k, 1) = arr(i, 1)
        arr3(k, 2) = arr(i, 2)
        arr3(k, 3) = arr2(n)
        k = k + 1
    Next n
Next i
Range("D2").Resize(UBound(arr3), 3) = arr3
End Sub
Не бойтесь совершенства. Вам его не достичь.
 
Вариант:
Код
Sub SplitNames()
m1 = Sheets("Начальные данные").Range("A2:C10").Value
n = 1
For i = LBound(m1) + 1 To UBound(m1)
    A = Split(m1(i, 3), ", ")
    n = n + UBound(A) + 1
Next i
ReDim m2(1 To n + 1, 1 To 3)
n = 1
For i = LBound(m1) To UBound(m1)
    A = Split(m1(i, 3), ", ")
    For j = LBound(A) To UBound(A)
        If A(j) <> "" Then
            For k = 1 To UBound(m1, 2)
                m2(n, k) = m1(i, k)
            Next k
            m2(n, UBound(m1, 2)) = A(j)
            n = n + 1
        End If
    Next j
Next
Sheets("Итог").Range("A2:C" & UBound(m2)).Value = m2
End Sub
 
Цитата
Jack Famous написал: Разделить ячейки по разделителю ВНИЗ (по строкам), вставляя новые строки
Спасибо, я уже неделю запрос верно сформулировать-то пытаюсь)))

МатросНаЗебре, спасибо, работает))))
No Name, тоже работает, только ячейки ("A2:C10") немного поменяла. Спасибо!
Огромное всем спасибо, буду теперь пытаться понять, как вы эту магию сотворили))) Чудеса просто  :D  
 
И вариант на PQ
В жизни нет ничего невозможного! Есть только недостаток знаний и умений.
 
Для коллекции:
насколько я понимаю, обратная задача может быть решена несколькими способами: Распределяем список по наборам
Возможно идеи из этой статьи пригодятся при формулировании новых вопросов...  
 
Александр,
интересно.
А как вы это сделали?
 
IKor,
спасибо!
Это тоже очень может пригодиться.
 
Цитата
Екатерина Глазунова написал:
А как вы это сделали?
редактор PQ открывали?
В жизни нет ничего невозможного! Есть только недостаток знаний и умений.
 
обидно)
Не бойтесь совершенства. Вам его не достичь.
 
Mershik, +  :(
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Александр,
Да, уже открыла, смотрю))

Mershik,не сработал ваш макрос( ошибку выдал
 
Цитата
Екатерина Глазунова написал:
не сработал ваш макрос( ошибку выдал
показали бы ошибку...у меня все работает
Не бойтесь совершенства. Вам его не достичь.
 
Цитата
Александр написал:
И вариант на PQ
Еще вариант:
Код
let
    src = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],
    addClmn = Table.AddColumn(src, "List", each Text.Split([Имя], ",")),
    expand = Table.ExpandListColumn(addClmn, "List"),
    deleteAndRename = Table.RenameColumns(
        Table.RemoveColumns(expand,{"Имя"}),
        {{"List", "Имя"}}
    )
in
    deleteAndRename
 
Цитата
Mershik написал:
показали бы ошибку...у меня все работает
Хм... беру свои слова назад.. сейчас всё гуд. Мой косяк) Спасибо))
 
оффтопик:
Первое сообщение было отправлено от имени Екатерины Хлопковой, а восьмое - уже от Екатерины Глазуновой...
Екатерина, Вас можно поздравить с замужеством?
:)
 
13:27 - 12:30 = 57 минут... Быстренько, однако.
Помощники, признавайтесь, кто из вас Глазунов? :)
Изменено: vikttur - 31.08.2021 17:35:30
 
Может файл с датами и именами как-то связан с этим праздничным событием?
А уж, что значит несколько имён, записанных через запятую в одну дату, остаётся только гадать. )
 
IKor, vikttur, МатросНаЗебре,
:D
Замужество случилось в конце августа) После создания темы бросилась в глаза прошлая фамилия - решила поменять)) Всё просто)

Файл не связан с праздничным событием) Оригинальный файл нельзя подгружать - секретность :sceptic:   первое, что в голову пришло напечатала :D  
Страницы: 1
Наверх