首页 > VBA > 让嵌入图表响应事件

让嵌入图表响应事件

2009年3月22日

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

No related posts.

以上关联文章由 Yet Another Related Posts Plugin 提供支持。

VBA , ,

  1. 目前还没有任何评论.
  1. 目前还没有任何 trackbacks 和 pingbacks.

使用腾讯微博登陆

使用新浪微博登陆