从图表中的选定行中筛选表或数据透视表

时间:2016-10-08 18:00:18

标签: excel excel-2010

我正面临挑战。在一个包含多行的图表中,我希望能够在一条线上单击一条线或鼠标来查看表或数据透视表中的相应数据点...所以基本上,根据我单击的元素过滤表或用鼠标在图表上选择。

你认为这是可以实现的吗?方法是什么?这有VBA代码吗?我见过一些例子,但他们正在研究这种方式;单击或鼠标悬停在观察点上,该行突出显示...

提前致谢

saskap

1 个答案:

答案 0 :(得分:0)

这真的很复杂,你必须自定义每个图表的代码,这个示例代码可以作为一个起点:

Dim p As Series
Dim pc As Long
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Dim ch As ChartObject: Set ch = Me.ChartObjects("Chart 1")
    With ch
        Dim s As Series: Set s = Nothing
        On Error Resume Next: Set s = .Chart.SeriesCollection(Target.Value): On Error GoTo 0
        If Not p Is Nothing And Not p Is s Then
            p.Format.Fill.ForeColor.RGB = pc
        End If
        If Not s Is Nothing Then
            Set p = s
            pc = s.Format.Fill.ForeColor.RGB
            With s
                s.Format.Fill.ForeColor.RGB = RGB(255, 0, 0)
            End With
        End If
    End With
End Sub
  • 前两行是存储哪个系列的全局变量 对象在上次突出显示,原始颜色是什么, 这是在不同的单元格时恢复原始颜色所必需的 选择。遗憾的是,VBA中的全局变量在重置项目时会丢失它们的值(例如,按下“停止”按钮或发生错误),因此该代码可能会为条形颜色着色,然后无法对其进行着色。如果重要,这些信息可能存储在不可见的单元格或图表数据中,但这会使代码复杂化。
  • 下一行意味着这是一个事件处理程序,一个响应某个事件而被调用的函数,在这种情况下,当某个工作表(你插入它的那个 - 你必须插入的工作表)上的选择发生变化时这是一个工作表模块而不是标准代码模块。)
  • 接下来,我们根据其名称查找图表并将其分配给一个类型为ChartObject的变量,因此早期绑定将允许我们依赖于intellisense的支持(如果您键入一个。它显示了接口的成员)。
  • 然后我们根据新选择的单元格内容中的名称查找图表中的系列。由于我们不知道新单元格是否具有有效名称,因此我们必须通过禁用错误处理来保护此行,并在以后检查s是否具有非空值。 - 这部分依赖于图表的类型以及它如何表示数据,您可能必须根据Series :: XValues选择数据。
  • 我们检查以前突出显示的栏是否有保存的值,如果它与当前选择不同,则恢复其原始颜色。
  • 最后,如果先前查找的系列成功,那么s非空,我们保存当前条的颜色并用红色填充突出显示。