【问题标题】:Excel - Refreshing PivotTable data as Power Query auto refreshes PivotTable sourceExcel - 在 Power Query 自动刷新数据透视表源时刷新数据透视表数据
【发布时间】:2018-12-30 10:49:27
【问题描述】:

我有一个数据库,它每 15 分钟从外部源自动刷新和更新表。我尝试了以下代码,每次编辑/添加/删除源数据时都会更新数据透视表:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Worksheets("PIVOT TABLE WORKSHEET").PivotTables("PIVOT TABLE NAME").RefreshTable
End Sub

当我手动编辑源数据时,数据透视表会相应刷新。但是,当源数据自动更新时,数据透视表保持不变。有没有办法让数据透视表与数据库一起刷新而无需用户输入?

【问题讨论】:

  • 我忘记了 Worksheet_Change 是否存在此问题,但这是您想要使用的,而不是 Worksheet_SelectionChange。

标签: excel vba pivot-table


【解决方案1】:

如果您使用the Worksheet_Change event 而不是the Worksheet_SelectionChange event,您将获得更好的结果,这样程序会在数据更改时运行,不会在您使用鼠标或键盘选择单元格时运行。

Worksheet_Change vs. Worksheet_SelectionChange 事件

  • Worksheet_SelectionChange 在工作表上的选择更改时触发。
    例如,当用户单击单元格或按下箭头键时。

  • Worksheet_Change 在工作表上的单元格更改时触发,无论是由用户由外部链接

注意:Worksheet_Change does **not** occur when cells change during a re-calculation; use theCalculate` 事件来捕获工作表重新计算。)

根据数据在工作表中的布局方式,您可能希望通过检查哪些单元格被更改来限制此过程的执行,总体而言,这是最简单的使用 Intersect 函数将事件过程的 Target 参数与特定单元格或单元格范围进行比较。

注意:小心无穷大!

当使用代码更改由Worksheet_Change 事件过程“监视”的区域内的单元格时,您可能会进入无限循环,因为更改会再次触发事件,从而再次更改单元格,等等。


(点击image放大。)

有几种方法可以避免这种情况。这最常见的是使用the Application.EnableEvents property 暂时禁用事件,而Change 事件会执行它需要执行的操作。 (不要忘记在程序结束时重新启用事件...参见下面的示例。)


示例:

这是一个使用所有这些要点的未经测试的示例:

Private Sub Worksheet_Change(ByVal Target As Range)
    Const cellsToWatch = "A1:D4"
    With Worksheets("PIVOT TABLE WORKSHEET")
        'exit the procedure if at least part of the changed cells were not within `A1:D4`
        If Application.Intersect(.Range(cellsToWatch), Target) Is Nothing Then
            'the change wasn't within `cellsToWatch`
            Exit Sub
        End If
        Application.EnableEvents = False 'disable execution of this or other events

        '----------Run your code here:--------------
        .Calculate
        .PivotTables("PIVOT TABLE NAME").RefreshTable
        '-------------------------------------------

        Application.EnableEvents = True  're-enable events
    End With
End Sub

更多信息:

【讨论】:

  • 谢谢你!它在主要数据源更新(定期)时起作用,数据透视表也更新。但是,如果我在从源(即 INDEX/VLOOKUP)获取最后 20 行并从中创建数据透视表的表上使用相同的代码,则新的数据透视表不会得到更新。奇怪!
  • 编辑:没关系,修复了这个问题是一个非常微不足道的错误
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-09-07
  • 1970-01-01
  • 2016-01-11
  • 1970-01-01
  • 2015-02-07
  • 2013-04-15
相关资源
最近更新 更多