如何使用将在数据透视表更新事件内更新数据透视表而不会导致无限循环的宏

时间:2014-06-13 12:14:10

标签: vba excel-vba excel

如何使用将在数据透视表更新事件中更新数据透视表而不会导致无限循环的宏

     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

2 个答案:

答案 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。如果在某个地方保存变量并稍后引用它,它将保持为真。从而在你的案例中创建一个单一的代码