Excel VBA筛选器更改事件处理程序

时间:2015-03-11 05:43:13

标签: excel excel-vba vba

有没有办法找出用户何时对纸张过滤器进行了更改?

换句话说,是否有某种change_filter event处理程序?

2 个答案:

答案 0 :(得分:8)

我在另一个论坛上发布的article

1.A 虚拟工作表在A1中添加了一个SUBTOTAL公式,指向主表上正在过滤的范围。
 2. {em>虚拟工作表中添加了Worksheet_Calculate()事件,当更改过滤器时SUBTOTAL公式更新时,将触发此事件。

'Dummy sheet code
Private Sub Worksheet_Calculate()
'Dummy Sheet has recalculated
    MsgBox "Your list has been filtered"
End Sub

提供手动计算

请注意,上述方法要求将工作簿计算设置为自动(VBA中的xlCalculationAutomatic)或自动除表(xlCalculationSemiAutomatic)。如果计算设置为手动(xlCalculationManual),则需要进一步编码以设置WorkBook,以便只将“虚拟”工作表设置为自动计算,所有其他工作表都关闭计算。

有一个很少使用的WorkSheet属性EnableCalculation,可以通过Visual Basic编辑器设置为True或False。默认设置显然为True,如果设置为False,则工作表将无法计算。

常规Excel菜单或功能区选项无法使用EnableCalculation属性 - 对于那些希望通过故意保持重新计算密钥表来保护Excel模型的人来说,这可能是一个有用的技巧。

  1. 添加Workbook_Open事件,将“Dummy”以外的所有工作表的EnableCalculation property设置为False。
  2. 计算模式运行工作簿。

答案 1 :(得分:0)

这是this hidden gem answer的更详细版本。在此处发布以提高知名度。

  • 即使Calculation设置为Manual也可以。?

  • 假设您有一个图表,其中使用要过滤的表作为其数据源。
    如果没有,您将需要一个。 ?

  1. 创建一个名为ChartSubscriber标准模块
Private ChartEvents As New ChartEvents

Sub SubscribeToChartEvents()
  Set ChartEvents.Chart = Worksheets("Sheet with Chart").ChartObjects("Chart Name").Chart
End Sub
  1. 创建一个名为ChartEvents类模块
Public WithEvents Chart As Chart

Private Sub Chart_Calculate()
    Debug.Print "Table was filtered. Do your worst!"
End Sub
  1. ThisWorkbook模块中,订阅Workbook_Open上的事件。
Private Sub Workbook_Open()
    Call ChartSubscriber.SubscribeToChartEvents
End Sub