如何在(不可转动的)表链接切片器更新后触发更新

时间:2015-08-11 15:08:09

标签: excel excel-vba vba

我需要通过VBA记下切片器上选择的值(在一个单元格中)。 因此,在具有选项Option A, Option B, Option C的切片器中,我想要一些代码来触发将Option A|Option C放入单元格中。 如何触发该代码?我无法开始event,我尝试右键单击,分配 - 宏/新,但这只是在您点击时触发事件并且不允许您更新切片器。

1 个答案:

答案 0 :(得分:1)

虽然我无法想到直接调用与切片器绑定的事件;我已经考虑了一些,并意识到如果你包含一个易失性函数(每次操作后重新计算的函数),例如Worksheet_Calculate=NOW(),你可以在=RAND()事件中处理你的事件。隐藏在工作表的某个位置(隐藏列中,或更改要混合的字体颜色,以便对用户不可见)。

每次更改切片器参数时,都会重新计算该函数,该函数将调用Worksheet_Calculate事件。在这种情况下,您可以检索所选项目并将其显示在单元格中。

打开VB编辑器并将以下代码粘贴到您希望使用此功能的工作表代码中:

Private Sub Worksheet_Calculate()
        Dim item As SlicerItem
        Dim strOutput As String

        'Get all selected items from the first slicer
        For Each item In ActiveWorkbook.SlicerCaches(1).SlicerItems
                If item.Selected = True Then
                        strOutput = item.Caption & "|" & strOutput
                End If
        Next item

        'If we don't pause macros when we modify the
        'cell value, this function will get called again and
        'start an infinite loop, so we disable macros for
        'the update of the cell value

        Application.EnableEvents = False

        'Update a cell value with the slicer output
        Me.Range("G1").Value = "|" & strOutput

        Application.EnableEvents = True

End Sub

在我的测试工作簿中,我添加了一个表格,其中包含有关作者和书籍的信息(作者姓名,书名,价格,评级等),我为作者添加了一个切片器(这是ActiveWorkbook.SlicerCaches(1).SlicerItems指的切片器到)。

上面的代码会将作者切片器中的选定选项输出到单元格G1(您可以根据需要进行更改)。我将=NOW()函数放在单元格L2中,并将文本设为白色,以便对用户不可见。

在切片器中选择项目的结果是单元格G1,如下所示:

|Clive Barker|Stephen King|

假设这两位作者被选中。

当我选择H.P.代码执行后输出的快照。 Lovecraft和Clive Barker。

Example Output

这适用于所选的任何内容,当然您可以根据需要更改引用的切片器。请确保在Application.EnableEvents = False事件中修改单元格值的代码部分周围保留Application.EnableEvents = TrueWorksheet_Calculate触发器,否则代码将进入无限循环。

我添加了" |"到字符串的开头添加到单元格G1以使其看起来更好(看起来很笨拙的尾随|)但你也可以修剪尾随|使用Me.Range("G1").Value = Left(strOutput, Len(strOutput) - 1)代替Me.Range("G1").Value = "|" & strOutput

这会使输出看起来像这样:

H.P. Lovecraft|Clive Barker

再次假设在切片机中选择了这两位作者。如果你选择了三个,你会得到:

H.P. Lovecraft|Stephen King|Clive Barker