使用 VBA 自定义排序动态范围

Custom sort dynamic range using VBA

我每天早上都会收到一份 Excel 文件,我希望以更合乎逻辑的方式对其进行分类。所有列标题始终相同,但行数可能会发生变化。

我正在尝试组合一个突出显示整个区域(从 B2 开始)的宏。它需要对列 C(升序)、G(降序)、H(升序)和 I(降序)进行排序。

我从使用宏记录器开始,现在正试图清理它吐出的代码。

到目前为止,我已经成功地整理了从 B2 向右然后向下选择区域的代码。然后在为每一列定义排序标准时,我试图确保所选范围从第 3 行列表的顶部开始(第 2 行有 headers,第 3 行是列表中的第一项)然后为每个相关列动态选择向下。但是,在 With 声明之后,我正在努力使范围成为动态范围(它仍然只是 macro-recorded 静态范围)。

.Apply.

之后,我还收到“Run-time 错误“1004”:Application-defined 或 object-defined 错误”
Sub Macro1()
Range("B2").Select
Range(Selection, Selection.End(xlToRight)).Select
Range(Selection, Selection.End(xlDown)).Select
ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Add Key:=Range("G3", 
Range("G3").End(xlToRight)) _
    , SortOn:=xlSortOnValues, Order:=xlDescending, 
DataOption:=xlSortNormal
ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Add Key:=Range("C3", 
Range("C3").End(xlToRight)) _
    , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Add Key:=Range("H3", 
Range("H3").End(xlToRight)) _
    , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Add Key:=Range("I3", 
Range("I3").End(xlToRight)) _
    , SortOn:=xlSortOnValues, Order:=xlDescending, 
DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("Sheet1").Sort
    .SetRange Range("B2:Q31") ' NOT SURE HOW TO MAKE DYNAMIC HERE
    .Header = xlYes
    .MatchCase = False
    .Orientation = xlTopToBottom
    .SortMethod = xlPinYin
    .Apply ' GETTING ERROR HERE
End With
End Sub

只需将 Range 更改为 Selection,因为您已经在工作中动态选择了范围:

Sub Macro1()
Range("B2").Select
Range(Selection, Selection.End(xlToRight)).Select
Range(Selection, Selection.End(xlDown)).Select

ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Clear

ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Add2 Key:=Range("G3", Range("G3").End(xlDown)), _
SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal

ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Add2 Key:=Range("C3", _
Range("C3").End(xlDown)), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal

ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Add2 Key:=Range("H3", _
Range("H3").End(xlDown)), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal

ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Add2 Key:=Range("I3", _
Range("I3").End(xlDown)), SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
'

With ActiveWorkbook.Worksheets("Sheet1").Sort
        .SetRange Range(Selection.Address)
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
End With

End Sub

看看它现在是否有效。