Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用VBA更新切片器缓存_Vba_Excel_Slicers - Fatal编程技术网

如何使用VBA更新切片器缓存

如何使用VBA更新切片器缓存,vba,excel,slicers,Vba,Excel,Slicers,我使用Excel VBA根据用户选择在切片器上隐藏/显示元素 我有以下代码: Private Sub removeFilterWithSlicer() Dim slicerCache As slicerCache Set slicerCache = ThisWorkbook.SlicerCaches("Slicer_Channel1") slicerCache.SlicerItems("A").Selected = False slicerCache.SlicerItems("B

我使用Excel VBA根据用户选择在切片器上隐藏/显示元素

我有以下代码:

 Private Sub removeFilterWithSlicer()

 Dim slicerCache As slicerCache

 Set slicerCache = ThisWorkbook.SlicerCaches("Slicer_Channel1")

 slicerCache.SlicerItems("A").Selected = False
 slicerCache.SlicerItems("B").Selected = False
 slicerCache.SlicerItems("C").Selected = False
 slicerCache.SlicerItems("D").Selected = False
 slicerCache.SlicerItems("E").Selected = False
 slicerCache.SlicerItems("F").Selected = False

End Sub
其中A、B等是切片器中元素的名称。我已经交叉检查了切片器缓存(“切片器\u通道1”)的名称。问题在于,元素并没有像预期的那样被取消选择。当我调试代码时,我发现每个元素都会一个接一个地被取消选择,但一旦我到达过程的末尾,即end Sub,它们都会恢复为选中状态


任何指针?

必须至少选择一个指针。使用鼠标进行选择时的工作方式相同。您不能取消选择全部

此代码显示了如何在名为vSelection的数组上筛选切片器

Option Explicit

Sub FilterSlicer()
Dim slr As Slicer
Dim sc As SlicerCache
Dim si As SlicerItem
Dim i As Long
Dim vItem As Variant
Dim vSelection As Variant

Set sc = ActiveWorkbook.SlicerCaches("Slicer_ID")
'Set sc = slr.SlicerCache

vSelection = Array("B", "C", "E")

For Each pt In sc.PivotTables
    pt.ManualUpdate = True 'Stops PivotTable from refreshing after each PivotItem is changed
Next pt

With sc

    'At least one item must remain visible in the Slicer at all times, so make the first
    'item visible, and at the end of the routine, check if it actually  *should* be visible
    .SlicerItems(1).Selected = True

    'Hide any other items that aren't already hidden.
    'Note that it is far quicker to check the status than to change it.
    ' So only hide each item if it isn't already hidden
    For i = 2 To .SlicerItems.Count
        If .SlicerItems(i).Selected Then .SlicerItems(i).Selected = False
    Next i

    'Make the PivotItems of interest visible
    On Error Resume Next 'In case one of the items isn't found
    For Each vItem In vSelection
        .SlicerItems(vItem).Selected = True
    Next vItem
    On Error GoTo 0

    'Hide the first PivotItem, unless it is one of the countries of interest
    On Error Resume Next
    If InStr(UCase(Join(vSelection, "|")), UCase(.SlicerItems(1).Name)) = 0 Then .SlicerItems(1).Selected = False
    If Err.Number <> 0 Then
        .ClearAllFilters
        MsgBox Title:="No Items Found", Prompt:="None of the desired items was found in the Slicer, so I have cleared the filter"
    End If
    On Error GoTo 0
End With


For Each pt In sc.PivotTables
    pt.ManualUpdate = False
Next pt

End Sub
选项显式
子过滤器许可证()
作为切片机的暗淡单反
将sc变暗为切片机
Dim si As Ritem
我想我会坚持多久
作为变体的暗维它
作为变体的选举
设置sc=ActiveWorkbook.SlicerCaches(“切片器ID”)
'设置sc=slr.SlicerCache
vSelection=数组(“B”、“C”、“E”)
对于sc数据透视表中的每个pt
pt.ManualUpdate=True“在更改每个数据透视项后停止刷新数据透视表
下一个pt
与sc
'至少有一项必须始终在切片器中保持可见,因此请首先
'项目可见,在例程结束时,检查它是否确实*应该*可见
.SlicerItems(1).Selected=True
'隐藏尚未隐藏的任何其他项目。
请注意,检查状态要比更改状态快得多。
'因此,仅当每个项目尚未隐藏时才隐藏它
对于i=2到.ms.Count
如果.SlicerItems(i).Selected,则.SlicerItems(i).Selected=False
接下来我
'使感兴趣的数据透视项可见
在出现错误时,如果找不到其中一项,请“继续下一步”
对于VSE选举中的每个vItem
.SlicerItems(vItem).Selected=True
下一个维特姆
错误转到0
'隐藏第一个数据透视项,除非它是感兴趣的国家之一
出错时继续下一步
如果InStr(UCase(Join(vSelection,“|”)、UCase(.SlicerItems(1.Name))=0,则.SlicerItems(1.Selected=False
如果错误号为0,则
.ClearAllFilters
MsgBox标题:=“未找到任何项目”,提示:=“切片器中未找到任何所需项目,因此我已清除筛选器”
如果结束
错误转到0
以
对于sc数据透视表中的每个pt
pt.ManualUpdate=False
下一个pt
端接头

你能详细说明你想做什么吗?你想让代码清除切片器,还是想让它在一个特定的SlicerItem上过滤切片器,或者其他什么?@jeffreyweir本质上我想用这个代码清除切片器,并对用户事件进行选择,但正如jsotola所建议的,即使用鼠标,我也无法取消选择所有过滤器。仍然可以接受建议很酷。这是可以做到的。但首先,您能否进一步阐述一下用户是如何与电子表格交互的,以及他们这样做时您希望发生什么?了解为什么您不希望用户使用切片器本身,而不是通过编程清除切片器会很方便。@jeffreyweir因此,我有一个由复选框控制的各种通道。因此,基本上,如果我想在分析中包含元素A,我将选中元素A,并启用一个文本框来输入一些值,在处理后,我需要确保在过滤器中只选择用户选择的元素,而过滤器反过来将管理我的所有透视图。现在我正在做一些类似于slicerCache.SlicerItems(“A”).Selected=True,当A被选中时,依此类推。所以你有效地将复选框用作切片器?在我们继续之前,您是否有任何特定的设计原因来解释为什么不使用切片器,并且完全不需要复选框(和相关代码)?单击时使用Ctrl键可以在切片器中选择多个项目。(道歉的要求,但我的设计理念是总是首先考虑什么可以在EXCEL中做,然后考虑基于代码的方法。)