排序多列excel VBA

ifmq2ha2  于 2022-12-14  发布在  其他
关注(0)|答案(5)|浏览(208)

这是我密码

Sub SortMultipleColumns(myline As String)

    With Worksheets("Result-Inactive").Sort
        .SortFields.Add Key:=Range("A1"), Order:=xlAscending
        .SortFields.Add Key:=Range("D1"), Order:=xlAscending
        .SortFields.Add Key:=Range("J1"), Order:=xlAscending
        .SetRange Range("A1:C" & myline)
        .Header = xlYes
        .Apply
    End With

End Sub

我得到以下错误,我不明白为什么“运行时错误'1004'排序引用无效。请确保它在您要排序的日期内,然后第一个排序依据框不相同或为空。当我单击调试时,.apply被突出显示
有什么建议吗?

yfjy0ee7

yfjy0ee71#

这里只是重申Jeeped的回答,但略有不同:
1)myline实际上应定义为Long或Integer
2)使用Key:=Range("A1")声明的范围应定义为同一工作表
3)DJ的键在.setRange之外,同样,.setRange也应该定义为在同一工作表上
我坚持使用您的代码,但将ws工作表定义添加到所有范围,并将设置范围更改为最多包含J

Sub SortMultipleColumns(myline As Long)

Dim ws As Worksheet: Set ws = ThisWorkbook.Worksheets("Result-Inactive")

    With ws.Sort
        .SortFields.Clear
        .SortFields.Add Key:=ws.Range("A1"), Order:=xlAscending
        .SortFields.Add Key:=ws.Range("D1"), Order:=xlAscending
        .SortFields.Add Key:=ws.Range("J1"), Order:=xlAscending
        .SetRange ws.Range("A1:J" & myline)
        .Header = xlYes
        .Apply
    End With

End Sub

我假设myline在那里,因为有时你只想排序一个数据区域的顶部集合。我还添加了一行到clear的所有排序域,以防你在这个工作表上运行许多不同的排序器。

tzxcd3kk

tzxcd3kk2#

您试图将D列和J列作为辅助排序条件,但将它们从排序区域中排除。另外,Range("xn")不一定属于Result-Inactive工作表,如果不将其合成为.Range("xn")。请尝试使用其他VBA排序方法,而不要使用“宏”记录器生成的方法。

Sub SortMultipleColumns()

    With Worksheets("Result-Inactive")
        with .cells(1, "A").currentregion
            .Cells.Sort Key1:=.Range("A1"), Order1:=xlAscending, _
                        Key2:=.Range("D1"), Order2:=xlAscending, _
                        Key3:=.Range("J1"), Order3:=xlAscending, _
                        Orientation:=xlTopToBottom, Header:=xlYes
        end with
    End With

End Sub
u0njafvf

u0njafvf3#

试试这个:

Sub SortingColumnsInRange
    ' Selecting range
    Range("A:X").Select

    ' Sort column C, after column N and after column P
    Selection.Columns.Sort key1:=Columns("C"), Order1:=xlAscending, Key2:=Columns("N"), Order2:=xlAscending, key3:=Columns("P"), Order3:=xlAscending, Header:=xlYes
End Sub
g9icjywg

g9icjywg4#

选择范围Range(“A:X”)。选择

' Sort column C, after column N and after column P
Selection.Columns.Sort key1:=Columns("C"), Order1:=xlAscending, Key2:=Columns("N"), Order2:=xlAscending, key3:=Columns("P"), Order3:=xlAscending, Header:=xlYes

结束子组件

cbeh67ev

cbeh67ev5#

将您的数据转换成表格,然后使用vba,使用listObjects使用工作表找到我的表格。然后我找到列1、2和3的索引。然后我使用表格区域和列索引添加SortFields。
这不起作用:

Set data_table = MyWorksheet.ListObjects("Tbl_Name")
   column1_index = data_table.ListColumns("Column 1").index
   column2_index = data_table.ListColumns("Column 2").index
   column3_index = data_table.ListColumns("Column 3").index
        
   With data_table.Sort
            .SortFields.Add Key:=data_table.Range(column1_index), Order:=xlAscending
            .SortFields.Add Key:=data_table.Range(column2_index), Order:=xlAscending
            .SortFields.Add Key:=data_table.Range(column3_index), Order:=xlDescending
            .Header = xlYes
            .Apply
        End With

这是可行的:

ProbabilitiesWorksheet.Range("B5").Sort Key1:=Range("F5"), Order1:=xlAscending, Header:=xlYes
        ProbabilitiesWorksheet.Range("B5").Sort Key1:=Range("D5"), Order1:=xlDescending, Header:=xlYes
        ProbabilitiesWorksheet.Range("B5").Sort Key1:=Range("C5"), Order1:=xlAscending, Header:=xlYes

相关问题