Excel宏以执行多列排序

时间:2018-04-30 14:15:27

标签: excel-vba vba excel

我正在尝试在Excel中创建一个宏,它将按A,C和F列对电子表格进行排序。我在网上找到信息让我开始。下面是代码。我遇到的挑战是,电子表格每天会包含不同数量的行。 (列将始终相同,但行计数将更改)。只要电子表格不包含超过9999行(包括列标题),下面的脚本就会对我的数据进行排序。如果我有10,000行或更多行,宏将失败。

如何更新以下代码以允许它运行而不管行数?您可以提供的任何帮助将不胜感激。谢谢

Sub Multi_Sort()
'
' Multi_Sort Macro
'
Dim lngLast As Long
lngLast = Range("A" & Rows.Count).End(xlUp).Row

With Worksheets("Sheet1").Sort
    .SortFields.Clear
    .SortFields.Add Key:=Range("A1:A1" & lngLast), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    .SortFields.Add Key:=Range("C1:C1" & lngLast), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    .SortFields.Add Key:=Range("F1:F1" & lngLast), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal

    .SetRange Range("A1:F" & lngLast)
    .Header = xlYes
    .MatchCase = False
    .Orientation = xlTopToBottom
    .SortMethod = xlPinYin
    .Apply
End With

End Sub

1 个答案:

答案 0 :(得分:2)

我无法在Excel 2013中复制您的错误,但我猜测额外的" 1"在您的范围分配中是问题(即,将=Range("A1:A1" & lngLast)更改为=Range("A1:A" & lngLast)等。)

另外,一个好的做法是明确调用范围(包括工作表)。

Sub Multi_Sort()

Dim lngLast As Long
Dim ws As Worksheet

Set ws = ThisWorkbook.Worksheets("Sheet1")
lngLast = ws.Range("A" & .Rows.Count).End(xlUp).Row

With .Sort
    .SortFields.Clear
    .SortFields.Add Key:=ws.Range("A1:A" & lngLast), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    .SortFields.Add Key:=ws.Range("C1:C" & lngLast), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    .SortFields.Add Key:=ws.Range("F1:F" & lngLast), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal

    .SetRange ws.Range("A1:F" & lngLast)
    .Header = xlYes
    .MatchCase = False
    .Orientation = xlTopToBottom
    .SortMethod = xlPinYin
    .Apply
End With
End Sub