由于 Excel 分配的表名不同,无法在所有工作表中使用筛选宏

由于 Excel 分配的表名不同,无法在所有工作表中使用筛选宏

希望在 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

如果我能解决这个问题,我会创建一个宏按钮来重置/删除过滤器。谢谢

表格从 A 列到 I 列的屏幕截图

答案1

每个工作表是否有多个表?
每个表都存储为 ListObject 对象,您可以使用ListObjectsWorksheet 对象的属性指向您的表,这也是您在代码中所做的。
因此,您可以循环遍历工作表,并为每个表应用过滤器。如果每个工作表只有一个表,则使用 而不是名称会更容易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

相关内容