Страницы: 1
RSS
Перенос данных из ячейки в строки и с копированием строк.
 
Добрый день, уважаемые друзья! Прошу Вашей помощи в решении проблемы.
Имеется таблица с данными. В некоторых ячейках имеются данные, которые необходимо разбить на строки, при этом необходимо добавить в созданные строки данные из предыдущих срок. Пример во вложении.
 
Код
Sub RazdelRow()
Dim i As Long
Dim iLastRow As Long
Dim n As Integer
Dim arr
 iLastRow = Cells(Rows.Count, "A").End(xlUp).Row
   For i = iLastRow To 2 Step -1
     If InStr(1, Cells(i, "C"), ";") <> 0 Then
       arr = Split(Cells(i, "C"), ";")
     End If
     If InStr(1, Cells(i, "C"), ",") <> 0 Then
       arr = Split(Cells(i, "C"), ",")
     End If
       For n = UBound(arr) To 0 Step -1         'вставляем с конца массива  arr
         Rows(i + 1).Insert
         Cells(i + 1, "C") = arr(n)
         Range("A" & i & ":B" & i).Copy Range("A" & i + 1)
         Range("D" & i).Copy Range("D" & i + 1)
       Next
         Rows(i).Delete
   Next
End Sub
 
Еще вариант:

Код
Sub ПереносСтрок()Dim i, rngTarget As Range
Dim newString As String

Set rngTarget = Range("F11")
For i = Cells(2, 1).Row To Cells(2, 1).CurrentRegion.Rows.Count
    
    newString = Left(Cells(i, 3), 3)
    
    rngTarget = Cells(i, 1).Value
    rngTarget.Offset(0, 1) = Cells(i, 2).Value
    rngTarget.Offset(0, 2) = newString
    rngTarget.Offset(0, 3) = Cells(i, 4).Value
    
    Set rngTarget = rngTarget.Offset(1, 0)
    
    newString = Mid(Cells(i, 3), 6, 3)
    
    rngTarget = Cells(i, 1).Value
    rngTarget.Offset(0, 1) = Cells(i, 2).Value
    rngTarget.Offset(0, 2) = newString
    rngTarget.Offset(0, 3) = Cells(i, 4).Value
    
    Set rngTarget = rngTarget.Offset(1, 0)
    
    newString = Right(Cells(i, 3), 3)
    
    rngTarget = Cells(i, 1).Value
    rngTarget.Offset(0, 1) = Cells(i, 2).Value
    rngTarget.Offset(0, 2) = newString
    rngTarget.Offset(0, 3) = Cells(i, 4).Value
    
    Set rngTarget = rngTarget.Offset(1, 0)

Next i
Изменено: artemkau88 - 04.04.2021 14:53:19
 
ny12, еще вариант
Код
Sub mrshkei()
Dim arr, arr2, i As Long, n As Long, j As Long, lr As Long
lr = Cells(Rows.Count, 1).End(xlUp).Row
arr = Range("A2:D" & lr): ReDim arr3(1 To lr * 10, 1 To 4): k = 1
For i = LBound(arr) To UBound(arr)
    arr2 = Split(arr(i, 3), ";")
    If UBound(arr2) = 0 Then arr2 = Split(arr(i, 3), ",")
    If UBound(arr2) = 0 Then
        For j = 1 To 4
            arr3(k, j) = Trim(arr(i, j))
        Next j
        k = k + 1
    Else
        For n = LBound(arr2) To UBound(arr2)
            arr3(k, 1) = arr(i, 1)
            arr3(k, 2) = arr(i, 2)
            arr3(k, 3) = Trim(arr2(n))
            arr3(k, 4) = arr(i, 4)
            k = k + 1
        Next n
    End If
Next i
Range("A2").Resize(UBound(arr3), 4) = arr3
End Sub
Не бойтесь совершенства. Вам его не достичь.
 
Друзья, всем огромное спасибо! Все встало как родное, все работает!  
 
ny12, еще вариант
Код
Sub RazdelRow1(): Dim vTp1, vTp2, TP, Rm1&, i&, j&, n&
    vTp1 = Cells(1).CurrentRegion
vTp1 = Application.WorksheetFunction.Transpose(vTp1)
    Rm1 = UBound(vTp1): n = 1: vTp2 = vTp1
For i = 1 To UBound(vTp1, 2)
    TP = Split(vTp1(3, i), ",")
If UBound(TP) = 0 Then TP = Split(vTp1(3, i), ";")
ReDim Preserve vTp2(1 To Rm1, 1 To n + UBound(TP))
    For k = 0 To UBound(TP)
        For j = 1 To Rm1
If j = 3 Then vTp2(j, n) = TP(k) Else vTp2(j, n) = vTp1(j, i)
        Next j
    n = n + 1
    Next k
Next i
[F1].Resize(UBound(vTp2, 2), UBound(vTp2, 1)) = Application.WorksheetFunction.Transpose(vTp2)
End Sub
 
вариант
1. замена "," на ";";
2. разделение на строки

вот и весь секрет. ок. двух минут
Страницы: 1
Наверх