VBA - 应用具有部分 Header 匹配的过滤器
VBA - Apply Filter With Partial Header Match
我针对基于 header 匹配跨多个工作表应用过滤器的宏解决方案发布了一个问题。
Link:
我需要部分 header 匹配的帮助,而不仅仅是完全匹配,因为某些 header 不会完全匹配标准 - 即,有些会"STATUS" 作为 header,有些会是“prefix_Status”,其他的 "CurrentStatus" 等等。所以我需要使用 Instr
函数(除非有更好的选择)找到任何包含单词 STATUS 的 header 但我似乎无法弄清楚在哪里或如何使用它..
我的当前解决方案在 Match
行抛出以下错误:
Type Mismatch
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
With Worksheets(I)
Set rngData = .Range("A1").CurrentRegion
count = Application.Match("*STATUS*", Worksheets(I).Range("A1:AZ1"), 0)
If Not IsError(count) Then
rngData.autofilter Field:=count, Criteria1:="INACTIVE"
End If
End With
Next I
End Sub
Application.Match
returns 找不到匹配项时出错。您使用 IsError
检查错误,但代码在此之前停止。您需要跳过这些错误,以便稍后在代码中捕获它们。
尝试添加:On Error Resume Next
完整代码:
Sub WorksheetLoop()
Dim WS_Count As Integer, i As Integer, count As Integer
Dim rngData As Range
' Set WS_Count equal to the number of worksheets in the active
' workbook.
WS_Count = ActiveWorkbook.Worksheets.count
'If Application.Match finds no match it will throw an error so we need to skip them
On Error Resume Next
' Begin the loop.
For i = 1 To WS_Count
With Worksheets(i)
count = Application.Match("*STATUS*", Worksheets(i).Range("A1:AZ1"), 0)
If Not IsError(count) Then
Set rngData = .Range("A1").CurrentRegion
rngData.AutoFilter Field:=count, Criteria1:="INACTIVE"
End If
End With
Next i
End Sub
在简单数据集
上测试
之前:
之后:
我针对基于 header 匹配跨多个工作表应用过滤器的宏解决方案发布了一个问题。
Link:
我需要部分 header 匹配的帮助,而不仅仅是完全匹配,因为某些 header 不会完全匹配标准 - 即,有些会"STATUS" 作为 header,有些会是“prefix_Status”,其他的 "CurrentStatus" 等等。所以我需要使用 Instr
函数(除非有更好的选择)找到任何包含单词 STATUS 的 header 但我似乎无法弄清楚在哪里或如何使用它..
我的当前解决方案在 Match
行抛出以下错误:
Type Mismatch
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
With Worksheets(I)
Set rngData = .Range("A1").CurrentRegion
count = Application.Match("*STATUS*", Worksheets(I).Range("A1:AZ1"), 0)
If Not IsError(count) Then
rngData.autofilter Field:=count, Criteria1:="INACTIVE"
End If
End With
Next I
End Sub
Application.Match
returns 找不到匹配项时出错。您使用 IsError
检查错误,但代码在此之前停止。您需要跳过这些错误,以便稍后在代码中捕获它们。
尝试添加:On Error Resume Next
完整代码:
Sub WorksheetLoop()
Dim WS_Count As Integer, i As Integer, count As Integer
Dim rngData As Range
' Set WS_Count equal to the number of worksheets in the active
' workbook.
WS_Count = ActiveWorkbook.Worksheets.count
'If Application.Match finds no match it will throw an error so we need to skip them
On Error Resume Next
' Begin the loop.
For i = 1 To WS_Count
With Worksheets(i)
count = Application.Match("*STATUS*", Worksheets(i).Range("A1:AZ1"), 0)
If Not IsError(count) Then
Set rngData = .Range("A1").CurrentRegion
rngData.AutoFilter Field:=count, Criteria1:="INACTIVE"
End If
End With
Next i
End Sub
在简单数据集
上测试之前:
之后: