VBA实现自动创建Excel图表

2017-04-14 18:37刘美丽
电子技术与软件工程 2017年6期
关键词:折线图

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

猜你喜欢
折线图
Optimization Design of Miniature Air Quality Monitoring System Based on Multi-Sensor Fusion Technology
让折线图显示在一个单元格中