【因本人有實(shí)際工作需要整理的代碼,這里貼一個(gè)簡(jiǎn)單的框架用作筆記,同時(shí)提供給有需求的朋友?!?/p>

通過(guò)“試題庫(kù)轉(zhuǎn)Word版本”這樣一個(gè)應(yīng)用實(shí)例,學(xué)習(xí)VBA在和Word數(shù)據(jù)交互處理中的應(yīng)用。本代碼是運(yùn)行在環(huán)境中,實(shí)現(xiàn)對(duì)Word的操作,與直接在Word中寫(xiě)VBA代碼還是有些許區(qū)別的。

一、實(shí)例背景

實(shí)例:試題庫(kù)轉(zhuǎn)Word版本

素材:版本的試題庫(kù),各章節(jié)的試題分別保存在不同的工作簿中,每章節(jié)包含單選題、多選題和判斷題三類題型(即每個(gè)工作薄中分別包含以上三類習(xí)題)。素材結(jié)果如下圖所示:

圖1:各章節(jié)試題工作簿

圖2:每章節(jié)試題樣式

目標(biāo):將各章節(jié)試題匯總,按照題型分類,分別保存到Word文檔中,基本格式如下:

1.題干
A.選項(xiàng)
B.選項(xiàng)
C.選項(xiàng)
D.選項(xiàng)
試題難度:難
試題答案:ABC

要求對(duì)Word進(jìn)行基本的排版,包含對(duì)試題進(jìn)行編號(hào)、字體及字號(hào)設(shè)置等。

二、VBA實(shí)現(xiàn)說(shuō)明

手工操作需要重復(fù)大量的復(fù)制粘貼操作,人工耗費(fèi)大且效率低下。VBA不僅能用于處理數(shù)據(jù),同樣可以處理Word內(nèi)容,進(jìn)行排版等操作。因此,借助VBA工具作為橋梁,實(shí)現(xiàn)與Word數(shù)據(jù)交互處理,提高工作效率。

下面,通過(guò)代碼分解說(shuō)明具體實(shí)現(xiàn)過(guò)程。

1.創(chuàng)建Word 對(duì)象引用并新建空白文檔

VBA對(duì)于的處理比較簡(jiǎn)單,之前也有介紹,這里不作過(guò)多說(shuō)明。主要介紹如何處理Word對(duì)象,第一個(gè)問(wèn)題就是建立一個(gè)對(duì)Word 對(duì)象的引用。

????'創(chuàng)建word應(yīng)用對(duì)象
????Dim?WordApp?As?Object
????Set?WordApp?=?CreateObject("Word.Application")

????'創(chuàng)建word文檔對(duì)象,并新建文檔
????Dim?SinDoc?As?Object
????Set?SinDoc?=?WordApp.documents.Add

2.向Word文檔中插入文字內(nèi)容

以上代碼實(shí)現(xiàn)了Word 對(duì)象的應(yīng)用,并創(chuàng)建了一個(gè)新的空白文檔。接下來(lái),就要往該文檔中插入內(nèi)容。

????Dim?SinC?As?Object
????Set?SinC?=?SinDoc.Content

????'插入內(nèi)容
????SinC.InsertAfter?"測(cè)試內(nèi)容"?&?vbCrLf
????SinC.InsertParagraphAfter

通過(guò)..的方式在文檔末尾插入內(nèi)容,其中表示插入一個(gè)換行符(相當(dāng)于回車);通過(guò)..的方式在文檔末尾添加一個(gè)空段落(相當(dāng)于兩次回車)。

3.段落格式調(diào)整

以上基本簡(jiǎn)單介紹了如何新建Word 對(duì)象的引用,新建空白文檔及文字內(nèi)容插入等方法,接下來(lái)要做的事情就是格式調(diào)整,這里僅介紹簡(jiǎn)單的格式調(diào)整,包括字體、字號(hào)、段落對(duì)齊方式及段落首行縮進(jìn)。

Sub?SetFont(ChosedDoc,?FontName,?FontSize,?Optional?Alig?=?0,?Optional?Inde?=?2)

????With?ChosedDoc.Paragraphs(ChosedDoc.Paragraphs.Count).Range
????????.Font.Name?=?FontName?'字體
????????.Font.Size?=?FontSize?'字號(hào)
????????.ParagraphFormat.Alignment?=?Alig?'對(duì)齊方式
????????.ParagraphFormat.CharacterUnitFirstLineIndent?=?Inde?'首行縮進(jìn)
????End?With

End?Sub

為了排版美觀,對(duì)題干及選項(xiàng)等文字內(nèi)容設(shè)置不同的格式,所以對(duì)段落格式調(diào)整比較頻繁,幾乎每次插入都需要設(shè)置該段落的格式,因此將段落格式調(diào)整單獨(dú)寫(xiě)進(jìn)了一個(gè)函數(shù),并且包含兩個(gè)默認(rèn)參數(shù)。對(duì)齊方式:0表示左對(duì)齊,1表示居中對(duì)齊,2表示右對(duì)齊。首行縮進(jìn),直接指定縮進(jìn)量,一般為2,即兩個(gè)空格。

以上就是本實(shí)例中所有涉及到的對(duì)Word對(duì)象的操作,剩余的就是針對(duì)問(wèn)題場(chǎng)景的解決方案流程設(shè)計(jì),沒(méi)有太多新鮮的東西。

三、VBA排版結(jié)果1.VBA排版前后文件

如圖3是運(yùn)行前素材,我們將各章節(jié)試題庫(kù)放在文件夾“試題”下,工作簿“試題轉(zhuǎn)word工具代碼 - v1.0.et”中包含所需的VBA代碼。運(yùn)行該段代碼后,得到如圖4的結(jié)果,相比運(yùn)行前,多了三個(gè)Word文檔,分別保存單選題、多選題和判斷題。

圖3:運(yùn)行前素材

圖4:運(yùn)行后結(jié)果2.排版效果及前后對(duì)比

首先,我們先看一下排版前試題庫(kù)內(nèi)容及格式,如圖5-8:

圖5:第1章 地理題

圖6:第2章 人文題

圖7:第3章 數(shù)學(xué)題

排版后的效果:

圖8:?jiǎn)芜x題排版效果

圖9:多選題排版效果

圖10:判斷題排版效果

排版結(jié)果目前還比較簡(jiǎn)單,主要是沒(méi)有在代碼中深加工,完全可以根據(jù)自己的需求進(jìn)行深加工。

四、附代碼

運(yùn)行該段代碼前,請(qǐng)務(wù)必將正在編輯的Word文檔保存,以免內(nèi)容丟失。或者注釋掉.Quit。

Option?Explicit

'======================================
'作者:劉**;
'日期:2019-04-22;
'功能:Excel題庫(kù)轉(zhuǎn)Word版本;
'======================================

Public?Sub?ExcelToWord()

'創(chuàng)建word應(yīng)用對(duì)象
????Dim?WordApp?As?Object
????Set?WordApp?=?CreateObject("Word.Application")
????WordApp.Visible?=?True

????'創(chuàng)建word文檔對(duì)象,并新建文檔
????Dim?SinDoc?As?Object,?MulDoc?As?Object,?JudDoc?As?Object
????Set?SinDoc?=?WordApp.documents.Add
????Set?MulDoc?=?WordApp.documents.Add
????Set?JudDoc?=?WordApp.documents.Add

????Dim?SinC?As?Object,?MulC?As?Object,?JudC?As?Object
????Set?SinC?=?SinDoc.Content
????Set?MulC?=?MulDoc.Content
????Set?JudC?=?JudDoc.Content

????'插入標(biāo)題,設(shè)置格式
????Call?SetFont(SinDoc,?"黑體",?18,?1)
????SinC.InsertAfter?"單選題"?&?vbCrLf
????SinC.InsertParagraphAfter

????Call?SetFont(MulDoc,?"黑體",?18,?1)
????MulC.InsertAfter?"多選題"?&?vbCrLf
????MulC.InsertParagraphAfter

????Call?SetFont(JudDoc,?"黑體",?18,?1)
????JudC.InsertAfter?"判斷題"?&?vbCrLf
????JudC.InsertParagraphAfter

????'Excel試題文件對(duì)象
????Dim?QuenWb?As?Workbook,?QuenSht?As?Worksheet
????Dim?FileName?As?String
????FileName?=?Dir(ThisWorkbook.Path?&?"/"?&?"Excel試題"?&?"/"?&?"*.et")

????'統(tǒng)計(jì)各類試題題目數(shù)(用以添加題號(hào))
????Dim?SinNum?As?Integer,?MulNum?As?Integer,?JudNum?As?Integer
????SinNum?=?1
????MulNum?=?1
????JudNum?=?1

????'一些循環(huán)變量
????Dim?TotalRows?As?Integer,?i?As?Integer,?j?As?Integer,?loc?As?Byte

????'聲明試題類型、試題內(nèi)容、答案等對(duì)象
????Dim?QuenType?As?String,?QuenStr?As?String,?Answer?As?String

????'循環(huán)處理Excel試題文件(支持多文件試題匯總處理)
????Do?While?FileName?<>?""

????????'Excel試題文件
????????Workbooks.Open?ThisWorkbook.Path?&?"/"?&?"Excel試題"?&?"/"?&?FileName,?ReadOnly:=True
????????Set?QuenWb?=?ActiveWorkbook
????????Set?QuenSht?=?QuenWb.Sheets(1)
????????TotalRows?=?QuenSht.UsedRange.Rows.Count?'Excel文件已使用行數(shù)

????????'循環(huán)處理行
????????For?i?=?1?To?TotalRows

????????????'獲取并判斷試題類型
????????????QuenType?=?QuenSht.Range("A"?&?i).Value
????????????On?Error?Resume?Next
????????????loc?=?0?'初始化,避免保留上次殘留值
????????????loc?=?WorksheetFunction.Match(QuenType,?Array("判斷題",?"單選題",?"多選題"),?0)
????????????On?Error?GoTo?0

????????????'非試題標(biāo)記,跳過(guò)不處理
????????????If?loc?=?0?Then
????????????????GoTo?nexti
????????????End?If

????????????'處理答案內(nèi)容,將數(shù)字標(biāo)記替換為字母(或?qū)﹀e(cuò))
????????????Answer?=?QuenSht.Range("D"?&?i).Value
????????????If?QuenType?<>?"判斷題"?Then
????????????????Answer?=?Replace(Answer,?"1",?"A")
????????????????Answer?=?Replace(Answer,?"2",?"B")
????????????????Answer?=?Replace(Answer,?"3",?"C")
????????????????Answer?=?Replace(Answer,?"4",?"D")
????????????Else
????????????????Answer?=?Replace(Answer,?"1",?"√")
????????????????Answer?=?Replace(Answer,?"2",?"×")
????????????End?If

????????????'根據(jù)不同試題類型,依次處理
????????????If?QuenType?=?"單選題"?Then
????????????????'設(shè)置字體格式(試題標(biāo)題格式)
????????????????Call?SetFont(SinDoc,?"黑體",?12)
????????????????'插入試題標(biāo)題
????????????????QuenStr?=?SinNum?&?"."?&?QuenSht.Range("C"?&?i).Value?&?vbCrLf
????????????????SinC.InsertAfter?QuenStr
????????????????'設(shè)置字體格式(標(biāo)題之外內(nèi)容)
????????????????Call?SetFont(SinDoc,?"楷體",?12)
????????????????'插入試題選項(xiàng)、難易程度、答案等內(nèi)容
????????????????QuenStr?=?"A."?&?QuenSht.Range("E"?&?i).Value?&?vbCrLf?&?"B."?&?QuenSht.Range("F"?&?i).Value?&?vbCrLf?&?"C."?&?QuenSht.Range("G"?&?i).Value?&?vbCrLf?&?"D."?&?QuenSht.Range("H"?&?i).Value?&?vbCrLf?_
??????????????????????????&?"難易程度:"?&?QuenSht.Range("B"?&?i).Value?&?vbCrLf?_
??????????????????????????&?"試題答案:"?&?Answer?&?vbCrLf
????????????????SinC.InsertAfter?QuenStr
????????????????SinC.InsertParagraphAfter?'插入空白段落
????????????????'該類型題目數(shù)量加1
????????????????SinNum?=?SinNum?+?1

????????????ElseIf?QuenType?=?"多選題"?Then

????????????????Call?SetFont(MulDoc,?"黑體",?12)
????????????????QuenStr?=?MulNum?&?"."?&?QuenSht.Range("C"?&?i).Value?&?vbCrLf
????????????????MulC.InsertAfter?QuenStr

????????????????Call?SetFont(MulDoc,?"楷體",?12)
????????????????QuenStr?=?"A."?&?QuenSht.Range("E"?&?i).Value?&?vbCrLf?&?"B."?&?QuenSht.Range("F"?&?i).Value?&?vbCrLf?&?"C."?&?QuenSht.Range("G"?&?i).Value?&?vbCrLf?&?"D."?&?QuenSht.Range("H"?&?i).Value?&?vbCrLf?_
??????????????????????????&?"難易程度:"?&?QuenSht.Range("B"?&?i).Value?&?vbCrLf?_
??????????????????????????&?"試題答案:"?&?Answer?&?vbCrLf
????????????????MulC.InsertAfter?QuenStr
????????????????MulC.InsertParagraphAfter

????????????????MulNum?=?MulNum?+?1

????????????ElseIf?QuenType?=?"判斷題"?Then

????????????????Call?SetFont(JudDoc,?"黑體",?12)
????????????????QuenStr?=?JudNum?&?"."?&?QuenSht.Range("C"?&?i).Value?&?"(?)"?&?vbCrLf
????????????????JudC.InsertAfter?QuenStr

????????????????Call?SetFont(JudDoc,?"楷體",?12)
????????????????QuenStr?=?"難易程度:"?&?QuenSht.Range("B"?&?i).Value?&?vbCrLf?_
??????????????????????????&?"試題答案:"?&?Answer?&?vbCrLf
????????????????JudC.InsertAfter?QuenStr
????????????????JudC.InsertParagraphAfter

????????????????JudNum?=?JudNum?+?1

????????????Else
????????????????MsgBox?"出錯(cuò)!請(qǐng)檢查題目類型"?&?"“"?&?QuenType?&?"”"?&?"是否為預(yù)期內(nèi)容!"?'正常情況下此句不會(huì)執(zhí)行
????????????End?If

nexti:????????????Next?i

????????'關(guān)閉Excel試題文件
????????QuenWb.Close

????????'下一個(gè)Excel試題文件
????????FileName?=?Dir

????Loop

????'保存并關(guān)閉word文檔
????SinDoc.SaveAs?ThisWorkbook.Path?&?"/"?&?"單選題.wps"
????MulDoc.SaveAs?ThisWorkbook.Path?&?"/"?&?"多選題.wps"
????JudDoc.SaveAs?ThisWorkbook.Path?&?"/"?&?"判斷題.wps"
????SinDoc.Close
????MulDoc.Close
????JudDoc.Close

????'退出word應(yīng)用
????WordApp.Quit

End?Sub


'設(shè)置段落格式
Sub?SetFont(ChosedDoc,?FontName,?FontSize,?Optional?Alig?=?0,?Optional?Inde?=?2)

????With?ChosedDoc.Paragraphs(ChosedDoc.Paragraphs.Count).Range
????????.Font.Name?=?FontName?'字體
????????.Font.Size?=?FontSize?'字號(hào)
????????.ParagraphFormat.Alignment?=?Alig?'對(duì)齊方式
????????.ParagraphFormat.CharacterUnitFirstLineIndent?=?Inde?'首行縮進(jìn)
????End?With

End?Sub