摘要:VBA是一種內(nèi)嵌于某種應(yīng)用程序的編程語(yǔ)言,如Excel。編程人員可以通過(guò)VBA語(yǔ)言,操縱Excel對(duì)象模型實(shí)現(xiàn)自動(dòng)處理數(shù)據(jù)的功能。該文介紹了三個(gè)VBA在日常辦公與教學(xué)中的Excel應(yīng)用案例:Excel操作題自動(dòng)評(píng)分、數(shù)據(jù)快捷輸入、合并數(shù)據(jù)表記錄。這三個(gè)應(yīng)用案例很有代表性,通過(guò)簡(jiǎn)單地修改就可以應(yīng)用到其它方面。
關(guān)鍵詞:Excel;VBA;辦公自動(dòng)化
中圖分類(lèi)號(hào):TP311 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1009-3044(2013)12-2819-03
VBA是一種內(nèi)嵌于某種應(yīng)用程序的編程語(yǔ)言,如Excel。通過(guò)VBA的編程,可以使Excel自動(dòng)完成一些工作,如大批量的數(shù)據(jù)復(fù)制與粘貼、工作表的合并。VBA是VB語(yǔ)言的子集,只要掌握了VB語(yǔ)言就能自然地應(yīng)用VBA。VBA是針對(duì)應(yīng)用程序編程,確切的說(shuō)是針對(duì)應(yīng)用程序的對(duì)象模型編程。Excel作為一款優(yōu)秀的數(shù)據(jù)處理軟件,通過(guò)可視化操作,就能實(shí)現(xiàn)強(qiáng)大的數(shù)據(jù)處理功能。同時(shí),它還對(duì)外公布了它的對(duì)象模型,編程人員可以通過(guò)VBA語(yǔ)言,操縱Excel相關(guān)對(duì)象而實(shí)現(xiàn)數(shù)據(jù)處理功能。VBA語(yǔ)言給Excel插上了飛翔的翅膀。
以下通過(guò)三個(gè)日常辦公與教學(xué)中的常用案例,介紹VBA在Excel中的高級(jí)應(yīng)用。
1 Excel操作題自動(dòng)評(píng)分
在Excel教學(xué)中,我們經(jīng)常會(huì)布置一些Excel操作題給學(xué)生做,但這些操作題如何不是某個(gè)考試軟件中的題目,往往要由教師手動(dòng)給學(xué)生評(píng)分,一方面工作量很大,另一方面,往往帶有主觀意見(jiàn),對(duì)學(xué)生不公平。其實(shí)我們可以利用VBA編程,實(shí)現(xiàn)操作題自動(dòng)評(píng)分。
例如有這么一個(gè)操作題:
1)選擇工作表sheet1,用求平均值函數(shù)求出每人的平均成績(jī),依次放在E3到E6的單元格中。
2)把標(biāo)題行A1-E1合并單元格,把標(biāo)題“學(xué)生成績(jī)表”設(shè)為20號(hào)宋體,居中,并把字體設(shè)置為紅色。
3)把sheet1工作表名改為:學(xué)生成績(jī)表
我們可以編寫(xiě)如下程序,實(shí)現(xiàn)該操作題自動(dòng)評(píng)分。
Sub 自動(dòng)評(píng)分()
Dim Grade As Integer ‘Grade-分?jǐn)?shù)
For i = 3 To 6
If Range("E" & i).Formula = "=AVERAGE(B" & i & ":D" & i & ")" Then Grade = Grade + 2
Next
If Range("A1:E1").MergeCells = True Then Grade = Grade + 2
If Range("A1:E1").HorizontalAlignment = xlCenter Then Grade = Grade + 2
If Range("A1:E1").Font.Size = 20 Then Grade = Grade + 2
If Range("A1:E1").Font.ColorIndex = 3 Then Grade = Grade + 3
If ActiveSheet.Name = "學(xué)生成績(jī)表" Then Grade = Grade + 3
MsgBox Grade
End Sub
編程思想其實(shí)很簡(jiǎn)單,就是用IF語(yǔ)句對(duì)操作題的各個(gè)對(duì)象屬性進(jìn)行檢測(cè),如符合要求,則加分,否則不加。如對(duì)對(duì)象屬性不熟悉,可以先錄制宏,得到相應(yīng)的屬性代碼。
2 數(shù)據(jù)快速輸入
在日常辦公中,經(jīng)常會(huì)遇到這種情況,Excel的 某一列就是常用的幾個(gè)數(shù)據(jù),如某一工作表第三列是職稱,教師中常見(jiàn)的職稱就是教授、副教授、講師和助教。對(duì)于這些數(shù)據(jù),我們可以分別以代號(hào)來(lái)表示,如1為教授、2為副教授、3為講師、4為助教。編寫(xiě)如下代碼,那只要輸入1,應(yīng)自動(dòng)轉(zhuǎn)變?yōu)榻淌冢渌?lèi)似。
Private Sub Worksheet_Change(ByVal Target As Range)
‘ worksheet_change(),是工作表數(shù)據(jù)發(fā)生改變的事件
‘Target是當(dāng)前操作的單元格
If Target.Column = 3 Then
‘第三列職稱,如要在其它列中實(shí)現(xiàn)這個(gè)功能,則改為其它列
If Target.Value = 1 Then Target.Value = "教授"
If Target.Value = 2 Then Target.Value = "副教授"
If Target.Value = 3 Then Target.Value = "講師"
If Target.Value = 4 Then Target.Value = "助教"
‘編號(hào)與職稱相對(duì)應(yīng),如性別,1-男,2-女,則相應(yīng)改變其代碼。
End If
End Sub
3 合并數(shù)據(jù)表記錄
我們?cè)谵k公中經(jīng)常會(huì)遇到這種情況,組織部門(mén)需要收集單位員工在某一方面的信息,這時(shí)工作人員首先會(huì)向員工發(fā)一份Excel文件,其中包含有要求員工填寫(xiě)的相關(guān)信息,有的還會(huì)給出了一個(gè)樣例。員工按要求填寫(xiě)好信息后發(fā)回給工作人員,那工作人員需要將每一位員工的工作表打開(kāi),復(fù)制相關(guān)信息粘貼到一個(gè)總表中。如果這樣的工作表很多,如幾百上千份,這將是一個(gè)非常繁瑣而且容易出錯(cuò)的工作。那么我們能不能用VBA編程實(shí)現(xiàn)自動(dòng)合并這些數(shù)據(jù)表的記錄呢?
如某高校圖書(shū)館面向全校各部門(mén)征集圖書(shū)采購(gòu)信息,工作人員制作了圖表1的Excel工作表,并將工作表分發(fā)給各部門(mén)。
圖1
Excel文件只有一個(gè)工作表(sheet1),工作表的第一行是表頭信息,第二行是收集圖書(shū)的信息,第三行給出了一個(gè)填寫(xiě)樣例,并要求員工不要?jiǎng)h除。員工按要求填寫(xiě)好數(shù)據(jù)發(fā)回給工作人員,工作人員將這些文件放在一個(gè)文件目錄下,并新建一個(gè)新的Excel文件,命名為圖書(shū)信息總表.xls。
這些Excel工作表具有相同的字段信息,除第一條記錄外,我們需要將其它工作表的記錄合并到圖書(shū)信息總表中。在總表中編寫(xiě)宏代碼,就可以實(shí)現(xiàn)。代碼及相應(yīng)解釋如下。
Sub HB()
'變量說(shuō)明:MyPath -文件路徑;m-分表的行數(shù);n-總表的當(dāng)前行數(shù)
'XLSName-分表的文件名;WB-分表的工作簿變量
Dim MyPath As String, XlsName As String
Dim m As Integer, n As Integer
Dim WB As Workbook
Application.ScreenUpdating = True
MyPath = ThisWorkbook.Path '獲取當(dāng)前文件的路徑
If Right(MyPath, 1) <> "\" Then MyPath = MyPath & "\"
'視情況,將路徑補(bǔ)充完整
XlsName = Dir(MyPath & "*.xls") '得到當(dāng)前路徑下的第一個(gè)EXCEL文件
Do While XlsName <> ""
If XlsName <> ThisWorkbook.Name Then
'除總表之外的分表進(jìn)行合并記錄到總表
Set WB = Application.Workbooks.Open(MyPath & XlsName) '打開(kāi)分表
m = WB.Sheets(1).[a65536].End(xlUp).Row '得到分表的行數(shù)
WB.Sheets(1).Range("a3:h" & m).Copy
'復(fù)制分表a列到h列,第四行到最后一行區(qū)域的記錄
n = ThisWorkbook.Sheets(1).[a65536].End(xlUp).Row '得到總表當(dāng)前的行數(shù)
ThisWorkbook.Sheets(1).Paste Destination:=ThisWorkbook.Sheets(1).Range("a" & n + 1)
'從總表當(dāng)前最后一行的下一行開(kāi)始粘貼內(nèi)容,即追加記錄
Application.CutCopyMode = False '清空剪貼板內(nèi)容
WB.Close '關(guān)閉分表
End If
XlsName = Dir '取得下一個(gè)分表文件名
Loop
End Sub
上述程序代碼具有很大的通用性,對(duì)于類(lèi)似的辦公操作,只要按上述要求,并將代碼復(fù)制到總表,根據(jù)情況修改WB.Sheets(1).Range("a3:h" & m).Copy中的參數(shù)即可,如果是從第10行開(kāi)始復(fù)制到最后一行,工作表的列數(shù)為B到P列,則該語(yǔ)句改為WB.Sheets(1).Range("B10:P" & m).Copy。
4 結(jié)束語(yǔ)
通過(guò)以上三個(gè)案例,足以說(shuō)明VBA在Excel中的地位。通過(guò)VBA編程,可以使Excel的功能更為強(qiáng)大,可以極大提高我們的工作效率。
參考文獻(xiàn):
[1] 博彥科技.Office VBA編程高手[M].北京:北京大學(xué)出版社,2001.
[2] 韓小良.Excel VBA工資管理應(yīng)用案例詳解[M].北京:中國(guó)鐵道出版社,2006.
[3] 陳永強(qiáng).例學(xué)VBA Excel/Access/PowerPoint中的VBA高效應(yīng)用[M].北京:中國(guó)鐵道出版社,2010.