【发布时间】:2017-01-28 16:39:58
【问题描述】:
我终于找到了一个代码,可以在数据透视表更新时将切片器与不同的缓存连接起来。基本上,当 slicer1 的值发生变化时,它会更改 slicer2 以匹配 slicer1 从而更新连接到第二个 slicer 的任何数据透视表。
我已添加 .Application.ScreenUpdating 和 .Application.EnableEvents 以尝试加速宏,但它仍然滞后并导致 Excel 无响应。
是否有更直接的编码方式,或者这里是否有任何潜在的不稳定行导致 Excel 烧毁它的大脑?
Private Sub Worksheet_PivotTableUpdate _
(ByVal Target As PivotTable)
Dim wb As Workbook
Dim scShort As SlicerCache
Dim scLong As SlicerCache
Dim siShort As SlicerItem
Dim siLong As SlicerItem
Application.ScreenUpdating = False
Application.EnableEvents = False
On Error GoTo errHandler
Application.ScreenUpdating = False
Application.EnableEvents = False
Set wb = ThisWorkbook
Set scShort = wb.SlicerCaches("Slicer_Department")
Set scLong = wb.SlicerCaches("Slicer_Department2")
scLong.ClearManualFilter
For Each siLong In scLong.VisibleSlicerItems
Set siLong = scLong.SlicerItems(siLong.Name)
Set siShort = Nothing
On Error Resume Next
Set siShort = scShort.SlicerItems(siLong.Name)
On Error GoTo errHandler
If Not siShort Is Nothing Then
If siShort.Selected = True Then
siLong.Selected = True
ElseIf siShort.Selected = False Then
siLong.Selected = False
End If
Else
siLong.Selected = False
End If
Next siLong
exitHandler:
Application.ScreenUpdating = True
Application.EnableEvents = True
Exit Sub
errHandler:
MsgBox "Could not update pivot table"
Resume exitHandler
Application.ScreenUpdating = True
Application.EnableEvents = True
End Sub
在Contextures找到的原始代码
一如既往地感谢您的任何建议。
【问题讨论】:
-
你循环了多少个切片器项目?
-
它可能会很慢。在 slicercache 中使用 sliceritems 进行监控会导致对其连接的 pivotcache 进行过滤,这需要处理。因此,每次将
sliceritem.selected翻转到true或false时,pivotcache 都会针对连接的数据透视表进行过滤并进行 excel 爬网。我猜..理论上你可以清空连接的数据透视缓存(暂时移动数据但不移动标题并刷新),然后运行此代码通过切换sliceritems.Selected属性过滤空,然后将数据折回并刷新一次可旋转...? -
@Kyle Alot 可能还会有更多。我想知道设置“slicer2”的值/选择以匹配隐藏单元格的值/选择是否是更好/更快的解决方案?例如让A1 =主数据透视表的过滤值,然后将“切片器2”选择设置为等于单元格A1的选择?我不确定如何破译这个,到目前为止还没有出现任何功能编码。
-
每个切片器中有多少项会被选中?只有1个?还是希望用户能够进行多项选择?
-
当您说“很多,可能还会更多”时,您能说得更具体些吗?您需要同步多少个数据透视表?每个项目中有多少个 PivotItem?
标签: excel pivot-table slicers vba