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 范围内)

参考资料:

  1. Microsoft Docs Range.Find 方法的页面
  2. 如果您需要,还有另一个 Microsoft 文档页面 使用 Application.Match 方法

如果您将两个简单的单元格添加到包含 header textvalue you want to filter 的工作表中,您可以使用以下代码来实现预期结果。

例如我的 header 命名为 "Date" 所以在我的 first sheet 中我在 A3 中写了 "Date" 和我想过滤到的日期 A4。请记住,由于我们正在搜索 first row 中的 "Date" header,我们应该将所谓的 Criteria Range header 放在另一行中,或者因为我们的搜索以第一次出现结束,我们可以将新的 header 添加到 original Date column.

之后的其中一列中

注:

Criteria Rangetableheader必须完全像目标选择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。确保观看它以更好地理解我写的内容。