Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Трансформ текста ячейки в строки - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Трансформ текста ячейки в строки (Макросы/Sub)
Трансформ текста ячейки в строки
VAlxB Дата: Пятница, 14.11.2014, 10:15 | Сообщение № 1
Группа: Пользователи
Ранг: Прохожий
Сообщений: 8
Репутация: 0 ±
Замечаний: 60% ±

Excel 2013
Уважаемые мастера, макрописатели!

Есть проблемка - срочно нужен макрос, позволяющий взять из ячейки текст с запятыми и создать строки, содержащие текст, находившийся между запятыми.

Например я ячейке содержится: 50319, 50349, 996, 5079, 50365, 5089, 991, 50408, 50483, 5012, 50466, 50306, 50354, 50455, 50350, 50485

Соответственно результат должен быть (без запятых, строки сразу за той, в которой исходный текст):
50319
50349
996
5079
50365
5089
991
50408
50483
5012
50466
50306
50354
50455
50350
50485

Очень прошу помочь!

P.S. В прилагаемом файле два листа: Исходные данные и Результат (как должно выглядеть, но результат должен быть на том же листе, где и исходные данные)
К сообщению приложен файл: Text2Lines.xlsx (8.8 Kb)
 
Ответить
СообщениеУважаемые мастера, макрописатели!

Есть проблемка - срочно нужен макрос, позволяющий взять из ячейки текст с запятыми и создать строки, содержащие текст, находившийся между запятыми.

Например я ячейке содержится: 50319, 50349, 996, 5079, 50365, 5089, 991, 50408, 50483, 5012, 50466, 50306, 50354, 50455, 50350, 50485

Соответственно результат должен быть (без запятых, строки сразу за той, в которой исходный текст):
50319
50349
996
5079
50365
5089
991
50408
50483
5012
50466
50306
50354
50455
50350
50485

Очень прошу помочь!

P.S. В прилагаемом файле два листа: Исходные данные и Результат (как должно выглядеть, но результат должен быть на том же листе, где и исходные данные)

Автор - VAlxB
Дата добавления - 14.11.2014 в 10:15
Pelena Дата: Пятница, 14.11.2014, 10:44 | Сообщение № 2
Группа: Админы
Ранг: Местный житель
Сообщений: 19195
Репутация: 4423 ±
Замечаний: ±

Excel 365 & Mac Excel
Так подойдёт?
К сообщению приложен файл: Text2Lines.xls (33.0 Kb)


"Черт возьми, Холмс! Но как??!!"
Ю-money 41001765434816
 
Ответить
СообщениеТак подойдёт?

Автор - Pelena
Дата добавления - 14.11.2014 в 10:44
Rioran Дата: Пятница, 14.11.2014, 11:00 | Сообщение № 3
Группа: Авторы
Ранг: Ветеран
Сообщений: 903
Репутация: 290 ±
Замечаний: 0% ±

Excel 2013
VAlxB, здравствуйте.

Решение кнопой во вложении. Подходит?

[vba]
Код
Sub Rio_Deployment()

Dim X&, A&, StrX$, ArrX: StrX = Cells(1, 1).Value

For X = 1 To Len(StrX)
     If Mid(StrX, X, 1) = "," Then A = A + 1
Next X

ArrX = Split(StrX, ", ")
For X = 0 To A: Cells(2 + X, 1).Value = ArrX(X): Next X

End Sub
[/vba]
К сообщению приложен файл: Rio_Deploy.xlsm (17.0 Kb)


Роман, Москва, voronov_rv@mail.ru
Яндекс-Деньги: 41001312674279
 
Ответить
СообщениеVAlxB, здравствуйте.

Решение кнопой во вложении. Подходит?

[vba]
Код
Sub Rio_Deployment()

Dim X&, A&, StrX$, ArrX: StrX = Cells(1, 1).Value

For X = 1 To Len(StrX)
     If Mid(StrX, X, 1) = "," Then A = A + 1
Next X

ArrX = Split(StrX, ", ")
For X = 0 To A: Cells(2 + X, 1).Value = ArrX(X): Next X

End Sub
[/vba]

Автор - Rioran
Дата добавления - 14.11.2014 в 11:00
VAlxB Дата: Пятница, 14.11.2014, 11:01 | Сообщение № 4
Группа: Пользователи
Ранг: Прохожий
Сообщений: 8
Репутация: 0 ±
Замечаний: 60% ±

Excel 2013
Pelena, СУПЕР!!! И так быстро!

Единственно, хотелось чтобы первая результирующая строка была в исходной ячейке. Но и так хорошо.

Моя большая признательность!

P.S. Еще нужно, чтобы строки с результатами ВСТАВЛЯЛИСЬ.


Сообщение отредактировал VAlxB - Пятница, 14.11.2014, 11:06
 
Ответить
СообщениеPelena, СУПЕР!!! И так быстро!

Единственно, хотелось чтобы первая результирующая строка была в исходной ячейке. Но и так хорошо.

Моя большая признательность!

P.S. Еще нужно, чтобы строки с результатами ВСТАВЛЯЛИСЬ.

Автор - VAlxB
Дата добавления - 14.11.2014 в 11:01
VAlxB Дата: Пятница, 14.11.2014, 11:09 | Сообщение № 5
Группа: Пользователи
Ранг: Прохожий
Сообщений: 8
Репутация: 0 ±
Замечаний: 60% ±

Excel 2013
Rioran,

тоже большое спасибо!!

Еще чуть бы поправить, чтобы первая результирующая строка была в исходной ячейке,
а строки с результатами были новыми, вставленными.
Т.е. то что под исходной строкой "уехало" вниз, а не перезаписалось результатами.


Сообщение отредактировал VAlxB - Пятница, 14.11.2014, 11:11
 
Ответить
СообщениеRioran,

тоже большое спасибо!!

Еще чуть бы поправить, чтобы первая результирующая строка была в исходной ячейке,
а строки с результатами были новыми, вставленными.
Т.е. то что под исходной строкой "уехало" вниз, а не перезаписалось результатами.

Автор - VAlxB
Дата добавления - 14.11.2014 в 11:09
Rioran Дата: Пятница, 14.11.2014, 11:17 | Сообщение № 6
Группа: Авторы
Ранг: Ветеран
Сообщений: 903
Репутация: 290 ±
Замечаний: 0% ±

Excel 2013
VAlxB, Ваше желание исполнено =)

Посмотрите кнопу во вложении. Макрос Елены изящен, а мой изначально был избыточен по количеству действий. Однако мой, наверно, легче перестроить под новые условия задачи.

[vba]
Код
Sub Rio_Deployment2()

Dim X&, A&, StrX$, ArrX: StrX = Cells(1, 1).Value

For X = 1 To Len(StrX)
     If Mid(StrX, X, 1) = "," Then A = A + 1
Next X

ArrX = Split(StrX, ", ")
Rows("2:" & A + 1).Insert

For X = 0 To A
     Cells(1 + X, 1).Value = ArrX(X)
Next X

End Sub
[/vba]
К сообщению приложен файл: Rio_Deploy2.xlsm (18.3 Kb)


Роман, Москва, voronov_rv@mail.ru
Яндекс-Деньги: 41001312674279
 
Ответить
СообщениеVAlxB, Ваше желание исполнено =)

Посмотрите кнопу во вложении. Макрос Елены изящен, а мой изначально был избыточен по количеству действий. Однако мой, наверно, легче перестроить под новые условия задачи.

[vba]
Код
Sub Rio_Deployment2()

Dim X&, A&, StrX$, ArrX: StrX = Cells(1, 1).Value

For X = 1 To Len(StrX)
     If Mid(StrX, X, 1) = "," Then A = A + 1
Next X

ArrX = Split(StrX, ", ")
Rows("2:" & A + 1).Insert

For X = 0 To A
     Cells(1 + X, 1).Value = ArrX(X)
Next X

End Sub
[/vba]

Автор - Rioran
Дата добавления - 14.11.2014 в 11:17
VAlxB Дата: Пятница, 14.11.2014, 11:25 | Сообщение № 7
Группа: Пользователи
Ранг: Прохожий
Сообщений: 8
Репутация: 0 ±
Замечаний: 60% ±

Excel 2013
Rioran,

блестяще!!

Именно то, что нужно!

Макрос Елены (Pelena) я очень оценил. Буду знать, что можно так элегантно решать подобные задачи.
 
Ответить
СообщениеRioran,

блестяще!!

Именно то, что нужно!

Макрос Елены (Pelena) я очень оценил. Буду знать, что можно так элегантно решать подобные задачи.

Автор - VAlxB
Дата добавления - 14.11.2014 в 11:25
Pelena Дата: Пятница, 14.11.2014, 12:01 | Сообщение № 8
Группа: Админы
Ранг: Местный житель
Сообщений: 19195
Репутация: 4423 ±
Замечаний: ±

Excel 365 & Mac Excel
мой легче перестроить под новые условия задачи

Да и мой не сложно)
[vba]
Код
Public Sub Spl()
     Dim x
     x = Split(ActiveCell.Value, ",")
     If Len(ActiveCell.Value) Then
         Rows(ActiveCell.Row).Offset(1, 0).Resize(UBound(x), 1).Insert Shift:=xlShiftDown, CopyOrigin:=xlFormatFromRightOrBelow
         Range(ActiveCell.Address).Resize(UBound(x) + 1, 1).Value = WorksheetFunction.Transpose(x)
     End If
End Sub
[/vba]


"Черт возьми, Холмс! Но как??!!"
Ю-money 41001765434816
 
Ответить
Сообщение
мой легче перестроить под новые условия задачи

Да и мой не сложно)
[vba]
Код
Public Sub Spl()
     Dim x
     x = Split(ActiveCell.Value, ",")
     If Len(ActiveCell.Value) Then
         Rows(ActiveCell.Row).Offset(1, 0).Resize(UBound(x), 1).Insert Shift:=xlShiftDown, CopyOrigin:=xlFormatFromRightOrBelow
         Range(ActiveCell.Address).Resize(UBound(x) + 1, 1).Value = WorksheetFunction.Transpose(x)
     End If
End Sub
[/vba]

Автор - Pelena
Дата добавления - 14.11.2014 в 12:01
VAlxB Дата: Пятница, 14.11.2014, 12:40 | Сообщение № 9
Группа: Пользователи
Ранг: Прохожий
Сообщений: 8
Репутация: 0 ±
Замечаний: 60% ±

Excel 2013
Pelena,

большое спасибо и за ваш вариант!

Только вот попробовал я вставить макросы в нужный мне файл и получил ошибки.

В случае нового варианта Елены не строки вставляются, а переписываются,
а вариант Rioran выдает ошибку.

См. прилагаемый файл.

Ну и попутно - хорошо бы обработать сразу все (или только выделенные) строки с запятыми в файле. :)
К сообщению приложен файл: Text2Lines_v3.xlsm (18.2 Kb)
 
Ответить
СообщениеPelena,

большое спасибо и за ваш вариант!

Только вот попробовал я вставить макросы в нужный мне файл и получил ошибки.

В случае нового варианта Елены не строки вставляются, а переписываются,
а вариант Rioran выдает ошибку.

См. прилагаемый файл.

Ну и попутно - хорошо бы обработать сразу все (или только выделенные) строки с запятыми в файле. :)

Автор - VAlxB
Дата добавления - 14.11.2014 в 12:40
Pelena Дата: Пятница, 14.11.2014, 13:08 | Сообщение № 10
Группа: Админы
Ранг: Местный житель
Сообщений: 19195
Репутация: 4423 ±
Замечаний: ±

Excel 365 & Mac Excel
Чтобы не переписывались, надо эту строчку
[vba]
Код
Rows(ActiveCell.Row).Offset(1, 0).Resize(UBound(x), 1).Insert Shift:=xlShiftDown, CopyOrigin:=xlFormatFromRightOrBelow
[/vba]
заменить на
[vba]
Код
Rows(ActiveCell.Row).Offset(1, 0).Resize(UBound(x)).Insert Shift:=xlShiftDown, CopyOrigin:=xlFormatFromRightOrBelow
[/vba]


"Черт возьми, Холмс! Но как??!!"
Ю-money 41001765434816
 
Ответить
СообщениеЧтобы не переписывались, надо эту строчку
[vba]
Код
Rows(ActiveCell.Row).Offset(1, 0).Resize(UBound(x), 1).Insert Shift:=xlShiftDown, CopyOrigin:=xlFormatFromRightOrBelow
[/vba]
заменить на
[vba]
Код
Rows(ActiveCell.Row).Offset(1, 0).Resize(UBound(x)).Insert Shift:=xlShiftDown, CopyOrigin:=xlFormatFromRightOrBelow
[/vba]

Автор - Pelena
Дата добавления - 14.11.2014 в 13:08
Pelena Дата: Пятница, 14.11.2014, 13:34 | Сообщение № 11
Группа: Админы
Ранг: Местный житель
Сообщений: 19195
Репутация: 4423 ±
Замечаний: ±

Excel 365 & Mac Excel
Для обработки нескольких выделенных ячеек в столбце
[vba]
Код
Public Sub Spl()
     Dim x, n&, i&
     If Selection.Columns.Count > 1 Then Exit Sub
     n& = Selection.Rows.Count
     For i = n To 1 Step -1
         With Selection(i)
             x = Split(.Value, ",")
             If Len(.Value) And UBound(x) Then
                 Rows(.Row).Offset(1, 0).Resize(UBound(x)).Insert Shift:=xlShiftDown, CopyOrigin:=xlFormatFromRightOrBelow
                 Range(.Address).Resize(UBound(x) + 1, 1).Value = WorksheetFunction.Transpose(x)
             End If
         End With
     Next
End Sub
[/vba]


"Черт возьми, Холмс! Но как??!!"
Ю-money 41001765434816
 
Ответить
СообщениеДля обработки нескольких выделенных ячеек в столбце
[vba]
Код
Public Sub Spl()
     Dim x, n&, i&
     If Selection.Columns.Count > 1 Then Exit Sub
     n& = Selection.Rows.Count
     For i = n To 1 Step -1
         With Selection(i)
             x = Split(.Value, ",")
             If Len(.Value) And UBound(x) Then
                 Rows(.Row).Offset(1, 0).Resize(UBound(x)).Insert Shift:=xlShiftDown, CopyOrigin:=xlFormatFromRightOrBelow
                 Range(.Address).Resize(UBound(x) + 1, 1).Value = WorksheetFunction.Transpose(x)
             End If
         End With
     Next
End Sub
[/vba]

Автор - Pelena
Дата добавления - 14.11.2014 в 13:34
VAlxB Дата: Пятница, 14.11.2014, 14:57 | Сообщение № 12
Группа: Пользователи
Ранг: Прохожий
Сообщений: 8
Репутация: 0 ±
Замечаний: 60% ±

Excel 2013
Pelena,

изумительно лаконично и эффективно!!! Мастерство!!!

Правда есть небольшая странность - строки 9 и 11 не обрабатываются (не в номерах строк дело).

И еще просьба сделать небольшой дополнительный штрих - во вновь создаваемых строках заполнить непустые колонки аналогичными исходным значениями.

Пример в прилагаемом файле, лист "Пример результата".

В любом случае, ОГРОМНОЕ СПАСИБО!
К сообщению приложен файл: Text2Lines_3h.xlsm (22.5 Kb)
 
Ответить
СообщениеPelena,

изумительно лаконично и эффективно!!! Мастерство!!!

Правда есть небольшая странность - строки 9 и 11 не обрабатываются (не в номерах строк дело).

И еще просьба сделать небольшой дополнительный штрих - во вновь создаваемых строках заполнить непустые колонки аналогичными исходным значениями.

Пример в прилагаемом файле, лист "Пример результата".

В любом случае, ОГРОМНОЕ СПАСИБО!

Автор - VAlxB
Дата добавления - 14.11.2014 в 14:57
krosav4ig Дата: Пятница, 14.11.2014, 15:20 | Сообщение № 13
Группа: Друзья
Ранг: Старожил
Сообщений: 2347
Репутация: 989 ±
Замечаний: 0% ±

Excel 2007,2010,2013
немного по-еврейски :)
[vba]
Код
Sub sdf()
       Dim cell As Range, arr As Variant
       If Selection.Columns.Count > 1 Then Exit Sub
       With Application: .ScreenUpdating = 0: .EnableEvents = 0
           With CreateObject("new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")
               For Each cell In Selection
                   arr = Split(cell, ", ")
                   If UBound(arr) * Len(cell) Then
                       cell.EntireRow.Offset(1).Resize(UBound(arr)).Insert
                       cell.EntireRow.Copy cell.EntireRow.Offset(1).Resize(UBound(arr))
                       .SetText Replace(Trim(cell), ", ", Chr(10)): .PutInClipboard
                       cell.PasteSpecial xlPasteAll
                   End If
                   Next
           End With
       .ScreenUpdating = 1: .EnableEvents = 1: End With
End Sub
[/vba]


email:krosav4ig26@gmail.com WMR R207627035142 WMZ Z821145374535 ЯД 410012026478460

Сообщение отредактировал krosav4ig - Пятница, 14.11.2014, 15:22
 
Ответить
Сообщениенемного по-еврейски :)
[vba]
Код
Sub sdf()
       Dim cell As Range, arr As Variant
       If Selection.Columns.Count > 1 Then Exit Sub
       With Application: .ScreenUpdating = 0: .EnableEvents = 0
           With CreateObject("new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")
               For Each cell In Selection
                   arr = Split(cell, ", ")
                   If UBound(arr) * Len(cell) Then
                       cell.EntireRow.Offset(1).Resize(UBound(arr)).Insert
                       cell.EntireRow.Copy cell.EntireRow.Offset(1).Resize(UBound(arr))
                       .SetText Replace(Trim(cell), ", ", Chr(10)): .PutInClipboard
                       cell.PasteSpecial xlPasteAll
                   End If
                   Next
           End With
       .ScreenUpdating = 1: .EnableEvents = 1: End With
End Sub
[/vba]

Автор - krosav4ig
Дата добавления - 14.11.2014 в 15:20
VAlxB Дата: Пятница, 14.11.2014, 15:53 | Сообщение № 14
Группа: Пользователи
Ранг: Прохожий
Сообщений: 8
Репутация: 0 ±
Замечаний: 60% ±

Excel 2013
krosav4ig,

спасибо за реализацию заполнения соседних столбцов!!

Но макрос иногда работает нормально, иногда выдает разные ошибки типа "Метод PasteSpecial из класса Range завершен неверно" и другие.

И опять же не все строки обрабатываются почему-то.

Прилагаю файл, попробуйте выбирать разное число ячеек (с запятыми).

Но за внимание и реализацию - THANX!
К сообщению приложен файл: Text2Lines_v5b.xlsm (18.9 Kb)
 
Ответить
Сообщениеkrosav4ig,

спасибо за реализацию заполнения соседних столбцов!!

Но макрос иногда работает нормально, иногда выдает разные ошибки типа "Метод PasteSpecial из класса Range завершен неверно" и другие.

И опять же не все строки обрабатываются почему-то.

Прилагаю файл, попробуйте выбирать разное число ячеек (с запятыми).

Но за внимание и реализацию - THANX!

Автор - VAlxB
Дата добавления - 14.11.2014 в 15:53
Pelena Дата: Пятница, 14.11.2014, 15:59 | Сообщение № 15
Группа: Админы
Ранг: Местный житель
Сообщений: 19195
Репутация: 4423 ±
Замечаний: ±

Excel 365 & Mac Excel
Так проверьте (подсмотрела немного у krosav4ig'а)
[vba]
Код
Public Sub Spl()
     Dim x, n&, i&
     If Selection.Columns.Count > 1 Then Exit Sub
     Application.ScreenUpdating = 0
     n& = Selection.Rows.Count
     For i = n To 0 Step -1
         With Selection(i)
             x = Split(.Value, ",")
             If Len(.Value) * UBound(x) Then
                 Rows(.Row).Offset(1, 0).Resize(UBound(x)).Insert Shift:=xlShiftDown, CopyOrigin:=xlFormatFromRightOrBelow
                 .EntireRow.Copy Rows(.Row).Offset(1, 0).Resize(UBound(x))
                 Range(.Address).Resize(UBound(x) + 1, 1).Value = WorksheetFunction.Transpose(x)
             End If
         End With
     Next
     Application.ScreenUpdating = 1
End Sub
[/vba]


"Черт возьми, Холмс! Но как??!!"
Ю-money 41001765434816
 
Ответить
СообщениеТак проверьте (подсмотрела немного у krosav4ig'а)
[vba]
Код
Public Sub Spl()
     Dim x, n&, i&
     If Selection.Columns.Count > 1 Then Exit Sub
     Application.ScreenUpdating = 0
     n& = Selection.Rows.Count
     For i = n To 0 Step -1
         With Selection(i)
             x = Split(.Value, ",")
             If Len(.Value) * UBound(x) Then
                 Rows(.Row).Offset(1, 0).Resize(UBound(x)).Insert Shift:=xlShiftDown, CopyOrigin:=xlFormatFromRightOrBelow
                 .EntireRow.Copy Rows(.Row).Offset(1, 0).Resize(UBound(x))
                 Range(.Address).Resize(UBound(x) + 1, 1).Value = WorksheetFunction.Transpose(x)
             End If
         End With
     Next
     Application.ScreenUpdating = 1
End Sub
[/vba]

Автор - Pelena
Дата добавления - 14.11.2014 в 15:59
VAlxB Дата: Пятница, 14.11.2014, 17:03 | Сообщение № 16
Группа: Пользователи
Ранг: Прохожий
Сообщений: 8
Репутация: 0 ±
Замечаний: 60% ±

Excel 2013
Pelena,

вот этот последний вариант прекрасно отработал у меня довольно большой и сложный файл без всяких ошибок (во всяком случае пока их не заметил).

СУПЕР!!!

Очень признателен!!!
 
Ответить
СообщениеPelena,

вот этот последний вариант прекрасно отработал у меня довольно большой и сложный файл без всяких ошибок (во всяком случае пока их не заметил).

СУПЕР!!!

Очень признателен!!!

Автор - VAlxB
Дата добавления - 14.11.2014 в 17:03
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Трансформ текста ячейки в строки (Макросы/Sub)
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!