Excel VBA:筛选和排序预先存在的自动筛选范围
假设我有一个Excel工作表,其中包含有关我的音乐收藏的信息。我写了两个宏:第一个宏按艺术家、专辑和曲目编号对列表进行排序,第二个宏按流派和歌曲标题对列表进行排序。以下是宏的外观: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
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必须将其范围存储在内存中的某个位置。我试图操纵现有的过滤器,而不是每次都在同一个地方创建一个新的过滤器。另一种方法是的,我知道如何关闭当前过滤器并应用新的过滤器。除非绝对必要,否则我不想那样做。我正试图找到一个更优雅、更少冗余的解决方案。把你的产品范围列成一个列表。更容易,更完美。非常感谢。