如何使用将在数据透视表更新事件中更新数据透视表而不会导致无限循环的宏
Private Sub Worksheet_PivotTableUpdate(ByVal Target As PivotTable)
Dim ONS As Boolean
If ONS = True Then Exit Sub
ONS = True
'Line of code that will update the pivot table
ActiveWorkbook.SlicerCaches("Slicer_MSS_Top_Parent_org1"). _
VisibleSlicerItemsList = Array( _
"[CA_analysis_0501_final].[MSS Top Parent org].&[0]")
End Sub
答案 0 :(得分:1)
你也可以尝试简单地禁用事件:
Private Sub Worksheet_PivotTableUpdate(ByVal Target As PivotTable)
'Line of code that will update the pivot table
Application.Enableevents = False
ActiveWorkbook.SlicerCaches("Slicer_MSS_Top_Parent_org1"). _
VisibleSlicerItemsList = Array( _
"[CA_analysis_0501_final].[MSS Top Parent org].&[0]")
Application.Enableevents = True
End Sub
答案 1 :(得分:0)
有两件事需要考虑
1)无论数据透视表的更新方式如何,都会触发Worksheet_PivotTableUpdate
命令。因此,如果您使用由更新触发的相同宏更新它,则会导致无限循环
2)line of code that will update pivot table
究竟是什么?这究竟是做什么的?
如果我尝试这样的事情,我可能会使用Boolean
来控制宏的确切时间,然后创建一个单击类型的方法:
Private Sub Worksheet_PivotTableUpdate(ByVal Target As PivotTable)
Dim ONS as Boolean
If ONS = True then exit sub
'Line of code that will update the pivot table
ONS = True
End Sub
我没有测试过上面的代码,但是布尔值总是默认为FALSE
,所以当它在宏的末尾打开并且宏再次尝试触发时,它应该退出子有机会再次更新。下次发生更改时,由于该值未存储在任何位置,因此应再次将其设置为FALSE
并允许宏触发。
让我知道它是否有效:)
修改强>
这个简单的测试证明这种方法可行:
Sub test2()
Dim x As Boolean
If x = True Then MsgBox "its still true"
MsgBox "It's False"
x = True
If x = True Then MsgBox "Set to true"
End Sub
下次运行代码时,我仍然看不到消息“它仍然是真的”,因为Excel忘记了它最后一次设置为true。如果在某个地方保存变量并稍后引用它,它将保持为真。从而在你的案例中创建一个单一的代码