Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel VBA:筛选和排序预先存在的自动筛选范围_Excel_Vba - Fatal编程技术网

Excel VBA:筛选和排序预先存在的自动筛选范围

Excel VBA:筛选和排序预先存在的自动筛选范围,excel,vba,Excel,Vba,假设我有一个Excel工作表,其中包含有关我的音乐收藏的信息。我写了两个宏:第一个宏按艺术家、专辑和曲目编号对列表进行排序,第二个宏按流派和歌曲标题对列表进行排序。以下是宏的外观: ThisWorkbook.Sheets("Music").ShowAllData With ThisWorkbook.Sheets("Music").AutoFilter.Sort .SortFields.Clear .SortFields.Add Range("A:A"), xlSortOnValu

假设我有一个Excel工作表,其中包含有关我的音乐收藏的信息。我写了两个宏:第一个宏按艺术家、专辑和曲目编号对列表进行排序,第二个宏按流派和歌曲标题对列表进行排序。以下是宏的外观:

ThisWorkbook.Sheets("Music").ShowAllData
With ThisWorkbook.Sheets("Music").AutoFilter.Sort
    .SortFields.Clear
    .SortFields.Add Range("A:A"), xlSortOnValues, xlAscending, , xlSortNormal
    .SortFields.Add Range("B:B"), xlSortOnValues, xlAscending, , xlSortNormal
    .SortFields.Add Range("C:C"), xlSortOnValues, xlAscending, , xlSortNormal
    .Header = xlYes
    .MatchCase = False
    .SortMethod = xlPinYin
    .Apply
End With
我想添加一行内容来过滤特定类型,如下所示:

ThisWorkbook.Sheets("Music").AutoFilter Field:=5, Criteria1:="Rock"

此行不起作用,因为Worksheet.AutoFilter方法不接受与Range.AutoFilter方法相同的参数。有没有人知道一种不需要关闭过滤器、计算数据范围、应用新过滤器然后对其进行排序的方法?

您可以使用任何单元格范围,即使没有已定义的自动过滤器范围。

Option Explicit

Sub add_filter_2_existing_autofilter()
Dim FilterRange As Range

    ThisWorkbook.Sheets("Music").Select

    'ShowAllData - error if no filter is set
    On Error Resume Next
    ActiveSheet.ShowAllData
    On Error GoTo 0

    'These do not work
    'ThisWorkbook.Sheets("Music").AutoFilter Field:=5, Criteria1:="Rock"
    'ThisWorkbook.Sheets("Music").FilterRange.AutoFilter Field:=5, Criteria1:="Rock", Operator:=xlFilterValues

    Set FilterRange = Sheets("Music").AutoFilter.Range
    FilterRange.AutoFilter Field:=5, Criteria1:="Rock", Operator:=xlFilterValues

    'OR one of the following equivalents, which also work:
    'ThisWorkbook.Sheets("Music").Range(FilterRange.Address).AutoFilter Field:=3, Criteria1:="Rock", Operator:=xlFilterValues
    'ThisWorkbook.Sheets("Music").Range("A1").AutoFilter Field:=5, Criteria1:="Rock", Operator:=xlFilterValues
    'ThisWorkbook.Sheets("Music").Range("A1000").AutoFilter Field:=5, Criteria1:="Rock", Operator:=xlFilterValues
    'ThisWorkbook.Sheets("Music").Range("XFD1").AutoFilter Field:=5, Criteria1:="Rock", Operator:=xlFilterValues

End Sub

为什么不使用Range.Autofilter方法?@SJR使用Range.Autofilter方法时,每次都需要使用代码来确定范围是什么。它似乎是多余的,因为过滤器已经存在。Excel必须将其范围存储在内存中的某个位置。我试图操纵现有的过滤器,而不是每次都在同一个地方创建一个新的过滤器。另一种方法是的,我知道如何关闭当前过滤器并应用新的过滤器。除非绝对必要,否则我不想那样做。我正试图找到一个更优雅、更少冗余的解决方案。把你的产品范围列成一个列表。更容易,更完美。非常感谢。