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

Вход

Регистрация

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

 

= Мир MS Excel/Разбиение данных с разными разделителями. - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Разбиение данных с разными разделителями. (Макросы/Sub)
Разбиение данных с разными разделителями.
VadimVV Дата: Вторник, 17.02.2015, 12:33 | Сообщение № 1
Группа: Пользователи
Ранг: Участник
Сообщений: 82
Репутация: 0 ±
Замечаний: 20% ±

Excel 2007
Коллеги, добрый день.
Есть проблема с параметрами наименований, которые идут в различном формате. Где-то через зпт, где-то через дефиз, где-то вперемежку.
Некоторыми скриптами я разбиваю данные из одной ячейки на несколько и транспонированием вставляю цифры в столбец, но это довольно затратно по времени + наименование и др параметры приходится вручную растягивать вниз.

Пример прилагаю. Есть какая-то простая возможность реализации необходимого?
К сообщению приложен файл: 9518143.xlsx (9.2 Kb)
 
Ответить
СообщениеКоллеги, добрый день.
Есть проблема с параметрами наименований, которые идут в различном формате. Где-то через зпт, где-то через дефиз, где-то вперемежку.
Некоторыми скриптами я разбиваю данные из одной ячейки на несколько и транспонированием вставляю цифры в столбец, но это довольно затратно по времени + наименование и др параметры приходится вручную растягивать вниз.

Пример прилагаю. Есть какая-то простая возможность реализации необходимого?

Автор - VadimVV
Дата добавления - 17.02.2015 в 12:33
Manyasha Дата: Вторник, 17.02.2015, 13:53 | Сообщение № 2
Группа: Модераторы
Ранг: Старожил
Сообщений: 2198
Репутация: 898 ±
Замечаний: 0% ±

Excel 2010, 2016
См. файл. Макрос работает с активной ячейкой, т. е. перед запуском нужно выбрать ячейку с исходными данными, например С2.
К сообщению приложен файл: rasdelit.xlsm (15.4 Kb)


ЯД: 410013299366744 WM: R193491431804

Сообщение отредактировал Manyasha - Вторник, 17.02.2015, 14:20
 
Ответить
СообщениеСм. файл. Макрос работает с активной ячейкой, т. е. перед запуском нужно выбрать ячейку с исходными данными, например С2.

Автор - Manyasha
Дата добавления - 17.02.2015 в 13:53
krosav4ig Дата: Вторник, 17.02.2015, 14:24 | Сообщение № 3
Группа: Друзья
Ранг: Старожил
Сообщений: 2347
Репутация: 989 ±
Замечаний: 0% ±

Excel 2007,2010,2013
спер макрос тут, немного потанцевал вокруг него с бубном
[vba]
Код
Public Sub Spl()
     Dim x, n&, i&
     Dim arr(), qwe()
     If Selection.Columns.Count > 1 Then Exit Sub
     Application.ScreenUpdating = 0
     n& = Selection.Rows.Count
     For i = n To 1 Step -1
         With Selection(i)
             x = Split(.Value, ", ")
             Dim r$: r = IIf(Application.ReferenceStyle = xlR1C1, "r", "")
             ReDim arr(0)
             Dim m&: m = 0
             For Each qq In x
                 m = m + 1
                 On Error Resume Next
                 qwe = Evaluate("row(" & Replace(qq, "-", r & ":") & IIf(InStr(1, qq, "-"), "", r & ":" & qq) & ")")
                 ReDim Preserve arr(UBound(arr) + UBound(qwe) + (m = 1))
                 For j = UBound(qwe) To 1 Step -1
                     arr(UBound(arr) - j + 1) = Application.Transpose(qwe)(UBound(qwe) - j + 1)
                 Next
             Next
             If Len(.Value) * UBound(arr) And Err.Number = 0 Then
                 Rows(.Row).Offset(1, 0).Resize(UBound(arr)).Insert Shift:=xlShiftDown, CopyOrigin:=xlFormatFromRightOrBelow
                 .EntireRow.Copy Rows(.Row).Offset(1, 0).Resize(UBound(arr))
                 Range(.Address).Resize(UBound(arr) + 1, 1).Value = WorksheetFunction.Transpose(arr)
             End If
         End With
     Next
     Application.ScreenUpdating = 1
End Sub
[/vba]
выделяете C2:C3, жмете на кнопку
К сообщению приложен файл: 9518143.xls (34.5 Kb)


email:krosav4ig26@gmail.com WMR R207627035142 WMZ Z821145374535 ЯД 410012026478460
 
Ответить
Сообщениеспер макрос тут, немного потанцевал вокруг него с бубном
[vba]
Код
Public Sub Spl()
     Dim x, n&, i&
     Dim arr(), qwe()
     If Selection.Columns.Count > 1 Then Exit Sub
     Application.ScreenUpdating = 0
     n& = Selection.Rows.Count
     For i = n To 1 Step -1
         With Selection(i)
             x = Split(.Value, ", ")
             Dim r$: r = IIf(Application.ReferenceStyle = xlR1C1, "r", "")
             ReDim arr(0)
             Dim m&: m = 0
             For Each qq In x
                 m = m + 1
                 On Error Resume Next
                 qwe = Evaluate("row(" & Replace(qq, "-", r & ":") & IIf(InStr(1, qq, "-"), "", r & ":" & qq) & ")")
                 ReDim Preserve arr(UBound(arr) + UBound(qwe) + (m = 1))
                 For j = UBound(qwe) To 1 Step -1
                     arr(UBound(arr) - j + 1) = Application.Transpose(qwe)(UBound(qwe) - j + 1)
                 Next
             Next
             If Len(.Value) * UBound(arr) And Err.Number = 0 Then
                 Rows(.Row).Offset(1, 0).Resize(UBound(arr)).Insert Shift:=xlShiftDown, CopyOrigin:=xlFormatFromRightOrBelow
                 .EntireRow.Copy Rows(.Row).Offset(1, 0).Resize(UBound(arr))
                 Range(.Address).Resize(UBound(arr) + 1, 1).Value = WorksheetFunction.Transpose(arr)
             End If
         End With
     Next
     Application.ScreenUpdating = 1
End Sub
[/vba]
выделяете C2:C3, жмете на кнопку

Автор - krosav4ig
Дата добавления - 17.02.2015 в 14:24
VadimVV Дата: Вторник, 17.02.2015, 15:16 | Сообщение № 4
Группа: Пользователи
Ранг: Участник
Сообщений: 82
Репутация: 0 ±
Замечаний: 20% ±

Excel 2007
Последний макрос работает, но, почему-то не хочет разделять некоторые данные.
В моей исходной таблице порядка тысячи строк с таким форматом данных. Вот часть данных макрос верно обрабатывает, а часть - не обрабатывает вовсе.

Пример прилагаю.
Но интересность ещё в том, что если я вообще перенесу эти данные в новый файл, то макрос работает.
К сообщению приложен файл: 5666559.xls (39.5 Kb)
 
Ответить
СообщениеПоследний макрос работает, но, почему-то не хочет разделять некоторые данные.
В моей исходной таблице порядка тысячи строк с таким форматом данных. Вот часть данных макрос верно обрабатывает, а часть - не обрабатывает вовсе.

Пример прилагаю.
Но интересность ещё в том, что если я вообще перенесу эти данные в новый файл, то макрос работает.

Автор - VadimVV
Дата добавления - 17.02.2015 в 15:16
VadimVV Дата: Вторник, 17.02.2015, 16:14 | Сообщение № 5
Группа: Пользователи
Ранг: Участник
Сообщений: 82
Репутация: 0 ±
Замечаний: 20% ±

Excel 2007
Видимо, дело в количестве знаков в ячейке, но не могу разобраться, как этот параметр изменить
 
Ответить
СообщениеВидимо, дело в количестве знаков в ячейке, но не могу разобраться, как этот параметр изменить

Автор - VadimVV
Дата добавления - 17.02.2015 в 16:14
krosav4ig Дата: Вторник, 17.02.2015, 16:23 | Сообщение № 6
Группа: Друзья
Ранг: Старожил
Сообщений: 2347
Репутация: 989 ±
Замечаний: 0% ±

Excel 2007,2010,2013
проверяйте
[vba]
Код
Public Sub Spl()
     Dim x, n&, i&
     Dim arr(), qwe()
     If Selection.Columns.Count > 1 Then Exit Sub
     Application.ScreenUpdating = 0
     n& = Selection.Rows.Count
     For i = n To 1 Step -1
         With Selection(i)
             x = Split(.Value, ", ")
             Dim r$: r = IIf(Application.ReferenceStyle = xlR1C1, "r", "")
             ReDim arr(0)
             Dim m&: m = 0
             For Each qq In x
                 m = m + 1
                 'On Error Resume Next
                 qwe = Evaluate("row(" & r & "1:" & r & IIf(InStr(1, qq, "-"), Abs(Evaluate(qq)) + 1, 1) & ")-1+" & Split(qq, "-")(0))
                 ReDim Preserve arr(UBound(arr) + UBound(qwe) + (m = 1))
                 For j = UBound(qwe) To 1 Step -1
                     arr(UBound(arr) - j + 1) = WorksheetFunction.Transpose(qwe)(UBound(qwe) - j + 1)
                 Next
             Next
             If Len(.Value) * UBound(arr) And Err.Number = 0 Then
                 Rows(.Row).Offset(1, 0).Resize(UBound(arr)).Insert Shift:=xlShiftDown, CopyOrigin:=xlFormatFromRightOrBelow
                 .EntireRow.Copy Rows(.Row).Offset(1, 0).Resize(UBound(arr))
                 Range(.Address).Resize(UBound(arr) + 1, 1).Value = WorksheetFunction.Transpose(arr)
             End If
         End With
     Next
     Application.ScreenUpdating = 1
End Sub
[/vba]
К сообщению приложен файл: 2191136.xls (41.5 Kb)


email:krosav4ig26@gmail.com WMR R207627035142 WMZ Z821145374535 ЯД 410012026478460
 
Ответить
Сообщениепроверяйте
[vba]
Код
Public Sub Spl()
     Dim x, n&, i&
     Dim arr(), qwe()
     If Selection.Columns.Count > 1 Then Exit Sub
     Application.ScreenUpdating = 0
     n& = Selection.Rows.Count
     For i = n To 1 Step -1
         With Selection(i)
             x = Split(.Value, ", ")
             Dim r$: r = IIf(Application.ReferenceStyle = xlR1C1, "r", "")
             ReDim arr(0)
             Dim m&: m = 0
             For Each qq In x
                 m = m + 1
                 'On Error Resume Next
                 qwe = Evaluate("row(" & r & "1:" & r & IIf(InStr(1, qq, "-"), Abs(Evaluate(qq)) + 1, 1) & ")-1+" & Split(qq, "-")(0))
                 ReDim Preserve arr(UBound(arr) + UBound(qwe) + (m = 1))
                 For j = UBound(qwe) To 1 Step -1
                     arr(UBound(arr) - j + 1) = WorksheetFunction.Transpose(qwe)(UBound(qwe) - j + 1)
                 Next
             Next
             If Len(.Value) * UBound(arr) And Err.Number = 0 Then
                 Rows(.Row).Offset(1, 0).Resize(UBound(arr)).Insert Shift:=xlShiftDown, CopyOrigin:=xlFormatFromRightOrBelow
                 .EntireRow.Copy Rows(.Row).Offset(1, 0).Resize(UBound(arr))
                 Range(.Address).Resize(UBound(arr) + 1, 1).Value = WorksheetFunction.Transpose(arr)
             End If
         End With
     Next
     Application.ScreenUpdating = 1
End Sub
[/vba]

Автор - krosav4ig
Дата добавления - 17.02.2015 в 16:23
VadimVV Дата: Вторник, 17.02.2015, 16:31 | Сообщение № 7
Группа: Пользователи
Ранг: Участник
Сообщений: 82
Репутация: 0 ±
Замечаний: 20% ±

Excel 2007
По первому прибюлижению всё работает. Спасибо!
Скиньте номер мобильника в личку, отблагодарю :)


Сообщение отредактировал VadimVV - Вторник, 17.02.2015, 16:31
 
Ответить
СообщениеПо первому прибюлижению всё работает. Спасибо!
Скиньте номер мобильника в личку, отблагодарю :)

Автор - VadimVV
Дата добавления - 17.02.2015 в 16:31
VadimVV Дата: Среда, 18.02.2015, 16:28 | Сообщение № 8
Группа: Пользователи
Ранг: Участник
Сообщений: 82
Репутация: 0 ±
Замечаний: 20% ±

Excel 2007
К сожалению, лс недоступно до набора 100 сообщений.
Давайте через почту тогда
[moder]адрес я отсюда удалил, а Андрею отправил копию этого письма с адресом в личном сообщении.
 
Ответить
СообщениеК сожалению, лс недоступно до набора 100 сообщений.
Давайте через почту тогда
[moder]адрес я отсюда удалил, а Андрею отправил копию этого письма с адресом в личном сообщении.

Автор - VadimVV
Дата добавления - 18.02.2015 в 16:28
Rioran Дата: Четверг, 19.02.2015, 17:40 | Сообщение № 9
Группа: Авторы
Ранг: Ветеран
Сообщений: 903
Репутация: 290 ±
Замечаний: 0% ±

Excel 2013
Здравствуйте.

Исключительно в целях упражнения сделал свой вариант. Для любителей просматривать код замечу, что программа усложнена намеренно - её можно ускорить почти в 2 раза если пропустить промежуточный массив (из двух циклов for сделать один). Основная часть кода:

[vba]
Код
Sub Rio_Roll()

Dim ArrA
Dim ArrX As Basic_Data
Dim StrX As String
Dim RowX As Long
Dim Size As Long
Dim a As Long
Dim i As Long
Dim j As Long

a = Cells(Rows.Count, 1).End(xlUp).Row - 2
ArrA = Range(Cells(2, 1), Cells(a + 2, 6))
ReDim ArrX.Row(a)

For i = 0 To UBound(ArrX.Row)
     With ArrX.Row(i)
         .Name = ArrA(i + 1, 1)
         .Number = ArrA(i + 1, 2)
         StrX = ArrA(i + 1, 3)
         .Code = StrToArr_Convertor(StrX)
         .Amount = ArrA(i + 1, 4)
         .Growth = ArrA(i + 1, 5)
         .Date = ArrA(i + 1, 6)
         Size = Size + UBound(.Code) + 1
     End With
Next i

ReDim ArrA(Size - 1, 5)

For i = 0 To UBound(ArrX.Row)
     With ArrX.Row(i)
         For j = 0 To UBound(.Code)
             ArrA(RowX, 0) = .Name
             ArrA(RowX, 1) = .Number
             ArrA(RowX, 2) = .Code(j)
             ArrA(RowX, 3) = .Amount
             ArrA(RowX, 4) = .Growth
             ArrA(RowX, 5) = .Date
             RowX = RowX + 1
         Next j
     End With
Next i

Cells(2, 1).Resize(Size, 6).Value = ArrA

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


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

Исключительно в целях упражнения сделал свой вариант. Для любителей просматривать код замечу, что программа усложнена намеренно - её можно ускорить почти в 2 раза если пропустить промежуточный массив (из двух циклов for сделать один). Основная часть кода:

[vba]
Код
Sub Rio_Roll()

Dim ArrA
Dim ArrX As Basic_Data
Dim StrX As String
Dim RowX As Long
Dim Size As Long
Dim a As Long
Dim i As Long
Dim j As Long

a = Cells(Rows.Count, 1).End(xlUp).Row - 2
ArrA = Range(Cells(2, 1), Cells(a + 2, 6))
ReDim ArrX.Row(a)

For i = 0 To UBound(ArrX.Row)
     With ArrX.Row(i)
         .Name = ArrA(i + 1, 1)
         .Number = ArrA(i + 1, 2)
         StrX = ArrA(i + 1, 3)
         .Code = StrToArr_Convertor(StrX)
         .Amount = ArrA(i + 1, 4)
         .Growth = ArrA(i + 1, 5)
         .Date = ArrA(i + 1, 6)
         Size = Size + UBound(.Code) + 1
     End With
Next i

ReDim ArrA(Size - 1, 5)

For i = 0 To UBound(ArrX.Row)
     With ArrX.Row(i)
         For j = 0 To UBound(.Code)
             ArrA(RowX, 0) = .Name
             ArrA(RowX, 1) = .Number
             ArrA(RowX, 2) = .Code(j)
             ArrA(RowX, 3) = .Amount
             ArrA(RowX, 4) = .Growth
             ArrA(RowX, 5) = .Date
             RowX = RowX + 1
         Next j
     End With
Next i

Cells(2, 1).Resize(Size, 6).Value = ArrA

End Sub
[/vba]

Автор - Rioran
Дата добавления - 19.02.2015 в 17:40
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Разбиение данных с разными разделителями. (Макросы/Sub)
  • Страница 1 из 1
  • 1
Поиск:

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