我需要对同一工作簿中的所有工作表应用相同的过滤器。
所有工作表在第一行中都有标题,但是应该应用过滤器的标题名称并不总是在同一列中,即工作表2中有问题的标题的工作表位于工作表2中它位于A列,在工作表3中,它位于L列,依此类推......
另外,有些标题不符合标准 - 即有些标题会有" STATUS"作为标题,一些将是" 前缀 _Status",其他" CurrentStatus"所以我需要使用Instr
功能(除非有更好的选择)但我似乎无法弄清楚在哪里或如何使用它..
这是我到目前为止的代码:
Sub WorksheetLoop()
Dim WS_Count As Integer
Dim I As Integer
' Set WS_Count equal to the number of worksheets in the active
' workbook.
WS_Count = ActiveWorkbook.Worksheets.count
' Begin the loop.
For I = 1 To WS_Count
Dim count As Integer, rngData As Range
Set rngData = Range("A1").CurrentRegion
count = Application.WorksheetFunction.Match("STATUS", Range("A1:AZ1"), 0)
rngData.autofilter Field:=count, Criteria1:="INACTIVE"
Next I
End Sub
此代码仅将过滤器应用于一张纸。
答案 0 :(得分:4)
只要您未在代码中明确指定工作表,就会始终引用ActiveSheet
。因此,在Range()
中,您必须像这样引用工作表:
自:
Set rngData = Range("A1").CurrentRegion
count = Application.WorksheetFunction.Match("STATUS", Range("A1:AZ1"), 0)
更改为:
With Worksheets(I)
Set rngData = .Range("A1").CurrentRegion
count = Application.WorksheetFunction.Match("STATUS", .Range("A1:AZ1"), 0)
End With
With Worksheets(I) - End With
之间的代码中的点是产生差异的原因:
关于Application.WorksheetFunction.Match
,它仅匹配包含完全单词“STATUS”的单元格。如果之前还有其他类似空格或之后的标志,那么这样的事情是个好主意:
count = Application.Match("*STATUS*", Worksheets(1).Range("A1:AZ1"), 0)
然后仍然需要检查。像这样:
If Not IsError(count) Then
rngData.autofilter Field:=count, Criteria1:="INACTIVE"
End If
关于问题的第二部分,请在匹配功能中使用*
:
Public Sub TestMe()
Range("E1") = "5teSt34"
Debug.Print Application.WorksheetFunction.Match("*Test*", Range("A1:H1"), 0)
End Sub
将始终返回5
。
答案 1 :(得分:2)
基本上你需要做的是在循环时引用代码中的表单,你没有这样做 - 你只是指不包含任何引用的活动表。
使用匹配,您可以使用通配符。
Sub WorksheetLoop()
Dim WS_Count As Long
Dim I As Long
WS_Count = ActiveWorkbook.Worksheets.count
Dim count As Variant, rngData As Range
For I = 1 To WS_Count
Set rngData = Worksheets(I).Range("A1").CurrentRegion
count = Application.Match("STATUS", Worksheets(I).Range("A1:AZ1"), 0)
If IsNumeric(count) Then rngData.AutoFilter Field:=count, Criteria1:="INACTIVE"
Next I
End Sub