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()方法
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()方法更为灵活。
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
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) '图例名称
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
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编辑器中运行,也可以通过在菜单或工具栏建立相应的运行命令或按钮来运行,当然也可建立一个窗体,通过命令按钮来运行。因为超出了本文讨论的范围,不再赘述。
作者简介
刘美丽,讲师,研究方向为计算机应用。
作者单位
长沙环境保护职业技术学院 湖南省长沙市 410004