我正在尝试使用 Chart.BeforeDoubleClick 事件让宏在工作表中的图表上运行。
我已经能够在独立图表中使用 BeforeDoubleClick 事件(无需使用类模块)。但我希望让它在作为对象嵌入到工作表中的图表中工作。想法是然后在单个工作表中为多个图表复制此事件。
遵循这本书(第 172-3 页),我做了以下工作:
创建新工作簿。在工作表 Sheet1 中添加了 2 列随机数据,并在同一工作表中数据旁边添加了散点图。
插入一个名为“cl_ChartEvents”的类模块,其代码为:
Public WithEvents myChartClass As Chart
创建了一个标准模块,代码如下:
Dim myClassModule As New cl_ChartEvents Sub InitializeChart() Set myClassModule.myChartClass = _ Worksheets("Sheet1").ChartObjects(1).Chart End Sub
在 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
单击运行并运行 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
插入和Me
。HasLegend
为什么这样做有效: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
如果您只想修改工作簿中的某些图表,解决方案会更加复杂——您必须找到某种方法来标记您想要修改的图表或您不想修改的图表,并在遇到每个图表时检查标记。不过,这是相当可行的。