ExcelTip.Net留存知识帖 ---【注:附件之前被网盘供应商清空后,现已修复-现已修复-现已修复为本地下载!】
现在位置:首页 > E文精选 > Excel VBA > 利用Excel图表和VBA做一个仿水晶易表

利用Excel图表和VBA做一个仿水晶易表

作者:绿色风 分类: 时间:2022-08-17 浏览:177
楼主
amulee
如以下网址中所示:

下方有一个价格图表(折线图),随着鼠标的移动,鼠标所指日期显示高亮,且显示当日价格标签和数据。
在水晶图表工具中提供了这样的图表设置。

利用Excel的图表和VBA,同样可以实现该效果。

1、在原始数据区域添加一个辅助列,记录下该系列数值最大值,公式为:
  1. =MAX($B$2:$B$32)+200
如图:

 

2、添加一个折线图,选中辅助列哪个数据系列,右键选择“更改系列图表类型”,将其改为柱形图

 

3、选中柱形图,右键选择“设置数据系列格式”,改成无间距,设置边框为实线

 

4、更改坐标轴最大值等,随后将坐标轴等其他无用的内容删除。

 

5、按Alt+F11进入VBE,添加一个类模块,将其改名为“MyChart”,在类模块中添加以下代码:
  1. 'API用于像素和磅的转换
  2. Private Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long
  3. Private Declare Function GetDeviceCaps Lib "gdi32" (ByVal hdc As Long, ByVal nindex As Long) As Long
  4. Public WithEvents Cht As Chart
  5. Private PtCount As Long '数据点个数
  6. Private Point2Pix As Double '磅转换成像素
  7. Private CurPt&
  8. Private PrePt&
  9. Private Sub Cht_Activate()
  10.     Dim Pt As Point
  11.     '设置绘图区的尺寸填满图表
  12.     Cht.PlotArea.Top = 0
  13.     Cht.PlotArea.Left = 0
  14.     Cht.PlotArea.Height = Cht.ChartArea.Height
  15.     Cht.PlotArea.Width = Cht.ChartArea.Width
  16.     '设置数据点
  17.     Cht.SeriesCollection(1).MarkerStyle = xlMarkerStyleNone
  18.     Cht.SeriesCollection(1).MarkerSize = 10
  19.     Cht.SeriesCollection(1).HasDataLabels = False
  20.     For Each Pt In Cht.SeriesCollection(2).Points
  21.         Pt.Interior.Color = RGB(217, 217, 217)
  22.     Next
  23.     '记录数据点个数
  24.     PtCount = Cht.SeriesCollection(1).Points.Count
  25.     '求磅转换成像素的比例
  26.     Point2Pix = GetDeviceCaps(GetDC(0), 90) / Application.InchesToPoints(1)
  27. End Sub
  28. Private Sub Cht_MouseMove(ByVal Button As Long, ByVal Shift As Long, ByVal x As Long, ByVal y As Long)
  29.     Dim Pt As Point
  30.     Dim ChtHeight%, ChtWidth%
  31.     Dim CurPoint&
  32.     '求出图标像素尺寸
  33.     ChtWidth = Cht.PlotArea.Width * Point2Pix
  34.     If x > 0 And x < ChtWidth Then
  35.         PrePt = CurPt
  36.         '求当前选中哪个数据点
  37.         CurPt = Int(x / (ChtWidth / PtCount)) + 1
  38.         If CurPt <> PrePt Then
  39.             '如果当前数据点和前一个不同,则改变填充色
  40.             If PrePt > 0 And PrePt <= PtCount Then
  41.                 Cht.SeriesCollection(2).Points(PrePt).Interior.Color = RGB(217, 217, 217)
  42.                 Cht.SeriesCollection(1).Points(PrePt).MarkerStyle = xlMarkerStyleNone
  43.                 Cht.SeriesCollection(1).Points(PrePt).HasDataLabel = False
  44.             End If
  45.             '改变
  46.             Cht.SeriesCollection(2).Points(CurPt).Interior.Color = RGB(215, 228, 189)
  47.             Cht.SeriesCollection(1).Points(CurPt).MarkerStyle = xlMarkerStyleDiamond
  48.             Cht.SeriesCollection(1).Points(CurPt).HasDataLabel = True
  49.             Sheet1.Label1.Caption = Range("A1").Offset(CurPt, 0)
  50.             
  51.         End If
  52.     End If
  53. End Sub
6、图表所在工作簿添加以下代码:
  1. Dim MyCht As MyChart
  2. Private Sub Worksheet_Activate()
  3.     Set MyCht = New MyChart
  4.     Set MyCht.Cht = Sheet1.ChartObjects(1).Chart
  5. End Sub
7、回到工作表,选中其他工作表再选中该工作表,点击图表后就能实现效果。

 


图表随鼠标移动显示数据.rar
2楼
水星钓鱼
学习下
3楼
Gavin_曾
vvv
4楼
qsc
ghjfhjgkhlk
5楼
hl_irnt
真高
6楼
expro
下来的鼠标移动怎么没反应呢?

免责声明

有感于原ExcelTip.Net留存知识的价值及部分知识具有的时间限定性因素, 经与ExcelTip.Net站长Apolloh商议并征得其同意, 现将原属ExcelTip.Net的知识帖采集资料于本站点进行展示, 供有需要的人士查询使用,也慰缅曾经的论坛时代。 所示各个帖子的原作者如对版权有异议, 可与本人沟通提出,或于本站点留言,我们会尽快处理。 在此,感谢ExcelTip.Net站长Apolloh的支持,感谢本站点所有人**绿色风(QQ:79664738)**的支持与奉献,特此鸣谢!
------本人网名**KevinChengCW(QQ:1210618015)**原ExcelTip.Net总版主之一

评论列表
sitemap