希望在 D 列上创建一个过滤器,使其包含“否”和 E 列“空白”。我已通过录制宏来完成这些操作,如下所示。但是,我无法创建宏按钮并将其应用于所有工作表,因为 Excel 为每个工作表分配了不同的表名。
例如,下面的一个已被分配表格6814151416171924282737404145498914。有没有办法解决这个问题,以便我可以有一个可应用于所有工作表的按钮?
Sub yet2attend()
'
' yet2attend Macro
'
'
ActiveSheet.ListObjects("**Table6814151416171924282737404145498914**").Range. _
AutoFilter Field:=4, Criteria1:="NO"
ActiveSheet.ListObjects("**Table6814151416171924282737404145498914**").Range. _
AutoFilter Field:=5, Criteria1:="="
End Sub
如果我能解决这个问题,我会创建一个宏按钮来重置/删除过滤器。谢谢
答案1
每个工作表是否有多个表?
每个表都存储为 ListObject 对象,您可以使用ListObjects
Worksheet 对象的属性指向您的表,这也是您在代码中所做的。
因此,您可以循环遍历工作表,并为每个表应用过滤器。如果每个工作表只有一个表,则使用 而不是名称会更容易index
,因为它始终是工作表上的第一个表。
Sub yet2attend()
Dim tbl As ListObject, sht As Worksheet
For Each sht In ThisWorkbook.Worksheets
sht.ListObjects(1).Range.AutoFilter Field:=4, Criteria1:="NO"
sht.ListObjects(1).Range.AutoFilter Field:=5, Criteria1:="="
Next sht
End Sub
或者,如果按钮是每个工作表都有的,并且只应该过滤您所在的工作表,那么您可以使用现有的按钮,并将名称更改为索引。
Sub yet2attend()
ActiveSheet.ListObjects(1).Range.AutoFilter Field:=4, Criteria1:="NO"
ActiveSheet.ListObjects(1).Range.AutoFilter Field:=5, Criteria1:="="
End Sub
如果每张工作表中有多个表,并且您想要一种通用方法,那么它们需要具有一些共同点。
如果您无法确保它们具有相同的索引,但它们都在同一范围内,则可以使用它来告诉 Excel 您想要过滤哪个表。
通过使用该Intersect
方法,我们可以检查某些内容是否占据特定范围。并且该ListObjects.Range
属性返回表的范围。
Intersect(ActiveSheet.ListObjects(1).Range, Range("A1")
将返回两个范围相交的范围(如果有)。我们不想知道在哪里,而是如果。
如果范围不相交,Intersect
将返回nothing
。知道这一点,我们可以循环遍历工作表的表格,并且只影响没有返回任何内容的表格 - 因此在我们的范围内。
Sub yet2attend()
Dim tbl As ListObject
For Each tbl In ActiveSheet.ListObjects
If Not Intersect(tbl.Range, Range("A1")) Is Nothing Then
tbl.Range.AutoFilter Field:=4, Criteria1:="NO"
tbl.Range.AutoFilter Field:=5, Criteria1:="="
End If
Next tbl
End Sub