Excel 2010 VBA - 检查切片器值是否存在

时间:2017-05-31 11:17:04

标签: excel-vba vba excel

我有一个电子表格,查看组织的多个不同详细信息。除了“成本中心”之外,所有字段在不同的数据集中都是不同的。它存在于所有数据集中。

每个数据集都有自己的数据透视表和切片器。我希望使每个表的costcentre切片器匹配一个选定的切片器。

当两个切片器具有相同的值但是当更改的切片器没有所选切片器的值时,我已经使它工作,它选择所有值。因此,我试图让它检查一个值是否存在,然后更改其状态并让它移动到下一个,如果它没有(可以选择多个值)但我找不到简单检查值是否存在的方法如果没有,则转到代码中每个位的下一个值。任何有关如何做到这一点的建议或更简单的方法来实现原始目标都将非常感激

以下是我的VBA代码。请注意,我实际上没有任何VBA经验,这是通过在本网站上搜索答案并复制与一点点试验和错误相关的位来构建的。

Sub test()
Dim sc1 As SlicerCache
Dim sc2 As SlicerCache
Dim si1 As SlicerItem
Dim si2 As SlicerItem

Set sc1 = ThisWorkbook.SlicerCaches("Slicer_CC1")
Set sc2 = ThisWorkbook.SlicerCaches("Slicer_CC")

Application.ScreenUpdating = False
Application.EnableEvents = False

sc2.ClearManualFilter



For Each si1 In sc1.SlicerItems
        sc2.SlicerItems(si1.Name).Selected = si1.Selected
        On Error Resume Next
Next si1


    MsgBox "Update Complete"

clean_up:
        Application.EnableEvents = True
        Application.ScreenUpdating = True
        Exit Sub

err_handle:
        MsgBox Err.Description
        Resume clean_up
End Sub

1 个答案:

答案 0 :(得分:1)

对于初学者:如下使用循环更改部件不会产生错误。如果slicer1中的项目存在于您要更新的项目中,它将根据名称从第一个切片器中进行选择。

On Error Resume Next
For Each si1 In sc1.SlicerItems
   Set si2 = sc2.SlicerItems(si1.Name)
   If Not si2 Is Nothing Then
        si2.Selected = si1.Selected
    End If
Next si1
On Error GoTo 0

但是,无论在这种情况下是什么,都会选择第二个切片器中第一个不可用的项目,因为您使用sc2.ClearManualFilter清除了初始选择

如果您希望反转该行为,请使用:

On Error Resume Next
For Each si2 In sc2.SlicerItems
    Set si1 = sc1.SlicerItems(si2.Name)
    If Not si1 Is Nothing Then
        si2.Selected = si1.Selected
    Else
        si2.Selected = False
    End If
Next si2
On Error GoTo 0

在这种情况下,如果在第二个切片器中没有选择任何内容(因为没有匹配的项目),则不会应用任何过滤器(全选)。

当然你也可以省略sc2.ClearManualFilter行:这样你只会用上面的第一个选项触发每个项目等于slicer1。然后,剩下的选择将保持在脚本执行之前的状态。

希望这有帮助。