Excel 将下拉选择链接到切片器

Excel 将下拉选择链接到切片器,excel,vba,Excel,Vba,我有一个下拉列表(Excel数据验证),其中的选项与切片器相同(都来自不同的源) 如何将下拉列表选择链接到切片器 在下拉列表中进行选择时,不会记录任何内容 例如 目标:如果我从下拉列表中选择了区域3,我的切片器也应该选择区域3。您需要一个事件例程来进行Change,该例程在下拉列表所在的单元格发生更改时触发,还需要一个例程来更改切片器 将以下代码放入VBA编辑器中的工作表对象(而不是新模块)。将单元格地址(在本例中为E10更改为您正在使用的单元格)。如果工作簿中有多个切片器,则必须将索引Slic

我有一个下拉列表(Excel数据验证),其中的选项与切片器相同(都来自不同的源)

如何将下拉列表选择链接到切片器

在下拉列表中进行选择时,不会记录任何内容

例如


目标:如果我从下拉列表中选择了区域3,我的切片器也应该选择区域3。

您需要一个事件例程来进行
Change
,该例程在下拉列表所在的单元格发生更改时触发,还需要一个例程来更改切片器

将以下代码放入VBA编辑器中的工作表对象(而不是新模块)。将单元格地址(在本例中为
E10
更改为您正在使用的单元格)。如果工作簿中有多个切片器,则必须将索引
SlicerCaches
更改为要修改的索引(在VBA中,通常可以使用索引号或名称)

以下例程可以放在事件例程的下面,也可以放在模块中。请注意,如果切片器中未找到
itemText
,则将选择所有项目

Sub SelectSlicerItem(sc As SlicerCache, itemText As String, Optional defaultItem As String = "")
    Dim si As SlicerItem, found As Boolean
    found = False
    sc.ClearManualFilter
    For Each si In sc.SlicerItems
        ' Debug.Print si.Caption, si.value
        If si.Caption <> itemText Then
            si.Selected = False
            found = True
        End If
    Next si
    If Not found And defaultItem <> "" Then SelectSlicerItem sc, defaultItem
End Sub
Sub-SelectSlicerItem(sc为SlicerCache,itemText为String,可选的defaultItem为String=”“)
Dim si作为SlicerItem,作为布尔值找到
发现=错误
sc.ClearManualFilter
对于sc中的每个si
'Debug.Print si.Caption,si.value
如果是si.Caption itemText,那么
si.Selected=False
找到=真
如果结束
下一个si
如果未找到默认项“”,则选择SlicerItem sc,defaultItem
端接头

编辑:已更改
选择SlicerItem
以处理默认项。

您有什么样的下拉列表?它是在Excel表格上还是在表格上?它是ActiveX控件还是窗体控件?还是数据验证下拉列表?这是excel中的数据验证下拉列表。谢谢。如果可能的话,请再问几个问题。(1) 我的下拉列表在另一张工作表上。我试着用切片器工作表上的一个单元格引用下拉列表来简化事情,但它不起作用。我相信这是因为工作表的更改需要用户输入。你对此有何建议?(2) 我已经设置了3个切片器,如果在所有3个切片器中都找到itemText,那么您的代码就可以工作。但是,正如您所提到的,如果未找到itemText,则将选择所有项目。如果找不到itemText,您对如何选择“(空白)”有何建议?非常感谢!(1) 事件例程必须位于下拉列表所在的工作表中。(2) 我添加了一个(可选)默认参数,用
(blank)
作为第三个参数调用例程。但是,如果切片器中也缺少该默认选项,则所有项目都将被选中-这是切片器的性质。
Option Explicit
' The Event routine    
Private Sub Worksheet_Change(ByVal Target As Range)

    If Target.Address(False, False) = "E10" Then
        SelectSlicerItem ThisWorkbook.SlicerCaches(1), Target.value
    End If
End Sub
Sub SelectSlicerItem(sc As SlicerCache, itemText As String, Optional defaultItem As String = "")
    Dim si As SlicerItem, found As Boolean
    found = False
    sc.ClearManualFilter
    For Each si In sc.SlicerItems
        ' Debug.Print si.Caption, si.value
        If si.Caption <> itemText Then
            si.Selected = False
            found = True
        End If
    Next si
    If Not found And defaultItem <> "" Then SelectSlicerItem sc, defaultItem
End Sub