VBA实现自动创建Excel图表
作者:刘美丽
来源:《电子技术与软件工程》2017年第06期
Excel是一个集数据处理和图表绘制于一身的优秀软件。根据工作表的数据,利用―图表向导‖可以方便快捷地绘制图表。但是当需绘制的图表数量较多时,―图表向导‖的绘图方式就不那么―可爱‖了。本文通过对Excel的二次开发,用Excel VBA编程实现了折线图的自动绘制。对本程序稍作修改,可用于绘制其它类型的图表。 【关键词】Excel VBA 自动创建图表 折线图 1 引言
Excel是一个集数据处理和图表绘制于一身的优秀软件。运用Excel的―图表向导‖来绘制图表也不算麻烦。但是,如果要绘制的图表数量很多,用―图表向导‖的绘图方式来绘制图表,就不是一件令人愉快的事了。
本校老师在参与《国家重点基础研究发展计划——973计划子课题——湖南省酸雨污染现状、成因及控制对策研究》项目的数据处理工作中,需要绘制湖南省十四个地市及全省pH均值和九种要求的离子(SO42-、NO3-、NH4+、Ca2+、F-、Cl-、Mg2+、Na+、K+)的离子浓度均值及[SO42-]/[NO3-]、[SO42-]/[ΣA-]、[NO3-]/[ΣA-]、([SO42-]+[NO3-])/[ΣA-] 、[Ca2+]/[ NH4+]、[[Ca2+]/[ΣB+]、[ NH4+]/[ΣB+]、[ΣA-] /[ΣB+]十年数据的逐年、逐季、逐月的变化折线图。对于这种相同数据结构的大量图表绘制,用―图表向导‖来一张张绘制显然是令人生畏的,而使用Excel VBA对Excel的作图功能进行二次开发,将可大大提高工作效率。 2 Excel VBA创建图表常用的方法
Excel VBA是利用Chart对象来创建图表的。Chart对象和Charts对象集最常用的方法和属性有:
2.1 Add()方法
Charts对象集的 Add()方法用于向图表集合中添加新的图表对象。例: Set mychart = charts.Add
表示在活动图表之前插入一个新的图表,并将返回值保存在mychart对象变量中,以便需要时通过该变量来访问该图表。 2.2 Location()方法
龙源期刊网 http://www.qikan.com.cn
Add()方法创建的图表只存在于内存,要在工作表中看到新创建的图表,必须指定图表的显示位置。Location()方法即是指定新创建的图表的插入位置的。其语法如下: Chart.Location(Where,Name)
Where用于指定图表的插入位置:xlLocationAsNewSheet指定新图表作为新工作表插入工作簿中,此时Name为新工作表的名称(可省略);xlLocationAsObject指定新创建的图表作为图像元素插入到工作表中,此时Name为要插入的工作表的名称。 2.3 SetSourceData()方法
SetSourceData()方法用来指定作图的源数据区域。其语法为: Chrat.SetSourceData(Source,PlotBy)
其中,source用于指定数据源,可将Range对象传说递给该参数。PlotBy用于指定数据绘制方法,如果传递系统常量xlColumns则表示数据在列上生成(系列产生在列);如果传递系统常量xLRows,则表示数据在行上生成(系列产生在行)。
SetSourceData()方法虽然能很方便地指定数据源,但该方法不可以接受分散的单元格区域作为图表的数据源。当需要灵活地操纵图表的数据源时,需使用SeriesCollection()方法。 2.4 SeriesCollection()方法
SeriesCollection是Series对象的集合对象。Series对象表示图表中的一个系列。系列是一个图表中用于比较的一组数据,SeriesCollection即是保存这些系列的集合。系列在不同的图表中有不同的含义。在折线图中,每条线即是一个系列,雷达图中每个区域即是一个系列,饼图只有一个系列。
Series对象中常用的属性有Name、Values和XValues。其中Name属性表示该系列的名称,会在图表的图例区域显示出来;Values属性表示该系列的实际值,用于确定图表中图形位置的形状;XValues属性表示该系列的横坐标值,传统在图表的横坐标上显示出来。 Values和XValues属性必须用Range对象来指定,不可指定为变量的值。如: Chrat.SeriesCollection(1).values=Rang(―B1:B5‖) Chrat.SeriesCollection(1).Xvalues=Rang(―A1:A5‖)
SeriesCollection()方法可以自由地控制图表中所有的显示数据,通过它,程序可以自由地操纵图表抽需的每一个数据,因此比SetSourceData()方法更为灵活。
龙源期刊网 http://www.qikan.com.cn
2.5 Axes()方法
Chart对象的Axes()方法返回图表上单个坐标轴或坐标轴集合的某个对象。该方法的语法如下:
Chart.Axes(Type,AxisGroup)
Type参数用于指定要返回的坐标轴,可以是以下系统常量之一:数值轴—xlValue、分类轴—xlCategory或用于三维图表,表示纵深轴向的xlSeriesAxis。
通过Axes()方法,可以控制图表上坐标轴的相关属性,如坐标轴显示的标题、坐标轴的刻度等。
2.6 ChartType属性
ChartType属性用于指定图表的类型。常用图表类型和ChartType 属性值的对应关系如表1。
3 作图数据
将计算结果转换成易于作图的形式,如图1。图中每一行数据将绘制一张图。 4 程序实例及注解 Sub 绘制折线图() Dim mycell As Range Dim isect As Range Dim i As Integer Dim m As Integer Dim n As Integer
On Error GoTo esc ‗错误陷井
For r = 1 To 270 ‗第2行至第271行为需作图的数据,每一行数据需作一张图 Worksheets(\"年均值\").Activate
龙源期刊网 http://www.qikan.com.cn
Set mycell = Worksheets(\"年均值\").Range(Cells(r + 1, 1), Cells(r + 1, 12)) ‗指定作图数据源
Set isect = Application.Intersect(Worksheets(\"年均值\").Range(\"c2: l271\"), mycell) ‗计算数据源的首个单元格的行号、列号和总列数 i = isect.Row m = isect.Column
n = m + isect.Columns.Count – 1
‗查寻工作簿中是否存在与欲建图表同名的图表,若无则新建一个图表,若有则激活该图表
If Not (find(Worksheets(\"年均值\").Cells(i, 1) & Worksheets(\"年均值\").Cells(i, 2))) Then Charts.Add
ActiveChart.name = Worksheets(\"年均值\").Cells(i, 1) & Worksheets(\"年均值\").Cells(i, 2) '图表名称 Else
Charts(Worksheets(\"年均值\").Cells(i, 1) & Worksheets(\"年均值\").Cells(i, 2)).Activate End If
ActiveChart.ChartType = xlLineMarkers ‗指定图表类型为数据点折线图
ActiveChart.SetSourceData Source:=mycell, PlotBy:=xlRows ‗指定作图的数据源,系列产生在行
With Worksheets(\"年均值\")
For Each one In ActiveChart.SeriesCollection
one.XValues = .Range(.Cells(1, m), .Cells(1, n)) '分类名称 one.name = .Cells(i, 1) '图例名称
龙源期刊网 http://www.qikan.com.cn
i = i + 1 Next one End With
ActiveChart.Location Where:=xlLocationAsNewSheet ‗创建的新图表作为新工作表插入到工作簿中
With ActiveChart
.HasTitle = True ‗指定要显示图表标题
.ChartTitle.Characters.Text = Worksheets(\"年均值\").Cells(i - 1, 1) & Worksheets(\"年均值\").Cells(i - 1, 2) & \"十年变化趋势\" ‗指定图表标题的文字 .Axes(xlCategory, xlPrimary).HasTitle = True ‗指定显示分类轴标题
.Axes(xlCategory, xlPrimary).AxisTitle.Characters.Text = \"年份\" ‗指定分类轴标题的文字 .Axes(xlValue, xlPrimary).HasTitle = True ‗指定显示数值轴标题
.Axes(xlValue, xlPrimary).AxisTitle.Characters.Text = \"离子浓度(μeq/L)\" ‗指定数值轴标题的文字 End With
With ActiveChart.Axes(xlCategory)
.HasMajorGridlines = True ‗指定显示分类轴的主网格线 .HasMinorGridlines = False ‗指定不显示分类轴的次网格线 End With
With ActiveChart.Axes(xlValue)
.HasMajorGridlines = True ‗指定显示数值轴的主网格线 .HasMinorGridlines = False ‗指定不显示数值轴的次网格线 End With
龙源期刊网 http://www.qikan.com.cn
Next r esc: Exit Sub End Sub
‗查同名图表的自定义函数
Function find(name As String) As Boolean For Each one In Charts If one.name = name Then find = True Exit Function End If Next one find = False End Function 5 图表样张 如图2所示。 6 结论
所列程序能实现自动绘制Excel折线图,具有实用性。
程序的运行,既可以在Excel的Visual Basic编辑器中运行,也可以通过在菜单或工具栏建立相应的运行命令或按钮来运行,当然也可建立一个窗体,通过命令按钮来运行。因为超出了本文讨论的范围,不再赘述。 作者简介
刘美丽,讲师,研究方向为计算机应用。
龙源期刊网 http://www.qikan.com.cn
作者单位
长沙环境保护职业技术学院 湖南省长沙市 410004
因篇幅问题不能全部显示,请点此查看更多更全内容