【问题标题】:Filter multiple sheets using variable cell value使用可变单元格值过滤多个工作表
【发布时间】:2018-12-05 19:14:54
【问题描述】:

我有一个包含多张工作表的工作簿。

每个包含数据的工作表都有一个公共列 K,其中包含客户经理名称。 在 Sheet2 中,我使用列表在 C1 中使用了数据验证字段,因此创建了一个下拉列表,我可以在其中选择客户经理。 因此,如果我选择 Charlie Brown 并运行宏,我希望过滤所有工作表以仅显示 Charlie Brown 的数据。

我是一个绝对的 VBA 初学者,所以我无情地骚扰了 Google 先生——大多数建议都涉及对过滤器值进行硬编码,而不是使其成为可变单元格值。 我发现的最好的是:

子 apply_autofilter_across_worksheets()
将 xWs 调暗为工作表
出错时继续下一步
对于工作表中的每个 xW
xWs.Range("K").AutoFilter 1, CLng(Sheets("Sheet2").Range("C1").Value)
下一个
结束子

当我运行宏时:

• 肯定 - 没有错误!
• 负面 - 没有任何反应

我不确定这是做什么的:xWs.Range("K") - 原始脚本在列字母后面有一个数字,但无论我在它后面放什么数字,它没有区别。

我还在 C1 中简单地键入了一个客户经理名称,没有任何影响。很明显,这一切都被破坏了。 有 8 个数据工作表,外加 Sheet2。列数因工作表而异,但没有一个超过 AZ。

任何帮助将不胜感激!

【问题讨论】:

  • “on error resume next”隐藏错误。删除该行,然后重新运行您的代码。

标签: excel vba filter


【解决方案1】:

如 cmets 中所述,On Error Resume Next 隐藏错误,但不处理它们。使用Clng 肯定会导致错误——当您处理String 时,这会尝试将C2 中的值转换为类型Long。此外,您需要专门过滤 Sheet2。

这样的事情怎么样? (假设您的数据从每张工作表上的 A1 开始。)

编辑为仅自动过滤可见工作表。

Sub apply_autofilter_across_worksheets()
    Dim ws As Worksheet
    Dim clientManager As String
    Dim lastCol As Long, lastRow As Long
    Dim filterRng As Range

    clientManager = Sheets("Sheet2").Range("C1").Value

    For Each ws In Worksheets
        If ws.Name <> "Sheet2" And ws.Visible Then
            With ws
                If .AutoFilterMode Then .AutoFilter.ShowAllData

                lastCol = .Cells(1, Columns.Count).End(xlToLeft).Column
                lastRow = .Cells(Rows.Count, 1).End(xlUp).Row

                Set filterRng = .Range(.Cells(1, 1), .Cells(lastRow, lastCol))
                filterRng.AutoFilter 11, clientManager
            End With
        End If
    Next ws

End Sub

【讨论】:

  • 谢谢 - 效果很好!但是,在作品中有点扳手很抱歉。原来我收到的工作簿有隐藏的工作表——其中一些与未隐藏的工作表格式不同。例如,它们只有 3 列。请如何让它忽略隐藏的表格,或者至少不要担心它们的格式不同?我删除了所有隐藏的工作表并且宏工作正常 - 但是其中一些是需要的,因为涉及 VLOOKUP。
  • 如果您想忽略隐藏的工作表,请将If ws.Name &lt;&gt; "Sheet2" Then 更改为If ws.Name &lt;&gt; "Sheet2" And ws.Visible Then
  • 感谢 BB - 非常感谢您的帮助。还有一件事很抱歉 - 如果我希望它也忽略名为“摘要”的工作表 - 它不喜欢 If ws.Name &lt;&gt; "Sheet2" Or ws.Name &lt;&gt; "Summary" And ws.Visible Then
  • 写成And ws.Name &lt;&gt; "Summary",而不是Or
  • 谢谢 - 100% 完美。非常感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-25
  • 1970-01-01
  • 1970-01-01
  • 2019-11-05
  • 1970-01-01
  • 2017-07-04
相关资源
最近更新 更多