开启左侧

让嵌入图表响应事件

[复制链接]
etthink 发表于 2009-3-23 02:51:26 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题
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
学教育技术,上教育技术论坛!http://www.etthink.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


11关注

462粉丝

7824帖子

推荐阅读更多+
会员达人更多+
广告位

最新信息

更多+

关注我们:教育技术人

官方微信

官方微博

教育技术热线:

13955453231

学教育技术,上教育技术论坛!

教育技术论坛征稿范围:教育技术应用案例、教程文章、优秀作品等。

Email:sf@etthink.com

Copyright   ©2007-2026  应用思考-教育技术论坛  Powered by©Discuz!  技术支持:且行资源    ( 皖ICP备10014945号-4 )