在工作表中将 Chart BeforeDoubleClick 与图表对象结合使用

在工作表中将 Chart BeforeDoubleClick 与图表对象结合使用

我正在尝试使用 Chart.BeforeDoubleClick 事件让宏在工作表中的图表上运行。

我已经能够在独立图表中使用 BeforeDoubleClick 事件(无需使用类模块)。但我希望让它在作为对象嵌入到工作表中的图表中工作。想法是然后在单个工作表中为多个图表复制此事件。

遵循这本书(第 172-3 页),我做了以下工作:

  1. 创建新工作簿。在工作表 Sheet1 中添加了 2 列随机数据,并在同一工作表中数据旁边添加了散点图。

  2. 插入一个名为“cl_ChartEvents”的类模块,其代码为:

    Public WithEvents myChartClass As Chart
    
  3. 创建了一个标准模块,代码如下:

    Dim myClassModule As New cl_ChartEvents
    Sub InitializeChart()
    Set myClassModule.myChartClass = _ 
    Worksheets("Sheet1").ChartObjects(1).Chart
    End Sub
    
  4. 在 VBA 编辑器中,双击“Sheet1(Sheet1)”对象并插入代码:

    Private Sub MyChartClass_BeforeDoubleClick(ByVal ElementID As Long, _
        ByVal Arg1 As Long, ByVal Arg2 As Long, Cancel As Boolean)
    
    Select Case ElementID
        Case xlLegend
            Me.HasLegend = False
            Cancel = True
        Case xlAxis
            Me.HasLegend = True
            Cancel = True
        End Select
    End Sub  
    
  5. 单击运行并运行 InitializeChart 宏。

当我双击图表上的图例时,什么也没有发生,Excel 只是像往常一样打开“设置图例格式”属性框。

我在网上查看了论坛等,做了功课,但没有找到任何其他提示,说明如何实现 BeforeDoubleClick 事件以用于常规工作表中的图表。不过,书中的方法似乎表明这是可行的。

任何帮助都将不胜感激!让这个工作发挥作用将帮助很多在网上遇到类似问题的人。谢谢。

答案1

非常确定列表项#4 中的代码需要位于类模块中,myChartClass而不是位于Sheet1代码中。

编辑(解决‘未找到成员’错误):将步骤 4 的代码修改为:

Private Sub MyChartClass_BeforeDoubleClick(ByVal ElementID As Long, _
    ByVal Arg1 As Long, ByVal Arg2 As Long, Cancel As Boolean)

    Select Case ElementID
    Case xlLegend
        Me.MyChartClass.HasLegend = False
        Cancel = True
    Case xlAxis
        Me.MyChartClass.HasLegend = True
        Cancel = True
    End Select
End Sub

唯一的变化是在它们出现的两个位置之间MyChartClass插入和MeHasLegend

为什么这样做有效:Me指的是包含类模块的实例,cl_ChartEvents它不是绑定到感兴趣的图表的。对象MyChartClass是绑定到的Chart。(更好的名称MyChartClass可能是MyChartObj,或其他名称。)因此,必须深入研究Me.MyChartClass才能操纵绑定的Chart

编辑2(提供将自定义事件处理应用于工作簿中每个图表的代码):将步骤 3 的代码替换为以下内容:

Dim ChartColl As New Collection

Sub LinkCharts()
    Dim workCls As cl_ChartEvents
    Dim ws As Worksheet
    Dim ch As Chart, chob As ChartObject

    ' Link all standalone charts
    For Each ch In ActiveWorkbook.Charts
        ' Must create a new instance of the class for each chart
        Set workCls = New cl_ChartEvents
        ' Link each chart to the myChartClass member of the new class instance
        Set workCls.myChartClass = ch
        ' Add the new instance of the class into the Collection object
        ChartColl.Add workCls
    Next ch

    ' Link all charts in objects in sheets
    For Each ws In ActiveWorkbook.Worksheets
        For Each chob In ws.ChartObjects
            Set workCls = New cl_ChartEvents
            Set workCls.myChartClass = chob.Chart
            ChartColl.Add workCls
        Next chob
    Next ws
End Sub

Sub UnlinkCharts()
    ' Removing the cl_ChartEvents instances from the Collection causes 
    '  causes them to be destroyed by garbage collection
    Do Until ChartColl.Count = 0
        ChartColl.Remove 1
    Loop
End Sub

如果您只想修改工作簿中的某些图表,解决方案会更加复杂——您必须找到某种方法来标记您想要修改的图表或您不想修改的图表,并在遇到每个图表时检查标记。不过,这是相当可行的。

相关内容