我有一个数据库,它每15分钟从外部源自动刷新和更新一次表。我尝试了以下代码,每次在编辑/添加/删除源数据时都会更新数据透视表:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Worksheets("PIVOT TABLE WORKSHEET").PivotTables("PIVOT TABLE NAME").RefreshTable
End Sub
当我手动编辑源数据时,数据透视表将相应刷新。但是,当自动更新源数据时,数据透视表保持不变。有没有一种方法可以使数据透视表与数据库一起刷新而无需用户输入?
答案 0 :(得分:4)
如果使用the Worksheet_Change
event而不是the Worksheet_SelectionChange
event,将会有更好的结果,以便在数据更改时运行该过程,而在用鼠标选择单元格时不是或键盘。
Worksheet_Change
vs。Worksheet_SelectionChange
事件当工作表上的 选择 发生更改时,会触发
Worksheet_SelectionChange
。
例如,当用户单击单元格或按箭头键时。
Worksheet_Change
在工作表中的单元格被用户 或 by 更改时触发外部链接。注意:
Worksheet_Change does **not** occur when cells change during a re-calculation; use the
“计算”事件以捕获图纸的重新计算。)
根据数据在工作表中的布局方式,您可能希望通过检查哪些单元格已更改来限制此过程的执行,这总体上最简单使用Target
函数将事件过程的Intersect
参数与特定的单元格或单元格范围进行比较。
注意:提防无限!
使用通过
Worksheet_Change
事件过程更改“正在监视”区域内的单元格的代码时,您可能会陷入无限循环,因为更改会再次触发事件,从而再次更改单元格,依此类推。< / p>
(单击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