VBA - 循环遍历多个工作表并应用筛选器

时间:2018-03-28 10:18:36

标签: excel vba excel-vba

我需要对同一工作簿中的所有工作表应用相同的过滤器。

所有工作表在第一行中都有标题,但是应该应用过滤器的标题名称并不总是在同一列中,即工作表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

此代码仅将过滤器应用于一张纸。

2 个答案:

答案 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之间的代码中的点是产生差异的原因:

enter image description here

关于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
相关问题