唐 燕,韓愛慶,翟 興
(北京中醫(yī)藥大學信息中心,北京 100029)
在日常工作和生活中,隨著計算機的普及和各行各業(yè)信息化程度的不斷提高,經(jīng)常會有各種各樣的調查問卷電子文檔需要大家填寫,當調查問卷的主辦方收集到這些大量的文檔后,如何將有價值的信息從每個文檔中提取出來,并匯總在數(shù)據(jù)庫或電子表格中就變得非常重要;類似地,企事業(yè)單位的人事處、財務處、科研處等部門也經(jīng)常要求大家填寫各種給定格式的文檔,這些部門收集到員工們填寫的文檔后,也經(jīng)常需要從這些文檔中提取相關的信息并匯總統(tǒng)計數(shù)據(jù)。這樣的應用非常廣泛,也很普遍。然而,目前缺乏現(xiàn)成的工具或軟件去自動獲取收集到的文檔中的信息,往往都是靠手工完成的,效率非常低下,還很容易出錯。筆者在實際應用中,使用VBA編程,實現(xiàn)了將大量Word文檔中的信息快速自動讀取到Excel中的功能。
學校的人事處向全校教師下發(fā)了一份Word格式調查問卷,調查的內(nèi)容涉及教師的個人信息、參加項目、發(fā)表論文以及教學工作量的情況。調查問卷的部分內(nèi)容如圖1所示。
圖1 一份調查問卷的部分內(nèi)容
在這份調查問卷中,有文字描述也有很多張表格。人事處收集到所有教師填寫的Word文檔后,需要將每個人在這些文檔中填寫的個人信息、課題、論文等方面的情況匯總在一個數(shù)據(jù)庫或Excel電子表格中,以方便進一步統(tǒng)計分析。如果采用人工提取數(shù)據(jù)的方法,需要打開每份調查問卷,逐項復制,這樣,不但花費大量的時間,而且工作效率非常低下,并且操作者也會感到枯燥繁瑣,稍不留神,還很容易出錯。筆者采用的方法是在Excel中使用VBA編寫程序,自動掃描每份調查問卷文檔,在分秒間即可完成所有問卷的數(shù)據(jù)自動讀取。這種方法,節(jié)省了大量的人力和時間,效率很高,值得借鑒。
VBA(Visual Basic for Applications)是新一代標準宏語言,是基于Visual Basic for Windows發(fā)展而來的,是Visual Basic程序設計語言的子集。與VB不同的是VBA要求有一個宿主應用程序才能運行,比如Excel、Word等,不能用于創(chuàng)建獨立應用程序。正因為這樣,VBA在執(zhí)行過程中與宿主應用程序緊密結合,不需要運用其它工具即可創(chuàng)建功能強大的個性化桌面應用程序。和其它編程語言一樣,VBA中也有常用數(shù)據(jù)類型、結構體、數(shù)組、流程控制、函數(shù)等編程基本元素。在Word、Excel等Office軟件中都可以利用VBA進行二次開發(fā),從而改進Office應用程序的功能,使得Office軟件能根據(jù)用戶的需求實現(xiàn)更多的功能。
筆者在Excel中,使用VBA編程,將同一目錄下的所有Word文檔逐一打開,提取需要的信息,并將信息顯示在Excel中。通過程序自動讀取數(shù)據(jù),可以快速將大量的Word文檔中的數(shù)據(jù)讀取并整合在Excel中。在Excel中,利用其強大的數(shù)據(jù)處理能力,可以進行進一步的數(shù)據(jù)分析與統(tǒng)計。
當收集到Word版本的調查問卷時,將所有的文檔放在同一個文件夾里。文件的組織如圖2所示。
圖2 Word文件組織結構
創(chuàng)建Excel文件,分多個Sheet存儲數(shù)據(jù)。根據(jù)Word文檔中不同主題的調查數(shù)據(jù),創(chuàng)建不同的Sheet,并為每個Sheet創(chuàng)建由多個字段組成的表的基本結構。其中,字段需要從調查表中提取關鍵信息,一個Sheet中,可以有多個字段組成表頭。根據(jù)這份調查問卷的內(nèi)容,Excel文件的結構如圖3所示。
圖3 Excel文件的結構
在Excel中,添加按鈕,編寫按鈕的單擊事件,實現(xiàn)所有Word文檔的數(shù)據(jù)提取。
算法中將Word文檔中的內(nèi)容分成2個部分,一部分是以回車結束的各段的文本描述信息的讀取,另一部分是以表格形式展示的各張表格數(shù)據(jù)的讀取。算法中將文本描述信息放置在Excel中的第一個Sheet中,并命名為個人信息;其余各張表格的數(shù)據(jù)分別放在不同的Sheet中,分別命名為工作情況、項目情況、論文情況、教學工作量。
(1)定義字符串變量 strFileName=Dir(This-Workbook.Path & "* .doc"),當 Len(strFileName)>0時,進入循環(huán)。定義Word文檔obDoc=appWD.Documents.Open(ThisWorkbook.Path & "" & str-FileName)并獲得要打開的Word的文件名。
(2)文本描述信息行數(shù)i=1,當i≤5時,開始循環(huán),strSel=obSel.Paragraphs(1).Range.Text選擇信息所在段落,strSel=Trim(Mid(strSel,InStr(strSel,":")+1))提取信息,sht.Cells(iRow,Chr(i+97))=strSel將信息寫入第一個Sheet中的單元格中。循環(huán)結束,文字描述信息部分提取完畢。
(3)Word文檔中的表格數(shù) iTableCount=1,當iTableCount≤obDoc.Tables.Count,遍歷 Word 中的所有表格。
(4)每張表格的行數(shù) i=2,當 i≤tbl.Rows.Count時,從第二行開始遍歷,如果 Len(Trim(tbl.Cell(i,1).Range.Text))>2,則 tbl.Rows(i).Select選擇該行,obSel.Copy復制該行內(nèi)容,sht.Cells(iRow,"b").PasteSpecial Paste:=xlPasteValues將選中的內(nèi)容粘貼到Excel單元格中,iRow=iRow+1。返回第(4)步繼續(xù)循環(huán),否則,當 i> tbl.Rows.Count時退出循環(huán)。
(5)返回第(3)步繼續(xù)循環(huán),否則,當iTableCount>obDoc.Tables.Count時,所有表格的內(nèi)容被讀出,循環(huán)結束。
(6)關閉當前的Word文檔,獲得下一個Word文檔名,返回第(1)步,繼續(xù)循環(huán),否則,當 Len(str-FileName)=0時,結束循環(huán)。
下面,通過對Excel中的讀取數(shù)據(jù)按鈕添加單擊事件,實現(xiàn)算法。具體代碼如下所示:
以上程序是針對圖1所示的調查問卷編寫的,要正常運行,必須在Excel中準備好Sheet名稱和每個Sheet中的表頭。如果調查問卷的形式、內(nèi)容發(fā)生了變化,需要修改程序中的Sheet名稱數(shù)組、個人信息數(shù)組和部分程序。在 Excel中還需要建立對應的Sheet和每個Sheet的表頭。也就是說,根據(jù)Word文檔的不同,只需稍作修改,程序即可適用。
本文介紹了VBA編程技術,并利用VBA技術解決在大量的調查問卷Word文檔中自動讀取數(shù)據(jù)到Excel文件的方法。這種方法可以用在其它類似的文檔統(tǒng)計分析中。擴展這項技術,也可以將Word格式文檔中的信息自動讀取數(shù)據(jù)到Access數(shù)據(jù)庫中。通過運行自動讀取程序,可以實現(xiàn)迅速自動獲取大量分散在各文件中的數(shù)據(jù),極大地提高了相關領域的工作效率,有效地降低了工作強度,值得推廣。
[1]彭小平,顏清.Word中基于VBA的實驗數(shù)據(jù)自動轉換技術[J].計算機與現(xiàn)代化,2006(4):7-8,23.
[2]孫曉偉,畢曉清,吳洪越,等.基于DOM和VBA的Word文檔數(shù)據(jù)交互式抽?。跩].計算機應用與軟件,2013,30(2):113-115.
[3]John Paul Mueller.VBA for Dummies[M].Wiley Publishing,2007.
[4]廖金輝,鄧勝軍.Excel工作表與Word表格的數(shù)據(jù)交換[J].信息技術,2006,30(5):20-23.
[5]韓愛慶,馬星光,張未未,等.基于VBA的Word格式轉為Unicode格式的方法[J].計算機與現(xiàn)代化,2013(9):236-238.
[6]林宮.基于OLE和VBA的數(shù)據(jù)庫與Word數(shù)據(jù)交互研究[J].福州大學學報:自然科學版,2006,34(6):831-835.
[7]Microsoft.Office for Developers[EB/OL].http://msdn.microsoft.com/en-us/office/,2013-09-30.
[8]Excel Home.Excel應用大全[M].北京:人民郵電出版社,2008:785-809.
[9]顧海花.VBA在Word和Excel數(shù)據(jù)交互中的應用[J].南通職業(yè)大學學報,2003,17(3):49-50.
[10]王殿佑.Word VBA應用程序在處理文檔未知重復內(nèi)容中的應用[J].電腦編程技巧與維護,2010(2):19-20.
[11]楊曉亮.Word VBA高效排版范例應用[M].北京:中國青年出版社,2005.
[12]范曉燕,周濤峰.利用VBA實現(xiàn)Word文檔的批量拆分與合并[J].電腦知識與技術,2011,7(7):1554-1556.
[13]湯懷.基于VBA技術的Word智能評分的設計與實現(xiàn)[J].福建電腦,2011,27(6):117-118,156.
[14]楊曉云,趙希武.基于VBA學位論文格式模板的設計[J].太原大學教育學院學報,2012,30(3):88-91.