Страницы: 1
RSS
Упорядочивание столбцов запроса в порядке, указанном в переменной
 
Привет!
Есть задача: нужно упорядочить столбцы в порядке, который указан в ячейке листа Excel. Но при передаче значения в Table.ReorderColumns переменная воспринимается как одно строчное значение.
Танцы с бубном на костылях ничего не дали, преобразование внутри ReorderColumns превращает строковое значение в функциональное и всё равно его не кушает.
Изменено: Александр Юдин - 15.12.2021 13:50:47
 
К сожалению с умными таблицами плохо знаком. Если преобразовать в диапазон то все просто
Код
Sub enstaralлрл()
    Application.AddCustomList ListArray:=Array("A1", "A2", "A3", "A4", "B1", "B2", "B3" _
        , "B4", "C1", "C2", "C3", "C4")
    Range("A1").Sort Key1:=Range("A1"), Order1:=xlAscending, Header:=xlGuess _
        , OrderCustom:=Application.CustomListCount + 1, MatchCase:=False, Orientation:=xlLeftToRight, _
        DataOption1:=xlSortNormal
Application.DeleteCustomList ListNum:=Application.CustomListCount
End Sub
Изменено: Евгений Смирнов - 15.12.2021 15:08:08
 
Код
Option Explicit

Sub SortListObjectByCellValue()
    SortListObject ActiveSheet.ListObjects("Таблица1"), Range("Q1")
End Sub

Sub SortListObject(lo As ListObject, sortString As String)
    
    sortString = Replace(sortString, " ", "")
    Dim arr As Variant
    Dim brr As Variant
    arr = Split(sortString, ",")
    
    Dim wb As Workbook
    Set wb = Workbooks.Add(1)
    With wb.Sheets(1)
        .Cells(1, 2).Resize(1, UBound(arr) + 1) = arr
        arr = Application.Transpose(lo.Range)
        .Cells(2, 2).Resize(UBound(arr, 1), UBound(arr, 2)) = arr
        With .Cells(2, 1).Resize(UBound(arr, 1), 1)
            .FormulaR1C1 = "=IFERROR(MATCH(RC[1],R1,0),ROW()-1)"
            .Calculate
            brr = .Value
            .Value = brr
            Erase brr
        End With
        With .Sort
            .SortFields.Clear
            .SortFields.Add Key:=.Parent.Cells(2, 1).Resize(UBound(arr, 1), 1), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
            .SetRange .Parent.Cells(2, 1).Resize(UBound(arr, 1), UBound(arr, 2) + 1)
            .Header = xlGuess
            .MatchCase = False
            .Orientation = xlTopToBottom
            .SortMethod = xlPinYin
            .Apply
        End With
        brr = Application.Transpose(.Cells(2, 3).Resize(UBound(arr, 1), UBound(arr, 2) - 1))
        arr = Application.Transpose(.Cells(2, 2).Resize(UBound(arr, 1), 1))
    End With
    
    wb.Close False
    
    lo.DataBodyRange = brr
    lo.HeaderRowRange = arr
End Sub
 
,   нужно переупорядочить столбцы именно в запросе PowerQuery `:)
 
Цитата
Александр Юдин написал:
в запросе PowerQuery
А где это написано было?
Тоже написал макрос.
Код
Sub Макрос8()
Dim arr1 As Variant, arr2 As Variant, arr3 As Variant, arr4 As Variant
Dim n As Long, m As Long, i As Long
Set tabb = Worksheets("Лист1 (2)").ListObjects("Таблица18")
arr1 = tabb.Range
arr2 = Split(Range("Q1"), ", ")
ReDim arr3(LBound(arr1) To UBound(arr1) - 1, LBound(arr1, 2) To UBound(arr1, 2))
ReDim arr4(1 To 1, LBound(arr1, 2) To UBound(arr1, 2))
For n = LBound(arr2) To UBound(arr2)
    For m = LBound(arr1, 2) To UBound(arr1, 2)
        If arr2(n) = arr1(1, m) Then
        arr4(1, n + 1) = arr1(1, m)
            arr1(1, m) = ""
            For i = LBound(arr3) To UBound(arr3)
                arr3(i, n + 1) = arr1(i + 1, m)
            Next i
        End If
    Next m
Next n
For m = LBound(arr1, 2) To UBound(arr1, 2)
    If Not arr1(1, m) = "" Then
        arr4(1, n + 1) = arr1(1, m)
        For i = LBound(arr3) To UBound(arr3)
            arr3(i, n + 1) = arr1(i + 1, m)
        Next i
        n = n + 1
    End If
Next m
tabb.DataBodyRange = arr3
tabb.HeaderRowRange = arr4
End Sub
Изменено: Msi2102 - 15.12.2021 15:57:45
 
Код
let

    colStructИсточник = Excel.CurrentWorkbook(){[Name="stuct"]}[Content],
    #"colStructЗамененное значение" = Table.ReplaceValue(colStructИсточник," ","",Replacer.ReplaceText,{"Column1"}),
    #"colStructРазделить столбец по разделителю" = Table.ExpandListColumn(Table.TransformColumns(#"colStructЗамененное значение", {{"Column1", Splitter.SplitTextByDelimiter(",", QuoteStyle.Csv)}}), "Column1"),



    Источник = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],
    #"Измененный тип" = Table.TransformColumnTypes(Источник,{{"letters", type text}, {"A1", type any}, {"B4", type any}, {"C3", type any}, {"A2", type any}, {"A4", type any}, {"C1", type any}, {"C2", type any}, {"B3", type any}, {"A3", type any}, {"C4", type any}, {"B1", type any}, {"B2", type any}, {"lVal", type any}, {"avgVal", type any}}),
    #"Другие удаленные столбцы" = Table.SelectColumns(#"Измененный тип",#"colStructРазделить столбец по разделителю"[Column1])
in
    #"Другие удаленные столбцы"
 
Круто ребята 3 макроса есть, а надо запросы писать, но ладно я почти макрорекордером обошелся. :)
Было бы побольше таких авторов, уже бы половина пользователей форума макросы умела писать
Изменено: Евгений Смирнов - 15.12.2021 16:25:08
 
Или так попробуйте
Код
let
    Источник = Excel.CurrentWorkbook(){[Name="Таблица18"]}[Content],
    Переупоряд = Table.ReorderColumns(Источник,List.Union({{"A1", "A2", "A3", "A4", "B1", "B2", "B3", "B4", "C1", "C2", "C3", "C4"}, Table.ColumnNames(Источник)}))
in
    Переупоряд
 
Не стал особо мудрить:
Код
let
    colStruct = Text.From(Excel.CurrentWorkbook(){[Name = "stuct"]}[Content]{0}[Column1]),
    Источник = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],
    new_order = Table.ReorderColumns(Источник,List.Union({Text.Split(colStruct,", "), Table.ColumnNames(Источник)}))
in
    new_order
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Страницы: 1
Наверх