Страницы: 1
RSS
Транспонирование массива строк в столбцы и последующее удаление строк (VBA)
 
Привет!
Прошу помочь написать макрос, который будет транспонировать определенный массив строк в столбцы (на одну строчку выше первой строки), а затем удалит исходные строки. Таким образом получится сильно сжать количество строк и это упростит анализ

Ситуация осложняется тем, что массив для транспонирования не всегда одинаковый (где то 4 строки, где то 3 или меньше)
В приложенном файле есть листы "Исходная" и "Как должно быть". Всего получится 10 строк, это для примера. Масштабировать макрос буду на 1000+ строк
 
Цитата
Alex_M2020 написал:
Прошу помочь написать макрос
А что не получается, в чем требуется помощь, где попытки, что то сделать? Я вижу файл, в котором арпиори макросов не может быть. А если так, то и нужно писать, что нужно не помочь написать, а все сделать за вас с нуля.
"Все гениальное просто, а все простое гениально!!!"
 
Здравствуйте!
Только недавно что-то похожее делал, посмотрите, может получится адаптировать это решение для себя.
 
Код
Sub Main()
    Dim sh1 As Worksheet
    Dim sh2 As Worksheet
    Set sh1 = ThisWorkbook.Sheets(1)
    Set sh2 = ThisWorkbook.Sheets(2)
    
    Dim y As Long
    Dim a As Variant
    With sh1
        y = .Cells(.Rows.Count, 2).End(xlUp).Row
        a = .Range(.Cells(1, 1), .Cells(y, 2))
        y = WorksheetFunction.CountA(.Columns(1))
    End With
    
    If y > 0 Then
        Dim x As Integer
        Dim z As Long
        Dim b As Variant
        ReDim b(1 To y, 1 To 6)
        z = 0
        For y = 1 To UBound(a, 1)
            If Not IsEmpty(a(y, 1)) Then
                z = z + 1
                x = 2
                b(z, 1) = a(y, 1)
            End If
            b(z, x) = a(y, 2)
            x = x + 1
        Next
    End If
    
    With sh2
        .Cells.Clear
        Dim r As Range
        Set r = .Cells(1, 1).Resize(UBound(b, 1), UBound(b, 2))
        r = b
        r.WrapText = False
        r.EntireColumn.AutoFit
    End With
End Sub
 
Код
Sub main()
    Dim lrow&, i&, ikey, sarr$(), j&
    Dim arr(), txt$, objDic As Object
    Set objDic = CreateObject("scripting.dictionary")
    lrow = Range("b" & Rows.Count).End(xlUp).Row
    arr = Range("a1:b" & lrow).Value
    For i = 2 To UBound(arr)
        If Not IsEmpty(arr(i, 1)) Then
            j = j + 1
            txt = j & "|" & arr(i, 1)
        End If
        objDic.Item(txt) = objDic.Item(txt) & arr(i, 2) & "|"
    Next i
    i = 1
    For Each ikey In objDic.keys
        i = i + 1
        sarr = Split(objDic(ikey), "|")
        Range("c" & i).Value = Split(ikey, "|")(1)
        Range("d" & i).Resize(, UBound(sarr)).Value = sarr
    Next ikey
    Cells.WrapText = False
End Sub
"Все гениальное просто, а все простое гениально!!!"
 
МатросНаЗебре,в строке вашего кода
Set sh2 = ThisWorkbook.Sheets(2)
мне выдает ошибку subscript out of range

Nordheim, ваш код подошел, все работает, масштабирование прошло успешно!

Всем большое спасибо!
 
Цитата
Alex_M2020 написал:
ThisWorkbook.Sheets(2) мне выдает ошибку subscript out of range
Ожидалось, что результат выводится на второй лист, который в книге есть, как в примере.
Страницы: 1
Наверх