ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 25781|回复: 42

[分享] 图表事件使用说明(by single_star)

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2011-11-16 12:05 | 显示全部楼层 |阅读模式
本帖最后由 wangg913 于 2012-9-6 22:56 编辑

Excel的图表事件在实际工作中是非常有效的,可以扩展用户对Excel图表的应用,从而使操作更加简便。

我们可以借助于Excel图表对象事件,通过编写少量的代码来使我们的应用程序完成更加强大的功能。
例如,在图表中依据鼠标所选的两个点来生成一个曲线,将该曲线作为图表中系列的一部分;或者通过鼠标点选小图
来实现选择或缩放图表的现实区域等等。
<根据“asp.net Excel 中的图表事件”,改编>

以下整合了一些图表事件范例及说明,大家可了解如何应用图表事件,并掌握图表相关应用技巧。

请参见2楼及以下楼层范例、说明以及附件Chartevents...

chartevents.rar (94.8 KB, 下载次数: 2135)

图表事件应用范例汇总,请参考以下链接帖。自己定义不同的图表事件可实现更加丰富的功能。
http://club.excelhome.net/thread-562167-1-1.html


该贴已经同步到 single_star的微博







评分

3

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2011-11-16 12:07 | 显示全部楼层
本帖最后由 single_star 于 2011-11-17 11:44 编辑

Chartevent1-1.rar (14.12 KB, 下载次数: 401)
Chartevent1-2.rar (14.36 KB, 下载次数: 375)
Excel Chart可用图表事件引用说明
使用者启动或变更Excel图表工作表时可引发以下图表事件,嵌入式圖表则必须在类别模组中 WithEvents 关键字建立新的物件才可引发。
Activate :Chart对象被激活时触发。
BeforeDoubleClick :鼠标双击图表前触发。
BeforeRightClick :鼠标右键单击图表前触发。
Calculate :图表参照来源使用公式运算时触发。
Deactivate :Chart对象释放激活状态时触发。
DragOver :Chart对象被拖动时触发。
DragPlot :将某范围的单元格拖放到Chart时触发。
MouseDown :鼠标按下图表时触发。
MouseMove :鼠标在图表上移动时触发。
MouseUp :鼠标在图表按下,然后松开按键时触发。
Resize :调整Chart的大小时触发。
Select :Chart中的对象被选择时触发。
SeriesChange :改变Chart中的图标系列时触发。
图表(图表即工作表)上的事件在预设情况下是启动的。如果要检视图表工作表的事件程序,请用鼠标右键按一下工作表索引标签,再選取快顯功能表上的 [檢視程式碼] 指令,
然後在 [程序] 下拉式清單方塊內選取所需的圖表事件名稱。
附註   如果要撰寫嵌入圖表的事件處理程序,就必須在類別模組中用 WithEvents 關鍵字建立新的物件。
有關的詳細內容請參閱 內嵌圖表事件的用法(3楼)及编写内嵌事件程序步骤(7楼)
'****************************************
附件Chartevent1范例应用了Activate,Deactivate及Select图表事件,在使用者选择Chart对象中的不同部分,弹出的对话框中会给出相应的信息
excel图表事件的引用VBAasp.net文章中有详细的应用说明:
http://www.bcbbs.net/news/Content44779.aspx


TA的精华主题

TA的得分主题

 楼主| 发表于 2011-11-16 12:08 | 显示全部楼层
本帖最后由 single_star 于 2011-11-16 13:03 编辑

Chartevent2-1.rar (9.25 KB, 下载次数: 295)
Excel嵌入式圖表事件的用法
Excel预设情况下,图表工作表的事件都是可用的。但在使用具有 Chart 物件、且此物件代表內嵌图表的事件之前,必須先建立新的类模組,並宣告含有事件的 Chart 型态物件。
例如,假设建立了名为 EventClassModule 的新类別模組,而該模組內包含下列程式碼。
Public WithEvents myChartClass As Chart
在宣告含有事件的新物件之後,該物件將出現在类別模組的 [物件] 下拉式清單方塊內;此時您就可为該物件编写事件处理程序了。( [物件] 下拉式清單方塊內指定該物件后,[程序] 下拉式清單方塊內將列出該物件的有效事件)
但是,在事件處理程序執行之前,必須將类別模組中的宣告物件與內嵌图表連接。您可從任意的模組中用下列程式碼來完成這一動作。
Dim myClassModule As New EventClassModule
Sub InitializeChart()
    Set myClassModule.myChartClass = _
        Worksheets(1).ChartObjects(1).Chart
End Sub
執行 [初始化圖表] 程序之後,類別模組中的 myChartClass 物件將指向工作表一上的內嵌圖表一,並且當事件發生時,將引發類別模組中的事件程序
*(中斷或增刪myChartClass 物件程序或任何程序任後皆需再次初始化圖表才可正常引發類別模組中的事件程序)
附档范例則已將類別模組中的宣告物件與內嵌圖表連接來引發類別模組中的事件程序
(请以鼠标左键或右键点选图表数据点或绘图区产生代码中对应的图表事件,各位则可自行在 類別模組中编写不同的图表事件引用代码,但请记得再次初始化圖表)

TA的精华主题

TA的得分主题

 楼主| 发表于 2011-11-16 12:10 | 显示全部楼层
本帖最后由 single_star 于 2011-11-16 16:34 编辑

Chartevent3-1.rar (16.01 KB, 下载次数: 301)
GetChartElement 方法
传回指定的X坐标和Y坐标位置上图表元素的咨讯。
expression.GetChartElement(X, Y, ElementID, Arg1, Arg2)
expression     必选。该运算式传回Chart物件
X 必选的Long.图表元素的X坐标
Y 必选的Long.图表元素的Y坐标
ElementID 必选的Long。本方法传回后,本引数包含指定坐标处图表元素 XLChartItem 值。
Arg1 必选的 Long。本方法传回后,本参数包含與图表元素相关咨讯。
Arg2 必选的Long。本方法传回后,本参数包含與图表元素相关咨讯。
备注
本方法传回后,ElementID 的值決定了 Arg1Arg2 所包含的任何咨讯,如下表所示。
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
xlShape
ShapeIndex
xlTrendline
SeriesIndex
TrendLineIndex
xlXErrorBars
SeriesIndex
xlYErrorBars
SeriesIndex
下表将描述本方法传回后 Arg1Arg2 参数的意义。
引数
描述
AxisIndex
指定坐标轴为主指定座標軸為主坐标轴或副坐标轴。可为下列 XlAxisGroup 常数之一:xlPrimaryxlSecondary
AxisType
指定坐标轴类型。可为下列 XlAxisType 常数之一:xlCategoryxlSeriesAxisxlValue
DropZoneType
指定下拉区域类型:栏、资料、頁面或列栏位。可为下列 XlPivotFieldOrientation 常数之一:xlColumnFieldxlDataFieldxlPageFieldxlRowField。栏和列栏位常数指定代表的数列和类別栏位。
GroupIndex
指定某特定图表群组在 ChartGroups 集合中的位移。
PivotFieldIndex
指定某特定栏 (數列)、资料、頁面或列 (类別) 栏位在 PivotFields 集合中的位移。如果下拉区域型态为 xlDataField,则此值为 -1。
PointIndex
指定某数列中一特定点在 Points 集合物件內的位移。 - 1 表示指定了所有资料点。
SeriesIndex
指定某特定数列在 Series 集合物件中的位移。
ShapeIndex
指定某特定图案在 Shapes 集合物件中的位移。
TrendlineIndex
指定数列中某特定趋势线 Trendlines 集合物件中的位移。

TA的精华主题

TA的得分主题

 楼主| 发表于 2011-11-16 12:11 | 显示全部楼层
本帖最后由 single_star 于 2011-11-16 13:00 编辑

图表绘图区(Plotarea)对应位置图示说明
执行以下附件宏可自动得出图表绘图区(Plotarea)外部及内部图框
Plotarea.rar (12.71 KB, 下载次数: 321)


2011-11-16_125055.jpg

TA的精华主题

TA的得分主题

 楼主| 发表于 2011-11-16 12:12 | 显示全部楼层
本帖最后由 single_star 于 2011-11-16 12:57 编辑

图表绘图区(PlotArea)内部坐标应用说明
Set pa = ActiveChart.PlotArea
y0 = pa.InsideTop
x0 = pa.InsideLeft
w1 = pa.InsideWidth
h1 = pa.InsideHeight
则作用中图表绘图区(PlotArea)
左上角坐标=(x0,y0) '(InsideLeft , InsideTop)
右下角坐标=(x0+w1,y0+h1) '(InsideLeft+InsideWidth , InsideTop+InsideHeight)

'***************************************
求柱形图数据点数值(n)对应图表位置坐标(y1)
mini = ActiveChart.Axes(xlValue).MinimumScale '取得图表Y轴最小刻度
maxi = ActiveChart.Axes(xlValue).MaximumScale '取得图表Y轴最大刻度
y1=y0+h1-h1*n(maxi-mini)

求第n个数据点数对应图表X轴位置坐标(x1)
x1=x0+w1*(n-1+0.5)/n0 'n0代表图表数据点数(X轴刻度数),o.5代表该数据点在X刻度间位置居中
'***************************************************************************************
了解绘图区坐标关系,则可以用VBA为图表在指定位置添加线条、曲线、图形或文字标示
(可使用录制宏方式取得绘图代码並加以參考宏编辑器的帮助說明,如此即可用VBA画出你想要的图形、標示等效果)
(如此畫出的線或图形會自動隨图表形大小進行缩放及移动)

TA的精华主题

TA的得分主题

 楼主| 发表于 2011-11-16 12:13 | 显示全部楼层
本帖最后由 single_star 于 2011-11-17 11:27 编辑

编写内嵌事件程序步骤
Chartevent4-1.rar (19.85 KB, 下载次数: 280)
(摘录自'asp.net Excel中的图表事件'一文)
1. 在工程中添加新的类模块,取名为CEventChart,编写如下代码。
以下EvtChart_Select代码为图表事件示例代码,各位请依需求自行在CEventChart类模块编写应用代码
Option Explicit
' Declare object of type "Chart" with events
Public WithEvents EvtChart As Chart
Private Sub EvtChart_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
2. 在模块1中添加下面的代码,或者新建一个模块加入下面的代码。
Option Explicit
Dim clsEventChart As New CEventChart
Dim clsEventCharts()  As New CEventChart
Sub Set_All_Charts()
    ' Enable events for active sheet if sheet is a&n bsp;chart sheet
    If TypeName(ActiveSheet) = "Chart" Then
        Set clsEventChart.EvtChart = ActiveSheet
    End If
    ' Enable events for all charts embedded on a she et
    ' Works for embedded charts on a worksheet or ch art sheet
    If ActiveSheet.ChartObjects.Count > 0 Then
        ReDim clsEventCharts(1 To ActiveSheet.ChartObjects.Count)
        Dim chtObj As ChartObject
        Dim chtnum As Integer
        chtnum = 1
        For Each chtObj In ActiveSheet.ChartObjects
            ' Debug.Print chtObj.Name, chtObj.Parent.Name
            Set clsEventCharts (chtnum).EvtChart = chtObj.Chart
            chtnum = chtnum + 1
        Next ' chtObj
    End If
End Sub
Sub Reset_All_Charts()
    ' Disable events for all charts previously enabled to gether
    Dim chtnum As Integer
    On Error Resume Next
    Set clsEventChart.EvtChart = Nothing
    For chtnum = 1 To UBound (clsEventCharts)
        Set clsEventCharts(chtnum).EvtChart = Nothing
    Next ' chtnum
End Sub
3. 在thisWorkbook中加入下面事件以触发内嵌事件。
Option Explicit
Private Sub Workbook_SheetActivate (ByVal Sh As Object)
    Set_All_Charts
End Sub
Private Sub Workbook_SheetDeactivate (ByVal Sh As Object)
    Reset_All_Charts
End Sub
这样一来,该Excel中的所有Chart对象都会自动关联上Select事件,并且当事件触发时显示相应的提示信息。

TA的精华主题

TA的得分主题

 楼主| 发表于 2011-11-16 12:14 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 single_star 于 2012-3-4 11:11 编辑

图表事件应用心得一:
图表事件让我觉得无奈的是在实际应用中存在很多意想不到的情况导致我们所设置的内嵌事件处理程序不能成功地将相应的事件附加到Chart对象上,甚至还会引发Excel的异常,这很常见,有时必需整个离开exce再重新开启才可正常动作.此时你应该考虑InitializeAppEvents过程执行的时机,从而将该过程的执行代码移到其它的地方,这要视具体情况来定。

个人发现许多错误是在激发图表及图表元素(Chaetelement)后莫名奇妙的发生错误,此时试者加入.Chart.ProtectGoalSeek = True等保护语句或者取消doubleclick等选取功能
让使用者无法用滑鼠动作修改图表动作资料点则会很大程度降低出错机率的
範例:
Worksheets(1).ChartObjects(1).Chart.ProtectGoalSeek = True

总之,图表事件的bug目前还是要靠经验和耐心去善加对待处理.



TA的精华主题

TA的得分主题

 楼主| 发表于 2011-11-16 12:16 | 显示全部楼层
本帖最后由 single_star 于 2012-5-11 17:17 编辑

图表事件应用心得二:
图表在激活并产生mousemove事件时,鼠标一在图表上移动图表就闪烁个不停,让人看了就不舒服.
目前我有几个想法来改善这一现象,不要激活图表或使用mousemove事件而改用API GetCursorPos
获取鼠标位置后再转换为图表坐标及加上使用getchartelement等方法获得相关讯息后再执行相关动作,
如此图表就不会闪烁了.

API获取鼠标位置后再转换为图表坐标参考范例。。。
mousemove4.rar (19.86 KB, 下载次数: 349)


TA的精华主题

TA的得分主题

发表于 2011-11-16 12:54 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-22 09:24 , Processed in 0.060344 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表