【问题标题】:EXCEL VBA: How to filter on same column header across multiple worksheetsEXCEL VBA:如何在多个工作表中过滤相同的列标题
【发布时间】:2021-11-02 00:39:03
【问题描述】:

我正在尝试在 10 个工作表中筛选标有“日期”的列。每个工作表的“日期”列可能不在同一列位置。

是否有一个宏或代码可以让我通过一个简单的按钮按下来过滤“日期”列?而不是去每个单独的工作表和单独过滤..

我只会在同一日期过滤所有工作表。例如,如果我想过滤“2021 年 9 月 3 日”,我会转到每个工作表并找到“日期”列并手动过滤 10 次。

【问题讨论】:

  • "需要帮助" ...您是从宏记录器开始的吗?或本网站上的类似问题?
  • 我在使用宏记录器时遇到的问题是我每天都在使用这个工作簿并每天过滤不同的日期。
  • 这就是我使用“开始”这个词的原因......您必须修改生成的代码,但这是一个开始。 Date 也返回今天的日期。
  • 所有相关工作表中的列标题是否位于同一行?如果是,是第一行吗?这 10 张都是工作簿吗?
  • 是的,列标题都在第一行。这 10 张表是所有工作簿表。

标签: excel vba filter automation


【解决方案1】:

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

例如我的标题名为"Date",所以在我的first sheet 中我在A3 中写了"Date",并且我想过滤到A4 中的日期。请记住,由于我们在 first row 中搜索 "Date" 标头,因此我们应该将所谓的 Criteria Range 标头放在另一行中,或者由于我们的搜索以第一次出现结束,我们可以将新标头添加到其中一个我们original Date column之后的列。

注意:

Criteria Range 表格标题必须与目标选择标题完全类似,才能正常工作。所以这里我一栏一页眉,我只选择了日期栏。

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。请务必观看它以更好地理解我写的内容。

【讨论】:

    【解决方案2】:

    您可以通过在该行(例如每张纸的第一行)中搜索“日期”一词来找到“日期”列(我假设有一行包含“日期”一词)。然后您可以将列号提供给您的过滤子并获得您的过滤结果。

    第一种方式

    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 是工作表的数量,j 是找到的列(在前 50 列中)

    第二种方式(更快的方式)

    使用@BigBen 建议的Range.Find,因为:

    逐个单元循环缓慢且低效

    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 是工作表的数量,Rng.Column 是找到的列(在 A1:Z1 范围内)

    参考文献

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

    【讨论】:

    • @BigBen 它不会更快或我想的任何东西,但我添加了Range.Find。谢谢
    • 嗯,我使用第二个 for 的原因是因为首先它更容易,其次我忘记了 Sheets(i).Range("Something") 用于 find 函数,我认为 find 函数可以t 搜索不同的工作表 XD 我的错,再次感谢 :)
    • 过滤程​​序怎么写?例如,如果我想过滤该日期列的“2021 年 9 月 1 日”日期?对于第二种方式。我写了 Rng.Column.AutoFilter field:="9/1/2021" 并获得了无效的限定符。抱歉,我是 VBA 新手
    • @SJK "9/1/2021" 是一个字符串。它必须是日期(或 Long,因为 Excel 会保留日期)。所以,你应该将一个变量声明为日期,给它一个Date 值,或者你应该在你放置字符串的地方转换它:CDate("9/1/2021")
    • 我收到“无效的限定符”错误,它突出显示代码中的“.Column”:Rng.Column.AutoFilter Field:=CDate(9 / 1 / 2021)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-26
    • 2015-05-24
    • 1970-01-01
    • 2022-07-30
    • 1970-01-01
    相关资源
    最近更新 更多