使用VBA

时间:2019-06-06 13:13:24

标签: vba excel-2010

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

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

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

到目前为止,我已经设法将代码从B2的右边选择然后向下选择。然后,在定义每列的排序标准时,我尝试确保选择的范围从第3行的列表顶部开始(第2行具有标题,第3行是列表中的第一项),然后动态选择每个相关列。但是,在With语句之后,我正在努力使范围成为动态的(仍然只是宏记录的静态范围)。

.Apply之后,我还收到“运行时错误'1004':应用程序定义的错误或对象定义的错误”。

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

1 个答案:

答案 0 :(得分:0)

只需将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

看看现在是否可以使用