我有一本包含多张纸的工作簿。
每个包含数据的工作表都有一个公共列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。
任何帮助将不胜感激!
答案 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