Страницы: 1
RSS
Макрос транспонирования массива
 
Добрый день, Уважаемые форумчане! Поделитесь опытом пожалуйста, есть ли макрос позволяющий  транспонировать выделенный массив  как в примере во вложении?
 
Код
Sub Button1_Click()
    arr = [A2:F4]
    arrd = [A8].Resize(1000000, 3).Value
    cr = 1
    For i = 2 To UBound(arr)
        For j = 2 To UBound(arr, 2)
            arrd(cr, 1) = arr(i, 1)
            arrd(cr, 2) = arr(1, j)
            arrd(cr, 3) = 1 * arr(i, j)
            cr = cr + 1
        Next
    Next
    If cr > 1 Then [A8].Resize(cr - 1, 3) = arrd
End Sub
 
А если так с PQ.
Код
let
    Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"Было", type text}, {"Column1", type any}, {"Column2", type any}, {"Column3", type text}, {"Column4", type any}, {"Column5", type any}}),
    #"Promoted Headers" = Table.PromoteHeaders(#"Changed Type", [PromoteAllScalars=true]),
    #"Unpivoted Other Columns" = Table.UnpivotOtherColumns(#"Promoted Headers", {"Месяц"}, "Attribute", "Value")
in
    #"Unpivoted Other Columns"
 
skais675 ,все работает, но этот макрос можно сделать универсальным на будущее, чтобы он допустим преобразовывал активный выделенный диапазон по такому же принципу, но на новый лист ?

jakim, да это тоже как вариант, но с макросом побыстрее, на будущее вариант с PQ тоже пригодится
 
Цитата
MorsSvejiy написал:
преобразовывал активный выделенный диапазон по такому же принципу, но на новый лист
Код
Sub MrShkei()
xx = Now
Dim rng As Range, lr As Long, lcol As Long, i As Long, n As Long, arr, arr2
Set rng = Selection
lr = rng.Rows.Count: lcol = rng.Columns.Count
If lr < 2 Then MsgBox "Выделите больше одной строки": Exit Sub
If lcol < 2 Then MsgBox "Выделите больше одного столбца": Exit Sub
arr = rng
ReDim arr2(1 To (lr - 1) * (lcol - 1), 1 To 3): k = 1
For i = LBound(arr) + 1 To UBound(arr)
    For n = 2 To lcol
        arr2(k, 1) = arr(i, 1)
        arr2(k, 2) = arr(1, n)
        If arr(i, n) = Empty Then
            arr2(k, 3) = 0
        Else
            arr2(k, 3) = arr(i, n)
        End If
        k = k + 1
    Next n
Next i
Dim sh As Worksheet
Worksheets.Add
Set sh = ActiveSheet
sh.Name = Replace(Now, ":", "-")
sh.Cells(1, 1).Resize(UBound(arr2), 3) = arr2
End Sub
Изменено: Mershik - 05.11.2021 21:33:42
Не бойтесь совершенства. Вам его не достичь.
 
Mershik, то что нужно, все работает хорошо. Спасибо Всем !Благодаря Вам и этому форуму мир становится лучше))  
Страницы: 1
Читают тему (гостей: 1)
Наверх