在VBA中自动筛选排序

时间:2016-02-29 09:27:15

标签: excel vba autofilter

我正在制作VBA宏。有一次,宏告诉excel更改当前的自动过滤器以使自动过滤器排序在Column A的列上,并且它应该是升序的。

但是,我现在的VBA代码表明RANGE是硬编码的Range(A1:A655),因为代码是用录制的宏写的。以下是我的VBA代码。你能不能用硬编码的方式告诉我如何改变A1:A655,而是让它只是一般意味着"使范围成为该列中的所有行,无论有多少?

ActiveWorkbook.Worksheets("A1").AutoFilter.Sort.SortFields.Add Key:=Range(
        "A1:A655"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=
        xlSortTextAsNumbers

1 个答案:

答案 0 :(得分:3)

尽量避免依赖ActiveSheet property。您应该知道您所使用的工作表,并通过工作表.CodeName明确引用它。 工作表.Name属性。

我相信您已将Worksheet ObjectRange object混为一谈。也就是说,除非你实际上有一个名为 A1 的工作表,这似乎不太可能。

Range.CurrentRegion property是一种很好的方法,可以参考从A1辐射出来的不间断细胞块。它继续向下,直到它遇到一个完全空白的行和完全空白的列。单个或一小组中间空白单元不会中断其对单元块的引用。

    With ActiveWorkbook
        With .Worksheets("Sheet1")
            If .AutoFilterMode Then .AutoFilterMode = False
            With .Cells(1, 1).CurrentRegion
                .Cells.Sort Key1:=.Columns(1), Order1:=xlAscending, _
                            Orientation:=xlTopToBottom, Header:=xlYes
                With .Resize(.Rows.Count, 141)  '<~~ A:EK
                    .AutoFilter Field:=36, Criteria1:=1

                    'the CurrentRegion is sorted on column A and filtered
                    'on column AJ

                End With
            End With
        End With
    End With

嵌套的With ... End With statement代理地定义了您想要引用的单元格块。

我相信你最好使用传统的Range.Sort method。它比.AutoFilter.Sort更直接。随后的AutoFilter method完成了操作。