EXCEL VBA:如何在多个工作表中筛选同一列 header
EXCEL VBA: How to filter on same column header across multiple worksheets
我正在尝试过滤 10 个工作表中标记为“日期”的列。对于每个工作表,“日期”列可能不在同一列位置。
是否有宏或代码可用于一键式过滤“日期”列?而不是转到每个单独的工作表并单独过滤..
我只会在同一日期过滤所有工作表。例如,如果我想过滤“9/3/2021”,我会转到每个工作表并找到“日期”列并手动过滤 10 次。
您可以通过在该行(例如每个 sheet 的第一行)中搜索“日期”一词来找到“日期”列(我假设有一行包含“日期”一词) .然后你可以将列号提供给你的过滤子并得到你的过滤结果。
第一种方式
Sub Test()
For i = 1 To 10
For j = 1 To 50
If Worksheets(i).Cells(1, j).Value = "Date" Then
' here goes your filtration procedure on j column
Exit For
End If
Next j
Next i
End Sub
其中 i
是作品的数量 sheet 并且 j
是找到的列(在前 50 列中)
第二种方式(更快的方式)
使用@BigBen 建议的 Range.Find
因为:
Looping cell-by-cell is slow and inefficient
Sub Test()
Dim Rng As Range
For i = 1 To 5
With Sheets(i).Range("A1:Z1")
Set Rng = .Find(What:="Date", _
After:=.Cells(.Cells.Count), _
LookIn:=xlValues, _
LookAt:=xlWhole, _
SearchOrder:=xlByRows, _
SearchDirection:=xlNext, _
MatchCase:=False)
If Not Rng Is Nothing Then
' here goes your filtration procedure on (Rng.Column)
Else
MsgBox "Nothing found"
End If
End With
Next i
End Sub
其中 i
是工作数 sheet 和 Rng.Column
是找到的列(在 A1:Z1 范围内)
参考资料:
- Microsoft Docs
Range.Find
方法的页面
- 如果您需要,还有另一个 Microsoft 文档页面
使用 Application.Match 方法
如果您将两个简单的单元格添加到包含 header text
和 value you want to filter
的工作表中,您可以使用以下代码来实现预期结果。
例如我的 header 命名为 "Date"
所以在我的 first sheet
中我在 A3
中写了 "Date"
和我想过滤到的日期 A4
。请记住,由于我们正在搜索 first row
中的 "Date"
header,我们应该将所谓的 Criteria Range
header 放在另一行中,或者因为我们的搜索以第一次出现结束,我们可以将新的 header 添加到 original Date column
.
之后的其中一列中
注:
Criteria Range
tableheader必须完全像目标选择header一样才能工作。所以这里我有一列和一列 header,我只选择了日期列。
Sub Test()
Dim Rng As Range
For i = 1 To 4
With Sheets(i).Range("A1:Z1")
Set Rng = .Find(What:="Date", _
After:=.Cells(.Cells.Count), _
LookIn:=xlValues, _
LookAt:=xlWhole, _
SearchOrder:=xlByRows, _
SearchDirection:=xlNext, _
MatchCase:=False)
If Not Rng Is Nothing Then
'################################# New Part ▼
' R will be the address of the found column in Range format (e.g. "F1")
R = Rng.Address(RowAbsolute:=False, ColumnAbsolute:=False)
Dim rgData As Range, rgCriteria As Range
' rgCriteria is the two cells Criteria Range
Set rgCriteria = Sheets(1).Range("A3:A4")
' these next two lines are adding the Date column range to rgData
LastRow = Sheets(i).Cells(Rows.Count, Rng.Column).End(xlUp).Row
Set rgData = Sheets(i).Range(Sheets(i).Range(R), Sheets(i).Cells(LastRow, Rng.Column))
' since I was disappointed in AutoFilter I used Advanced Filter and its even faster
rgData.AdvancedFilter xlFilterInPlace, rgCriteria
'################################# New Part ▲
Else
MsgBox "Nothing found"
End If
End With
Next i
End Sub
就这些!
参考文献:
○ - 感谢 this Excel Macro Mastery channel video。确保观看它以更好地理解我写的内容。
我正在尝试过滤 10 个工作表中标记为“日期”的列。对于每个工作表,“日期”列可能不在同一列位置。
是否有宏或代码可用于一键式过滤“日期”列?而不是转到每个单独的工作表并单独过滤..
我只会在同一日期过滤所有工作表。例如,如果我想过滤“9/3/2021”,我会转到每个工作表并找到“日期”列并手动过滤 10 次。
您可以通过在该行(例如每个 sheet 的第一行)中搜索“日期”一词来找到“日期”列(我假设有一行包含“日期”一词) .然后你可以将列号提供给你的过滤子并得到你的过滤结果。
第一种方式
Sub Test()
For i = 1 To 10
For j = 1 To 50
If Worksheets(i).Cells(1, j).Value = "Date" Then
' here goes your filtration procedure on j column
Exit For
End If
Next j
Next i
End Sub
其中 i
是作品的数量 sheet 并且 j
是找到的列(在前 50 列中)
第二种方式(更快的方式)
使用@BigBen 建议的 Range.Find
因为:
Looping cell-by-cell is slow and inefficient
Sub Test()
Dim Rng As Range
For i = 1 To 5
With Sheets(i).Range("A1:Z1")
Set Rng = .Find(What:="Date", _
After:=.Cells(.Cells.Count), _
LookIn:=xlValues, _
LookAt:=xlWhole, _
SearchOrder:=xlByRows, _
SearchDirection:=xlNext, _
MatchCase:=False)
If Not Rng Is Nothing Then
' here goes your filtration procedure on (Rng.Column)
Else
MsgBox "Nothing found"
End If
End With
Next i
End Sub
其中 i
是工作数 sheet 和 Rng.Column
是找到的列(在 A1:Z1 范围内)
参考资料:
- Microsoft Docs
Range.Find
方法的页面 - 如果您需要,还有另一个 Microsoft 文档页面 使用 Application.Match 方法
如果您将两个简单的单元格添加到包含 header text
和 value you want to filter
的工作表中,您可以使用以下代码来实现预期结果。
例如我的 header 命名为 "Date"
所以在我的 first sheet
中我在 A3
中写了 "Date"
和我想过滤到的日期 A4
。请记住,由于我们正在搜索 first row
中的 "Date"
header,我们应该将所谓的 Criteria Range
header 放在另一行中,或者因为我们的搜索以第一次出现结束,我们可以将新的 header 添加到 original Date column
.
注:
Criteria Range
tableheader必须完全像目标选择header一样才能工作。所以这里我有一列和一列 header,我只选择了日期列。
Sub Test()
Dim Rng As Range
For i = 1 To 4
With Sheets(i).Range("A1:Z1")
Set Rng = .Find(What:="Date", _
After:=.Cells(.Cells.Count), _
LookIn:=xlValues, _
LookAt:=xlWhole, _
SearchOrder:=xlByRows, _
SearchDirection:=xlNext, _
MatchCase:=False)
If Not Rng Is Nothing Then
'################################# New Part ▼
' R will be the address of the found column in Range format (e.g. "F1")
R = Rng.Address(RowAbsolute:=False, ColumnAbsolute:=False)
Dim rgData As Range, rgCriteria As Range
' rgCriteria is the two cells Criteria Range
Set rgCriteria = Sheets(1).Range("A3:A4")
' these next two lines are adding the Date column range to rgData
LastRow = Sheets(i).Cells(Rows.Count, Rng.Column).End(xlUp).Row
Set rgData = Sheets(i).Range(Sheets(i).Range(R), Sheets(i).Cells(LastRow, Rng.Column))
' since I was disappointed in AutoFilter I used Advanced Filter and its even faster
rgData.AdvancedFilter xlFilterInPlace, rgCriteria
'################################# New Part ▲
Else
MsgBox "Nothing found"
End If
End With
Next i
End Sub
就这些!
参考文献:
○ - 感谢 this Excel Macro Mastery channel video。确保观看它以更好地理解我写的内容。