在图表点击上捕获事件

时间:2011-09-15 13:23:46

标签: excel excel-vba vba

当我点击图表时,我需要在Excel VBA中捕获事件。

我想把图表放到前面,当它被激活时,我找不到合适的事件。

对于不在表格上的图表(单独的全屏图表),有Chart_Activate()个事件。

当图表在某张纸上时,如何调用同一事件?

4 个答案:

答案 0 :(得分:3)

如果您有一组要自动化的图表,无论是在特定工作表上还是整个工作簿,那么我建议您使用类模块来捕获而不是按图表绑定代码图

Jon Peltier(按照惯例)详细介绍了此图表代码选项,请参阅Chart Events in Microsoft Excel

在名为CEventChart的类模块中放置:

Option Explicit
' Declare object of type "Chart" with events
Public WithEvents EvtChart As Chart    

Private Sub EvtChart_Activate()
EvtChart.ChartObjects msoBringToFront
End Sub

在普通模块中放

Option Explicit

Dim clsEventChart As New CEventChart
Dim clsEventCharts() As New CEventChart

Sub Set_All_Charts()
    ' Enable events on sheet if it is a chart sheet
    If TypeName(ActiveSheet) = "Chart" Then
        Set clsEventChart.EvtChart = ActiveSheet
    End If

    ' Enable events for all charts embedded on a sheet
    ' Works for embedded charts on a worksheet or chart sheet
    If ActiveSheet.ChartObjects.Count > 0 Then
        ReDim clsEventCharts(1 To ActiveSheet.ChartObjects.Count)
        Dim chtObj As ChartObject
        Dim chtnum As Integer

        chtnum = 1
        For Each chtObj In ActiveSheet.ChartObjects
            ' Debug.Print chtObj.Name, chtObj.Parent.Name
            Set clsEventCharts(chtnum).EvtChart = chtObj.Chart
            chtnum = chtnum + 1
        Next ' chtObj
    End If
End Sub

Sub Reset_All_Charts()
    ' Disable events for all charts previously enabled together
    Dim chtnum As Integer
    On Error Resume Next
    Set clsEventChart.EvtChart = Nothing
    For chtnum = 1 To UBound(clsEventCharts)
        Set clsEventCharts(chtnum).EvtChart = Nothing
    Next ' chtnum
End Sub

然后运行Set_All_Charts,选择工作表,将图表发送到前面,Jon使用这些工作表事件设置和禁用特定工作表上的图表代码

Private Sub Worksheet_Activate()
    Set_All_Charts
End Sub

Private Sub Worksheet_Deactivate()
    Reset_All_Charts
End Sub

答案 1 :(得分:1)

如果我理解了这个问题,我就遇到了同样的问题。只要有多个重叠图表,其可视化优先级就会跟在ZOrder

之后

在Excel 2003中,当一个人选择了一个图表时,它就到了前台(至少对于可视化,我不知道它的ZOrder是否被临时更改)。取消选择图表后,其可视化优先级将恢复为“正常”。

从Excel 2007开始,图表在选择时不会暂时显示为可视化,因此如果它们被隐藏在其他图表(或可能是其他Shape)后面,则完全查看它们的唯一选择是把它们带到前面。这有两个缺点:1)需要更多点击次数,2)(可能有意)ZOrder丢失。

Jon Peltier ,在post from 5th May 2009中,提到没有解决方法。

我尝试过基于以下方案的解决方案:

  1. 检测图表的激活。
  2. 存储其当前ZOrder以供日后使用。
  3. 把它带到前面。
  4. 取消选择图表后,恢复原来的ZOrder
  5. 这是基本的想法,该方案运作良好,有一些小问题。我实际上是将我的代码基于brettdj引用的page by Jon Peltier。 其中一项修改是

    Private Sub EvtChart_Activate()
        Application.EnableEvents = False
        ActivatedChart = EvtChart.name
        If (TypeName(EvtChart.Parent) = "ChartObject") Then
        ' Chart is in a worksheet
          Dim chObj As ChartObject
          Set chObj = EvtChart.Parent
          chObj.BringToFront
        Else
        ' Chart is in its own sheet
        End If
        Application.EnableEvents = True
    End Sub
    

    EvtChart_Deactivate使用类似的内容。 我希望这个想法很有用。

答案 2 :(得分:0)

在工作表中创建一个处理程序:

Public Sub ChartSelected(ByVal Name As String)
  Me.ChartObjects(Name).BringToFront
End Sub

右键单击图表并选择“指定宏”,然后键入类似

的内容
  

'Sheet1.ChartSelected "Chart 1"'

其中Chart 1是图表的名称。

要以编程方式分配此处理程序,请使用

ChartObject.OnAction = "'Sheet1.ChartSelected ""Chart 1""'"

答案 3 :(得分:0)

真的很容易。将此VBA过程放入常规代码模块中:

Sub ClickChart()
  ActiveSheet.ChartObjects(Application.Caller).BringToFront
End Sub

将宏ClickChart分配给您希望出现此行为的所有图表。

当您点击任何图表时,它会在工作表上的所有其他图表前移动。

发帖后,我看到@timwilliams在对另一个答案的评论中提出了这个建议。