Excel中的图表可以嵌入到工作表中,也可以单独作为图表工作表存在。作为单独图表工作表存在的图表可以响应事件,如下图:
而嵌入到工作表中的图表包含在ChartObject中,不能响应事件。如果需要让嵌入图表响应事件,需要使用类模块来创建Chart对象。
下面介绍让嵌入图表响应事件的方法。
假设工作表Sheet1中已经存在一个散点图,图表中包括两个系列,如下图:
步骤1,打开VBE窗口,单击菜单“插入”->“类模块”,然后在“属性”窗口修改类模块的名称为“clsChart”;
步骤2,接着在代码区中输入以下代码,
Public WithEvents objChart As Chart
这样便创建了一个带有事件的Chart类型对象。如下图:
打开代码区左上方的“对象”下拉列表框,可以看到刚刚创建的Chart对象objChart,如图:
在“对象”下拉列表框中选择对象objChart后,代码区右上方的“过程”下拉列表框中则列出该对象的所有事件,如图:
步骤3,选择BeforeDoubleClick事件,然后插入以下代码,此代码在用户双击图表的某个系列时将改变该系列的背景色;
Public WithEvents objChart As Chart
Private Sub objChart_BeforeDoubleClick(ByVal ElementID As Long, _
ByVal Arg1 As Long, ByVal Arg2 As Long, Cancel As Boolean)
Select Case ElementID
Case xlSeries
' Arg2表示PointIndex,
' 指定某个系列之一个特定点在Points集合中的偏移量。-1表示选择所有数据点
If Arg2 = -1 Then
' Arg1表示SeriesIndex,指定特定系列之Series集合中的偏移量
With objChart.SeriesCollection(Arg1)
If .MarkerBackgroundColorIndex = xlColorIndexAutomatic Then
.MarkerBackgroundColorIndex = 1
Else
.MarkerBackgroundColorIndex = (.MarkerBackgroundColorIndex Mod 56) + 1
End If
End With
Cancel = True
End If
'Case xlChartArea
' 你的事件处理代码
' Cancel = True
'Case xlLegend
' 你的事件处理代码
' Cancel = True
'Case xlAxis
' 你的事件处理代码
' Cancel = True
End Select
End Sub
步骤4,这时事件过程运行还没有完成,必须就是将嵌入的图表和类模块中的objChart对象相关联起来。可以在工作表的Active事件中添加如下代码。
Private firstChartEvent As New clsChart
Private Sub Worksheet_Activate()
If Me.ChartObjects.Count > 0 Then
' 如果Chart对象已经存在,重设
If Not firstChartEvent.objChart Is Nothing Then
Set firstChartEvent = Nothing
End If
' 仅对第1个图表对象设置事件
Set firstChartEvent.objChart = Me.ChartObjects(1).Chart
End If
End Sub
除了BeforeDoubleClick事件外,Chart对象还有很多其它的事件,从帮助文件中可以获得所有的事件过程以及参数的说明:
Activate 事件
激活该图表或嵌入图表时产生此事件。
语法:
Private Sub object_Activate()
BeforeRightClick 事件
当用鼠标右键单击一个嵌入图表时发生此事件,此事件先于默认的右键单击操作。
语法:
Private Sub expression_BeforeRightClick(Cancel As Boolean)
参数:
Cancel 必需。当事件发生时为 False。如果该事件过程将本参数设为 True,则该过程执行结束之后将不执行默认的右键单击操作。
Calculate 事件
对于 Chart 对象,在图表对新的数据点或者更改的数据点绘制之后产生此事件。
语法:
Private Sub object_Calculate()
Deactivate 事件
图表从活动状态转为非活动状态时产生此事件。
语法:
Private Sub object_Deactivate()
DragOver 事件
当将一个单元格区域拖过图表时产生此事件。
语法:
Private Sub object_DragOver()
DragPlot 事件
将一个单元格区域拖放到图表上时产生此事件。
语法:
Private Sub object_DragPlot()
MouseDown 事件
当在图表上按下鼠标按钮时,产生此事件。
语法:
Private Sub object_MouseDown(ByVal Button As Long, ByVal Shift As Long, ByVal X As Long, ByVal Y As Long)
参数:
object 在类模块中带有事件声明的 Chart 类型对象
Button 按下的鼠标按钮。可为以下 XlMouseButton 常量之一: xlNoButton、xlPrimaryButton、xlSecondaryButton 或 xlMiddleButton。
Shift 此事件产生时 Shift、Ctrl 和 Alt 的状态。可以是下列值之一或者某几个值的和。
值 含义
0(零) 没有键按下
1 Shift
2 Ctrl
4 Alt
X 鼠标指针在图表对象的客户坐标系中的 X 坐标,以Pixel为单位。
Y 鼠标指针在图表对象的客户坐标系中的 Y 坐标,以Pixel为单位。
MouseMove 事件
当鼠标指针在图表上的位置改变时产生此事件。
语法:
Private Sub object_MouseMove(ByVal Button As Long, ByVal Shift As Long, ByVal X As Long, ByVal Y As Long)
参数说明和MouseDown事件相同。
MouseUp 事件
当在图表上释放鼠标按钮时产生此事件。
语法:
Private Sub object_MouseUp(ByVal Button As Long, ByVal Shift As Long, ByVal X As Long, ByVal Y As Long)
参数说明和MouseDown事件相同。
Resize 事件
调整图表大小时,将产生本事件。
语法:
Private Sub object_Resize()
SeriesChange 事件
当用户更改图表数据点的值时,产生此事件。
语法:
Private Sub object_SeriesChange(ByVal SeriesIndex As Long, ByVal PointIndex As Long)
参数:
object 在类模块中带有事件声明的 Chart 类型对象。
SeriesIndex 表示已更改的系列在 Series 集合中的偏移量。
PointIndex 表示已更改的数据点在 Points 集合中的偏移量。
Select 事件
选定图表元素时,将产生本事件。
语法:
Private Sub object_Select(ByVal ElementID As Long, ByVal Arg1 As Long, ByVal Arg2 As Long)
参数说明和下面介绍的BeforeDoubleClick事件相同。
BeforeDoubleClick 事件
当双击一张嵌入图表时产生此事件,并且此事件先于默认的双击操作。
语法:
Private Sub object_BeforeDoubleClick(ByVal ElementID As Long, ByVal Arg1 As Long, ByVal Arg2 As Long, Cancel As Boolean)
参数:
object 引用在类模块中带有事件声明的 Chart 类型对象的变量。
Cancel 可选。当事件发生时为 False。如果事件过程将该参数设为 True,则该过程执行完之后将不进行默认的双击操作。
ElementID 必需。双击的对象。Arg1 和 Arg2 参数的含义取决于 ElementID 参数的值,如下表所示。
ElementID Arg1 Arg2
xlAxis AxisIndex AxisType
xlAxisTitle AxisIndex AxisType
xlDisplayUnitLabel AxisIndex AxisType
xlMajorGridlines AxisIndex AxisType
xlMinorGridlines AxisIndex AxisType
xlPivotChartDropZone DropZoneType 无
xlPivotChartFieldButton DropZoneType PivotFieldIndex
xlDownBars GroupIndex 无
xlDropLines GroupIndex 无
xlHiLoLines GroupIndex 无
xlRadarAxisLabels GroupIndex 无
xlSeriesLines GroupIndex 无
xlUpBars GroupIndex 无
xlChartArea 无 无
xlChartTitle 无 无
xlCorners 无 无
xlDataTable 无 无
xlFloor 无 无
xlLegend 无 无
xlNothing 无 无
xlPlotArea 无 无
xlWalls 无 无
xlDataLabel SeriesIndex PointIndex
xlErrorBars SeriesIndex 无
xlLegendEntry SeriesIndex 无
xlLegendKey SeriesIndex 无
xlSeries SeriesIndex PointIndex
xlTrendline SeriesIndex TrendLineIndex
xlXErrorBars SeriesIndex 无
xlYErrorBars SeriesIndex 无
xlShape ShapeIndex 无
下表描述的是参数的含义。
参数 说明
AxisIndex 指定坐标轴是主坐标轴还是次坐标轴。可为以下 XlAxisGroup 常量之一:xlPrimary 或 xlSecondary。
AxisType 指定坐标轴类型。可为以下 XlAxisType 常量之一:xlCategory、xlSeriesAxis 或 xlValue。
DropZoneType 指定拖放区的类型:列、数据、页或行字段。可为以下 XlPivotFieldOrientation常量之一:xlColumnField、xlDataField、xlPageField 或xlRowField。列和行字段常量分别指定了系列和分类字段。
GroupIndex 指定特定图表组在 ChartGroups 集合内的偏移量。
PivotFieldIndex 指定特定的列(系列)、数据、页或行(分类)字段在 PivotFields 集合中的偏移量。
PointIndex 指定某个系列中一个特定点在 Points 集合中的偏移量。-1 表示选定所有数据点。
SeriesIndex 指定特定系列在 Series 集合中的偏移量。
ShapeIndex 指定特定图形在 Shapes 集合中的偏移量。
TrendlineIndex 指定某个系列中特定趋势线在 Trendlines 集合中的偏移量。
示例下载: Box.Net | SkyDrive |