使用可变单元格值过滤多张纸

时间:2018-06-27 01:58:41

标签: excel vba filter

我有一本包含多张纸的工作簿。

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

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

Sub apply_autofilter_across_worksheets()
昏暗的xWs作为工作表
关于错误继续下一个
对于工作表中的每个xW
xWs.Range(“ K”)。AutoFilter 1,CLng(Sheets(“ Sheet2”)。Range(“ C1”)。Value)
下一个
结束Sub

当我运行宏时:

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

我不确定它的作用: xWs.Range(“ K”)-原始脚本在列字母后有一个数字,但是无论我在它后面加上什么数字,它没什么。

我也只是简单地在C1中键入一个客户管理器名称,没有任何影响。很显然,这一切都被破坏了。 有8个数据工作表,以及Sheet2。列数因工作表而异,但不超过AZ。

任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:1)

如注释中所述,On Error Resume Next隐藏错误,但不处理错误。使用Clng肯定会导致错误-在处理Long时,这将尝试将C2中的值转换为类型String。另外,您需要专门过滤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