Excel中的许多对象都可以响应事件,这其中包括了Excel程序自身的事件,也包括了我们在Excel中开发VBA应用程序时在对象上所附加的事件处理程序,如按钮的响应事件、单元格被选中的事件、工作表被激活的事件等。大多数的事件处理程序我们都耳熟能详,本文在此重点介绍一下Excel中的图表事件。
在Excel中如何快速地创建图表
虽然Excel可以接受任何类型和格式的数据,但是为了方便创建图表,我们通常都会创建一个相对连续的数据区域,并给定一些有意义的值,好的数据组织将有利于生成更加完美的图表。这里有一个例子,分别对A、B、C、D、E五个栏目按Alpha和Beta两种类别进行统计。
在Excel中生成图表非常简单,选中上述单元格区域,选择Insert选项卡中Charts部分的图表类型,Excel会自动按照你所选的图表类型为你生成图表,如下图。
图片看不清楚?请点击这里查看原图(大图)。
选择Design选项卡,在Chart Layouts部分选择不同的布局,可以丰富图表的内容,如添加图表的名称、设置图例的显示位置等。通过Excel提供的图表功能,我们可以给图表添加许多元素,按照 Excel自带的说明文档上的介绍,一个相对较完整的图表应该包含7个单元。
1. 图表显示区域。 2. 数据透视图区域。 3. 数据透视图中用于显示数据图表的数据点。 4. 数据透视图中的坐标值。 5. 图例区域。 6. 图表的标题。 7. 用于作为tooltip的数据标签,对数据的解释。 |
按照上述方法创建的图表默认是嵌套在Excel工作表中的,我们也可以创建一个独立的图表在Excel中指定的地方显示。在Design选项卡中找到Location部分,选择Move Chart,弹出的对话框如下图所示,选择New sheet,并定义一个有意义的名称,点击OK,此时Excel会在一个新的sheet中创建图表。这里有一个快速创建图表的方法,选中要创建图表的单元格区域,直接按F11,Excel会按照默认的选项在新的sheet中生成图表。在新 sheet中生成的图表可以在VBA中作为对象来进行访问,同时也可以编写事件处理程序,稍后会介绍。
图片看不清楚?请点击这里查看原图(大图)。
为什么要使用图表事件
使用图表事件可以更加方便用户使用我们编写的VBA应用程序。例如,我们可以给图表添加一个select事件,当用户点击图表数据透视图中的数据点时,为用户做这样一些事情:
显示一个提示信息
提取图表中的信息并放置到工作表中。
激活另外一个图表或工作表。
识别一个数据点进行数据分析。
在接下来的内容中,我会向大家介绍Excel中图表对象的一些常用事件的使用方法,并会给出相应的示例。
如何添加图表事件
与其它的VBA控件类似,要想为图表对象添加事件,必须首先进入到Excel的Visual Basic 编辑器。在上图中,右键点击Chart4选项卡(在Excel窗体的下端),选择“View Code”,即可打开 Visual Basic编辑器。或者在“开发工具”选项卡中直接点击Visual Basic按钮。如果是从当前图表所在的标签进入的Visual Basic编辑器,则Visual Basic编辑器窗口中默认打开的是当前图表的Code窗体,在Code窗体的顶部有两个下拉列表,在左边的下拉列表中选择Chart,右边的下拉列表中即显示了Chart对象支持的所有事件名称,默认是Active事件,即Chart被激活时所触发的事件。
图片看不清楚?请点击这里查看原图(大图)。
Chart对象支持以下这些事件:
Active:当Chart对象被激活时触发。
BeforeDoubleClick:鼠标双击前触发。
BeforeRightClick:鼠标右键单击前触发。
Calculate:使用公式运算时触发。
Deactivate:当Chart对象释放激活状态时触发。
DragOver:当Chart对象被拖动时触发。
DragPlot:当Chart对象中的数据透视图被拖动时触发。
MouseDown:鼠标按下时触发。
MouseMove:鼠标移动时触发。
MouseUp:鼠标按下,然后松开按键时触发。
Resize:调整Chart的大小时触发。
Select:Chart中的对象被选择时触发。
SeriesChange:改变Chart中的图标系列时触发。
下面我着重介绍几个常用事件的使用方法。
常用图表事件的使用
1. Activate事件
Activate事件在Chart对象被激活时触发。如果为Chart对象的Activate事件编写了如下代码,则在前面所举的示例中,当我们选择Chart4选项卡时,该事件会被触发。
Private Sub Chart_Activate()
MsgBox "Welcome to my Chart!"
End Sub
2. Deactivate事件
Deactivate事件在Chart对象被释放激活状态时触发。为Chart对象的Deactivate事件编写如下代码,然后释放Chart4选项卡被激活的状态(如选择其它的Sheet选项卡),事件即被触发。
Private Sub Chart_Deactivate()
msg = "Thanks for viewing the chart."
MsgBox msg, , ActiveWorkbook.Name
End Sub
3. Select事件
使用Select事件可以知道Chart对象的哪一部分被选择了。该事件有三个参数,ElementID 被用来告知Chart对象的哪一部分被选择了,后两个参数Arg1和Arg2则会根据ElementID的不同值传递一些额外的信息,如当Chart对象中的series被选中,则Arg1被用来告知哪一个series被选中了,而Arg2被用来告知被选中的 series中被选中的具体位置。当整个series被选中时,Arg1的值为-1,如果Chart的其它对象被选中,Arg1和Arg2的值为0,此时没有任何附加的信息。下表列出了该事件中三个参数可能的所有值。
ElementID | Arg1 | Arg2 |
xlChartArea | None | None |
xlChartTitle | None | None |
xlPlotArea | None | None |
xlLegend | None | None |
xlFloor | None | None |
xlWalls | None | None |
xlCorners | None | None |
xlDataTable | None | None |
xlSeries | SeriesIndex | PointIndex |
xlDataLabel | SeriesIndex | PointIndex |
xlTrendline | SeriesIndex | TrendLineIndex |
xlErrorBars | SeriesIndex | None |
xlXErrorBars | SeriesIndex | None |
xlYErrorBars | SeriesIndex | None |
xlLegendEntry | SeriesIndex | None |
xlLegendKey | SeriesIndex | None |
xlAxis | AxisIndex | AxisType |
xlMajorGridlines | AxisIndex | AxisType |
xlMinorGridlines | AxisIndex | AxisType |
xlAxisT itle | AxisIndex | AxisType |
xlDisplayUnitLabel | AxisIndex | AxisType |
xlUpBars | GroupIndex | None |
xlDownBars | GroupIndex | None |
xlSeriesLines | GroupIndex | None |
xlHiLoLines | GroupIndex | None |
xlDropLines | GroupIndex | None |
xlRadarAxisLabels | GroupIndex | None |
xlShape | ShapeIndex | None |
xlPivotChartDropZone | DropZoneType | None |
xlPivotChartFieldButton | DropZoneType | PivotFieldIndex |
xlNothing | None | None |
Private Sub Chart_Select(ByVal ElementID As Long, ByVal Arg1 As Long, ByVal Arg2 As Long)
MsgBox "Element: " & ElementID & vbCrLf & " Arg 1: " & Arg1 _
& vbCrLf & " Arg 2: " & Arg2
End Sub
选择Chart对象中的不同部分,弹出的对话框中会给出相应的信息。注意,当你选择 series时,第一次选中的是整个series对象,此时Arg2的值为-1,再次点击series,选中的是具体的series,此时 Arg2的值为series被选中的point值。下面是经过修改后的事件代码,显示了当Chart对象被选中时的完整信息, Excel定义了很多常量来表示ElementID参数的值。
Private Sub Chart_Select(ByVal ElementID As Long, ByVal Arg1 As Long, ByVal Arg2 As Long)
Dim sElement As String
Dim sArg As String
Select Case ElementID
Case xlChartArea
sElement = "Chart Area"
Case xlChartTitle
sElement = "Chart Title"
Case xlPlotArea
sElement = "Plot Area"
Case xlLegend
sElement = "Legend"
Case xlFloor
sElement = "Floor"
Case xlWalls
sElement = "Walls"
Case xlCorners
sElement = "Corners"
Case xlDataTable
sElement = "Data Table"
Case xlSeries
sElement = "Series " & Arg1
If Arg2 > 0 Then sArg = "Point " & Arg2
Case xlDataLabel
sElement = "Data Label"
E sArg = "Series " & Arg1
If Arg2 > 0tThen sArg = sArg & ", Point " & Arg2
x Case xlTrendline
sElement = "Trendline"
sArg = "Series " & Arg1 & ", Trendline " & Arg2
Case xlErrorBars
sElement = "Error Bars"
sArg = "Series " & Arg1
Case xlXErrorBars
sElement = "X Error Bars"
sArg = "Series " & Arg1