Excel是一個(gè)集數(shù)據(jù)處理和圖表繪制于一身的優(yōu)秀軟件。根據(jù)工作表的數(shù)據(jù),利用“圖表向?qū)А笨梢苑奖憧旖莸乩L制圖表。但是當(dāng)需繪制的圖表數(shù)量較多時(shí),“圖表向?qū)А钡睦L圖方式就不那么“可愛”了。本文通過對(duì)Excel的二次開發(fā),用Excel VBA編程實(shí)現(xiàn)了折線圖的自動(dòng)繪制。對(duì)本程序稍作修改,可用于繪制其它類型的圖表。
【關(guān)鍵詞】Excel VBA 自動(dòng)創(chuàng)建圖表 折線圖
1 引言
Excel是一個(gè)集數(shù)據(jù)處理和圖表繪制于一身的優(yōu)秀軟件。運(yùn)用Excel的“圖表向?qū)А眮砝L制圖表也不算麻煩。但是,如果要繪制的圖表數(shù)量很多,用“圖表向?qū)А钡睦L圖方式來繪制圖表,就不是一件令人愉快的事了。
本校老師在參與《國家重點(diǎn)基礎(chǔ)研究發(fā)展計(jì)劃——973計(jì)劃子課題——湖南省酸雨污染現(xiàn)狀、成因及控制對(duì)策研究》項(xiàng)目的數(shù)據(jù)處理工作中,需要繪制湖南省十四個(gè)地市及全省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+]十年數(shù)據(jù)的逐年、逐季、逐月的變化折線圖。對(duì)于這種相同數(shù)據(jù)結(jié)構(gòu)的大量圖表繪制,用“圖表向?qū)А眮硪粡垙埨L制顯然是令人生畏的,而使用Excel VBA對(duì)Excel的作圖功能進(jìn)行二次開發(fā),將可大大提高工作效率。
2 Excel VBA創(chuàng)建圖表常用的方法
Excel VBA是利用Chart對(duì)象來創(chuàng)建圖表的。Chart對(duì)象和Charts對(duì)象集最常用的方法和屬性有:
2.1 Add()方法
Charts對(duì)象集的 Add()方法用于向圖表集合中添加新的圖表對(duì)象。例:
Set mychart = charts.Add
表示在活動(dòng)圖表之前插入一個(gè)新的圖表,并將返回值保存在mychart對(duì)象變量中,以便需要時(shí)通過該變量來訪問該圖表。
2.2 Location()方法
Add()方法創(chuàng)建的圖表只存在于內(nèi)存,要在工作表中看到新創(chuàng)建的圖表,必須指定圖表的顯示位置。Location()方法即是指定新創(chuàng)建的圖表的插入位置的。其語法如下:
Chart.Location(Where,Name)
Where用于指定圖表的插入位置:xlLocationAsNewSheet指定新圖表作為新工作表插入工作簿中,此時(shí)Name為新工作表的名稱(可省略);xlLocationAsObject指定新創(chuàng)建的圖表作為圖像元素插入到工作表中,此時(shí)Name為要插入的工作表的名稱。
2.3 SetSourceData()方法
SetSourceData()方法用來指定作圖的源數(shù)據(jù)區(qū)域。其語法為:
Chrat.SetSourceData(Source,PlotBy)
其中,source用于指定數(shù)據(jù)源,可將Range對(duì)象傳說遞給該參數(shù)。PlotBy用于指定數(shù)據(jù)繪制方法,如果傳遞系統(tǒng)常量xlColumns則表示數(shù)據(jù)在列上生成(系列產(chǎn)生在列);如果傳遞系統(tǒng)常量xLRows,則表示數(shù)據(jù)在行上生成(系列產(chǎn)生在行)。
SetSourceData()方法雖然能很方便地指定數(shù)據(jù)源,但該方法不可以接受分散的單元格區(qū)域作為圖表的數(shù)據(jù)源。當(dāng)需要靈活地操縱圖表的數(shù)據(jù)源時(shí),需使用SeriesCollection()方法。
2.4 SeriesCollection()方法
SeriesCollection是Series對(duì)象的集合對(duì)象。Series對(duì)象表示圖表中的一個(gè)系列。系列是一個(gè)圖表中用于比較的一組數(shù)據(jù),SeriesCollection即是保存這些系列的集合。系列在不同的圖表中有不同的含義。在折線圖中,每條線即是一個(gè)系列,雷達(dá)圖中每個(gè)區(qū)域即是一個(gè)系列,餅圖只有一個(gè)系列。
Series對(duì)象中常用的屬性有Name、Values和XValues。其中Name屬性表示該系列的名稱,會(huì)在圖表的圖例區(qū)域顯示出來;Values屬性表示該系列的實(shí)際值,用于確定圖表中圖形位置的形狀;XValues屬性表示該系列的橫坐標(biāo)值,傳統(tǒng)在圖表的橫坐標(biāo)上顯示出來。
Values和XValues屬性必須用Range對(duì)象來指定,不可指定為變量的值。如:
Chrat.SeriesCollection(1).values=Rang(“B1:B5”)
Chrat.SeriesCollection(1).Xvalues=Rang(“A1:A5”)
SeriesCollection()方法可以自由地控制圖表中所有的顯示數(shù)據(jù),通過它,程序可以自由地操縱圖表抽需的每一個(gè)數(shù)據(jù),因此比SetSourceData()方法更為靈活。
2.5 Axes()方法
Chart對(duì)象的Axes()方法返回圖表上單個(gè)坐標(biāo)軸或坐標(biāo)軸集合的某個(gè)對(duì)象。該方法的語法如下:
Chart.Axes(Type,AxisGroup)
Type參數(shù)用于指定要返回的坐標(biāo)軸,可以是以下系統(tǒng)常量之一:數(shù)值軸—xlValue、分類軸—xlCategory或用于三維圖表,表示縱深軸向的xlSeriesAxis。
通過Axes()方法,可以控制圖表上坐標(biāo)軸的相關(guān)屬性,如坐標(biāo)軸顯示的標(biāo)題、坐標(biāo)軸的刻度等。
2.6 ChartType屬性
ChartType屬性用于指定圖表的類型。常用圖表類型和ChartType 屬性值的對(duì)應(yīng)關(guān)系如表1。
3 作圖數(shù)據(jù)
將計(jì)算結(jié)果轉(zhuǎn)換成易于作圖的形式,如圖1。圖中每一行數(shù)據(jù)將繪制一張圖。
4 程序?qū)嵗白⒔?/p>
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 ‘錯(cuò)誤陷井
For r = 1 To 270 ‘第2行至第271行為需作圖的數(shù)據(jù),每一行數(shù)據(jù)需作一張圖
Worksheets("年均值").Activate
Set mycell = Worksheets("年均值").Range(Cells(r + 1, 1), Cells(r + 1, 12)) ‘指定作圖數(shù)據(jù)源
Set isect = Application.Intersect(Worksheets("年均值").Range("c2: l271"), mycell)
‘計(jì)算數(shù)據(jù)源的首個(gè)單元格的行號(hào)、列號(hào)和總列數(shù)
i = isect.Row
m = isect.Column
n = m + isect.Columns.Count – 1
‘查尋工作簿中是否存在與欲建圖表同名的圖表,若無則新建一個(gè)圖表,若有則激活該圖表
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 ‘指定圖表類型為數(shù)據(jù)點(diǎn)折線圖
ActiveChart.SetSourceData Source:=mycell, PlotBy:=xlRows ‘指定作圖的數(shù)據(jù)源,系列產(chǎn)生在行
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 ‘創(chuàng)建的新圖表作為新工作表插入到工作簿中
With ActiveChart
.HasTitle = True ‘指定要顯示圖表標(biāo)題
.ChartTitle.Characters.Text = Worksheets("年均值").Cells(i - 1, 1) & Worksheets("年均值").Cells(i - 1, 2) & "十年變化趨勢(shì)" ‘指定圖表標(biāo)題的文字
.Axes(xlCategory, xlPrimary).HasTitle = True ‘指定顯示分類軸標(biāo)題
.Axes(xlCategory, xlPrimary).AxisTitle.Characters.Text = "年份" ‘指定分類軸標(biāo)題的文字
.Axes(xlValue, xlPrimary).HasTitle = True ‘指定顯示數(shù)值軸標(biāo)題
.Axes(xlValue, xlPrimary).AxisTitle.Characters.Text = "離子濃度(μeq/L)" ‘指定數(shù)值軸標(biāo)題的文字
End With
With ActiveChart.Axes(xlCategory)
.HasMajorGridlines = True ‘指定顯示分類軸的主網(wǎng)格線
.HasMinorGridlines = False ‘指定不顯示分類軸的次網(wǎng)格線
End With
With ActiveChart.Axes(xlValue)
.HasMajorGridlines = True ‘指定顯示數(shù)值軸的主網(wǎng)格線
.HasMinorGridlines = False ‘指定不顯示數(shù)值軸的次網(wǎng)格線
End With
Next r
esc:
Exit Sub
End Sub
‘查同名圖表的自定義函數(shù)
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 結(jié)論
所列程序能實(shí)現(xiàn)自動(dòng)繪制Excel折線圖,具有實(shí)用性。
程序的運(yùn)行,既可以在Excel的Visual Basic編輯器中運(yùn)行,也可以通過在菜單或工具欄建立相應(yīng)的運(yùn)行命令或按鈕來運(yùn)行,當(dāng)然也可建立一個(gè)窗體,通過命令按鈕來運(yùn)行。因?yàn)槌隽吮疚挠懻摰姆秶?,不再贅述?/p>
作者簡介
劉美麗,講師,研究方向?yàn)橛?jì)算機(jī)應(yīng)用。
作者單位
長沙環(huán)境保護(hù)職業(yè)技術(shù)學(xué)院 湖南省長沙市 410004