检测自动过滤器更改

时间:2015-10-12 12:32:11

标签: excel-vba vba excel

我希望检测特定表上的自动过滤器中的任何更改,以强制UDF对当前可见的表条目执行一些简单的算术以更新其结果。到目前为止,使UDF变得不稳定,但它也没有直接针对该表。

此解决方案(https://stackoverflow.com/a/15906275/4604845)对我不起作用,可能是因为我只进行了手动计算。

我的一个太脏的解决方法是Workbook_SelectionChange,虽然UDF不会以这种方式消耗资源消耗,但我宁愿在数据变大的情况下避免使用它。此外,我有一些用户在使用计算机方面是完全新手,我无法确信我可以让他们全部了解他们需要在更新自动过滤器之后点击其他内容以使结果正确。

有什么想法吗?我尝试了Workbook_ChangeWorkbook_Calculate但是没有一个被自动过滤器更改触发(或者我无法弄清楚如何触发它们)。

2 个答案:

答案 0 :(得分:2)

即使工作表上没有其他公式,如果在引用该表的工作表上某处包含 Subtotal()公式, Subtotal()将重新计算每次更换自动过滤器时。

您可以使用它来触发 Calculate()事件宏。

修改#1:

假设我们在名为 data 的工作表的 A 列上设置了自动筛选功能。工作表数据还包含许多其他公式。如果我们在 data 工作表中使用 Calculate()事件,我们会在任何这些公式重新计算时触发。

我们创建了一个名为 trigger 的新工作表。除了包含以下内容的单个单元格之外,这个新工作表完全是空的。

=SUBTOTAL(3,data!A1:A20)

我们将 Calculate()事件宏放在触发器工作表中。

现在,如果我们使用数据工作表,我们可以进行任意更改并执行各种重新计算,但不会触发,但如果我们更改AutoFilter,则触发器上的事件宏会看到变化并开火!

答案 1 :(得分:1)

如何在手动计算中自动筛选更改后触发工作表计算

我们知道无法自动检测AutoFilter选项的更改,因为这些更改不会触发任何Workbook EventWorksheet Event。因此,只有可用的选项是让用户通过动作触发工作表计算,即单元格选择更改,右键单击,双击等;或者只需按[F9];这是更好的行动,因为没有其他任何参与,这是它的设计工作方式。

然而,在用户请求中,我提供的这个VBA代码虽然需要由用户的操作启动,但是在选择AutoFilter更改后,可以立即执行此操作,只需双击即可。 / p>

使用此代码,DoubleClick可以不受限制(双击工作表中的任何单元格)

Private Sub Worksheet_BeforeDoubleClick(ByVal rTrg As Range, blCancel As Boolean)
    rTrg.Worksheet.Calculate
End Sub

或设置三种类型的限制:

  1. 表格中的任何单元格

  2. 表格的标题

  3. 表格的主体

  4. 使用此代码限制DoubleClick区域: 目前,代码设置为限制类型1,使用变量bRType将其更改为首选类型。此代码假定表的名称为Table1 (根据需要进行更改)

    Private Sub Worksheet_BeforeDoubleClick(ByVal rTrg As Range, blCancel As Boolean)
    Dim ObjLst As ListObject, rTbl As Range, bRType As Byte
    
        Rem Set Restriction Type
        Rem 1: DoubleCliking any cell of the Table - Default
        Rem 2: DoubleCliking any cell of the Table Header
        Rem 3: DoubleCliking any cell of the Table Body
        bRType = 1
    
        With rTrg
            Set ObjLst = .Worksheet.ListObjects("Table1")
    
            Select Case bRType
            Case 2:     Set rTbl = ObjLst.HeaderRowRange
            Case 3:     Set rTbl = ObjLst.DataBodyRange
            Case Else:  Set rTbl = ObjLst.Range
            End Select
    
            If Not (Intersect(.Cells, rTbl) Is Nothing) Then
                .Worksheet.Calculate
                blCancel = True
            End If
        End With
    End Sub
    

    这两个过程都是工作表事件,因此请确保您决定实施的过程进入保存表的工作表模块。 (不要更改程序的名称)