排序多列excel VBA

时间:2018-10-03 04:25:40

标签: excel vba sorting

这是我的代码

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变得亮了

有什么建议吗?

3 个答案:

答案 0 :(得分:1)

您正在尝试将D和J列包括在内,作为次级排序条件,但将其从排序范围中排除。此外,Range("xn")不一定属于不活动结果的工作表,而没有语法为.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

答案 1 :(得分:1)

这里只是重申了吉普车的答案,但略有不同:

1)myline应该真正定义为Long或Integer

2)用Key:=Range("A1")声明的范围应定义为同一工作表

3)DJ的键在.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的所有排序字段添加了一行,以防万一您在此工作表上运行许多不同的排序器。

答案 2 :(得分:0)

尝试一下:

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