用VBA操作Word_第1頁
用VBA操作Word_第2頁
用VBA操作Word_第3頁
用VBA操作Word_第4頁
用VBA操作Word_第5頁
已閱讀5頁,還剩3頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、用VBA操作Word(轉(zhuǎn))在所有 Office 應(yīng)用程序中,Microsoft Word 可能是應(yīng)用最廣泛的應(yīng)用程序,它還經(jīng)常在自定義 Office 解決方案中扮演重要的角色。開發(fā)人員用各種不同的方式使用 Word,有一些方式很簡單,而另一些極其復(fù)雜。無論涉及何種自定義解決方案,用 Visual Basic for Applications (VBA) 處理 Word 文檔的基本方法都是一樣的。在本欄目中,我將概括地介紹如何使用 Word,并提供一些關(guān)于如何運(yùn)用 Range 對象處理 Word 文檔內(nèi)容的詳細(xì)資料。理解基本方法在 Word 中,幾乎所有的操作都要調(diào)用 Document 對象本身

2、或其內(nèi)容。當(dāng)您用 VBA 操作 Word 時,Document 對象表示一個打開的文檔,而且所有的 Document 對象都是 Application 對象的 Documents 集合的成員。文檔是一個由字符、單詞、句子和段落組成的集合,字符組成單詞,單詞組成句子,句子組成段落,等等。因此,每一個 Document 對象都具有 Characters、Words、Sentences 和 Paragraghs 四個集合。此外,每個文檔具有一個包含一個或多個節(jié)的 Sections 集合,每一個節(jié)都有一個包含該節(jié)頁眉和頁腳的 HeadersFooters 集合。注意: 您可以在 Microsoft O

3、ffice 2000 開發(fā)人員對象模型指南(英文)中查閱完整的 Word 對象模型。另外,您也可以使用對象瀏覽器和 Microsoft Word Visual Basic 參考幫助來學(xué)習(xí)有關(guān)具體某個對象、屬性、方法和事件的詳細(xì)內(nèi)容。通過 VBA 使用 Word 時,Document 對象處于中心位置。如果您要打開文檔或創(chuàng)建新文檔,就要創(chuàng)建新的 Document 對象。每個打開或新創(chuàng)建的文檔均被添加至 Documents 集合。具有焦點(diǎn)的文檔稱為活動文檔,由 ActiveDocument 屬性表示。Document 對象作為 Documents 集合中的一個成員,您可以通過使用 Document

4、 對象的索引值(Document 對象在 Documents 集合中的位置,1 是集合中的第一個文檔)或名稱來引用它。另外,您也可以使用 ActiveDocument 屬性來引用當(dāng)前具有焦點(diǎn)的文檔。例如,如果名為 Policies.doc 的文檔是唯一打開的文檔,則以下三個對象變量將全部指向 Policies.doc:Dim docOne As Word.DocumentDim docTwo As Word.DocumentDim docThree As Word.DocumentSet docOne = Documents(1)Set docTwo = Documents(Policies.

5、doc)Set docThree = ActiveDocument一般情況下不要使用 Documents 集合中的索引值來引用文檔,因為當(dāng)其它文檔打開或關(guān)閉時,某個特定文檔的索引值可能會隨之改變。通常,您可以通過使用 ActiveDocument 屬性或使用 Documents 集合的 Add 方法或 Open 方法創(chuàng)建的 Document 對象變量。以下示例顯示了如何使用 ActiveDocument 屬性把一個地址添加到當(dāng)前具有焦點(diǎn)的文檔中:With ActiveDocument.Envelope.Insert Address:=Office Talk _& vbCrLf & One Mi

6、crosoft Way & vbCrLf _& Redmond, WA 98052, ReturnAddress:= _David Shank & vbCrLf & _77 First Street & vbCrLf & _Any Town, USA 12345End With下面的示例說明如何通過使用 Documents 集合的 Open 方法,實例化 Document 對象變量。Dim docPolicy As Word.DocumentSet docPolicy = Documents.Open(c:my documentspolicies.doc)最后一個示例顯示如何通過使用 Add

7、方法,為新的空文檔創(chuàng)建 Document 對象的實例。Dim docPolicy As Word.DocumentSet docPolicy = Documents.Add通過使用 Open 方法打開的文檔,或者通過使用 Add 方法創(chuàng)建的文檔,都將成為用 ActiveDocument 屬性表示的當(dāng)前活動文檔。如果您想使 Documents 集合里的其它文檔成為活動文檔,可使用 Document 對象的 Active 方法。一旦您獲取了要操作的 Document 對象,絕大部分您想通過 VBA 進(jìn)行的工作將涉及文本的操作。首先要指定文檔的一個部分,然后對它進(jìn)行某些操作。例如,添加或刪除文本,或

8、者設(shè)置單詞或字符的格式。您可以使用 Range 或 Selection 這兩個對象來完成很多工作。在本月的專欄中,我將只討論 Range 對象。下個月我們將進(jìn)一步討論 Selection 對象的具體內(nèi)容。理解 Word 的段落標(biāo)記當(dāng)您通過程序處理文本時,必須理解 Word 如何處理段落標(biāo)記。從根本上來看,Word 文檔不過是一個巨大的字符流。人們傾向于認(rèn)為文檔是單詞、句子和段落的集合。但實際上,文檔就是一些字符。每個字符都有一定的作用。某些字符是字母、空格或制表符,另一些字符是段落標(biāo)記或分頁符。段落標(biāo)記在 Word 文檔中扮演獨(dú)特的角色,有時這種角色容易被誤解。段落包含一個段落標(biāo)記以及所有位于

9、此段落標(biāo)記和前一個段落標(biāo)記之間的文本(不包括前一個段落標(biāo)記)。另外,重要的是,段落標(biāo)記本包含該段落的所有格式信息。當(dāng)復(fù)制單詞、句子和段落時,如果包含段落標(biāo)記,則所有包含在段落標(biāo)記中的格式信息也被復(fù)制,并在它們被粘貼到其它位置時應(yīng)用于所屬段落。如果您想從段落中復(fù)制文本并將其粘貼到另一個段落中,但不想同時復(fù)制段落格式,復(fù)制時請不要包括您要復(fù)制的文本旁邊的段落標(biāo)記。每個空白的 Word 文檔僅有一個段落標(biāo)記,其中同時包含 Character 對象、Word 對象、Sentence 對象和 Paragragh 對象各一個。但是,“屬性”對話框(“文件”菜單)中的“統(tǒng)計信息”選項卡將報告空白文檔中沒有字

10、符、單詞、句子和段落。這種差異突出顯示了 Word 的一個重要側(cè)面,當(dāng)編程操作這些對象時,您需要特別注意這一點(diǎn)。Range 對象Range 對象表示文檔中的一個連續(xù)范圍,由一個起始字符位置和一個終止字符位置定義。這個連續(xù)范圍可以小到一個插入點(diǎn),大到整個文檔。它也可能是(而非必須是)由當(dāng)前節(jié)表示的范圍。您也可以定義一個 Range 對象,表示和當(dāng)前節(jié)不同的范圍。也可以在同一個文檔中定義多個 Range 對象。Range 對象中的字符包含非打印字符,例如,空格、回車符和段落標(biāo)記。使用 Range 對象創(chuàng)建 Range 對象的典型方法為:聲明一個 Range 類型的對象變量,然后用 Document

11、 對象的 Range 方法或另一個對象(例如 Character、Word、Sentence 或 Selection 對象)的 Range 屬性來實例化該變量。例如,以下代碼創(chuàng)建了兩個 Range 對象,均表示活動文檔中的第二個句子。Dim rngRangeMethod As Word.RangeDim rngRangeProperty As Word.RangeWith ActiveDocumentIf .Sentences.Count = 2 ThenSet rngRangeMethod = .Range(.Sentences(2).Start, _.Sentences(2).End)Se

12、t rngRangeProperty = .Sentences(2)End IfEnd With當(dāng)您使用 Range 方法來指定文檔的特定范圍時,您必須使用此方法的 Start 參數(shù)指定這個范圍開始的位置,使用 End 參數(shù)指定結(jié)束的位置。文檔的第一個字符的字符位置為 0。最后一個字符的位置和文檔的字符總數(shù)相等。您可以通過使用 Characters 集合的 Count 屬性確定文檔中的字符數(shù)。如前面的示例所示,您也可以使用 Bookmark、Selection 或 Range 對象的 Start 和 End 屬性來指定 Range方法的 Start 和 End 參數(shù)。您可以將 Start 和

13、End 參數(shù)設(shè)置為同一個數(shù)字,這將創(chuàng)建一個不包含任何字符的范圍。您可以使用對象的 SetRange 方法設(shè)置或重新定義 Range 對象的內(nèi)容。您也可以通過使用 Range 對象的 Start 屬性或 MoveStart 方法指定或重新定義范圍開始的位置。同樣地,您也可以通過使用 Range 對象的 End 屬性或它的 MoveEnd 方法指定或重新定義范圍結(jié)束的位置。以下示例先用 ContentRagne 對象,該對象包含了文檔的所有內(nèi)容。接著,改變 EndSetRange 方法重新定義范圍,使之包含文檔的第一個段落。最后,使用 MoveEnd 方法將范圍的結(jié)束位置擴(kuò)展至文檔的第二個段落末尾

14、。此示例中的每一步都將當(dāng)前范圍中包含的字符的數(shù)量打印到“立即窗口”。Sub RangeExample()Dim rngSample As RangeSet rngSample = ActiveDocument.ContentWith rngSampleDebug.Print 范圍現(xiàn)在包含 & .Characters.Count _& 個字符。.End = ActiveDocument.Sentences(1).EndDebug.Print 范圍現(xiàn)在包含 & .Characters.Count _& 個字符。.SetRange Start:=0, End:=ActiveDocument._Par

15、agraphs(1).Range.EndDebug.Print 范圍現(xiàn)在包含 & .Characters.Count _& 個字符。.MoveEnd Unit:=wdParagraph, Count:=1Debug.Print 范圍現(xiàn)在包含 & .Characters.Count _& 個字符。End WithEnd Sub您也可以通過使用對象的 Find 屬性返回 Find 對象,重新定義 Range 對象。以下示例演示用 Find 屬性在活動文檔中確定文本的位置。如果找到了文本,Range 對象將自動重新定義以包含符合搜索條件的文本。With rngRangeText.Find.Clear

16、FormattingIf .Execute(FindText:=Find Me!) Then rngRangeText 被重新定義。End IfEnd With許多 Word 對象具有可返回 Range 對象的 Range 屬性。在您需要使用 Range 對象的屬性和方法進(jìn)行操作,而對象本身又不提供這些屬性和方法的情況下,您可以使用對象的 Range 屬性返回 Range 對象。例如,以下代碼使用 Paragragh 對象的 Range 屬性返回 Range 對象,從而設(shè)置文檔第一個段落中文本的格式:Dim rngPara As RangeSet rngPara = ActiveDocumen

17、t.Paragraphs(1).RangeWith rngPara.Bold = True.ParagraphFormat.Alignment = wdAlignParagraphCenter.Font.Name = ArialEnd With定義 Range 對象后,您可以應(yīng)用此對象的方法和屬性修改所指定范圍的內(nèi)容或獲取有關(guān)信息。例如,您可以使用 Range 對象的 StoryType 屬性來確定 Range 在文檔中的位置。處理 Range 對象中的文本可以使用 Range 對象的 Text 屬性來指定或確定該范圍包含的文本。例如,以下代碼首先顯示了 Range 對象中的文本,然后更改文本

18、并顯示新文本,最后還原為原始文本。此示例說明了如何使用 Range 對象的 Range 屬性將文本復(fù)制和粘貼到文檔中并同時保持原段落結(jié)構(gòu)不變。請注意在 strNewText 變量中包含段落標(biāo)記 (vbCrLf) 的新文本如何替換在選定原段落時包含的段落標(biāo)記。Public Sub ChangeTextSample()Dim rngText As RangeDim strOriginalText As StringDim strNewText As StringstrNewText = This text is replacing the original _& text in the first

19、 paragraph of the active _& document. This is all done using only the _& Text property of the Range object! & vbCrLfSet rngText = ActiveDocument.Paragraphs(1).RangeWith rngTextMsgBox .Text, vbOKOnly, This is the original text.strOriginalText = .Text.Text = strNewTextMsgBox .Text, vbOKOnly, This is t

20、he new text _& inserted in paragraph 1.Text = strOriginalTextMsgBox The original text is restored.End WithEnd Sub您可以使用 Range 對象的 StoryType 屬性確定范圍在文檔中的位置。文檔構(gòu)成部分是指文檔中包含文本的特定范圍。在一個文檔中最多可以有 11 種文檔構(gòu)成部分,表示正文、頁眉、頁腳、批注等不同范圍。您可以使用 StoryRanges 屬性返回 StoryRanges 集合。StoryRanges 集合包含 Range 對象,表示文檔中的每一個文檔構(gòu)成部分。新 Wo

21、rd 文檔只包含一個文檔構(gòu)成部分,稱為“Main Text”,表示文檔主體部分的文本。即使一個空白文檔也包含字符、單詞、句子和段落各一個。您不需要專門將新文檔構(gòu)成部分添加至文檔。當(dāng)您把文本添加至文檔的某個部分(11 種文檔構(gòu)成部分之一)時,Word 會自動添加它們。例如,如果您要添加頁腳,Word 將添加 Footnotes 文檔構(gòu)成部分。如果您要添加批注,Word 將把 Comments 文檔構(gòu)成部分添加到文檔的 StoryRanges 集合中。您可以使用 Range 屬性返回 Range 對象來表示文檔中的每一個文檔構(gòu)成部分。例如,以下代碼打印與 Main Text 和 Comments

22、文檔構(gòu)成部分相關(guān)的文本:Dim rngMainText As Word.RangeDim rngCommentsText As Word.RangeSet rngMainText = ActiveDocument.StoryRanges(wdMainTextStory)Set rngComments = ActiveDocument.StoryRanges(wdCommentsStory)Debug.Print rngMainText.TextDebug.Print rngComments.Text使用 Range 對象的 InsertBefore 或 InsertAfter 方法,可將文本添

23、加至現(xiàn)有 Range 對象。事實上,有一整類方法,名稱以“Insert”開頭,可以用于操作 Range 對象。如果有一個過程,能夠把 Range 對象的 InsertBefore 和 InsertAfter 方法與 Text 屬性結(jié)合,那么它將非常有用。在編程處理文本時,就可以使用這個過程在同一個地方處理大量工作。以下所示的 InsertTextInRange 正是這樣一個過程。無論何時您需要將文本添加到 Range 對象,都可以調(diào)用 InsertTextInRange 過程。換句話說,無論何時您需要在 Word 文檔中編程更改現(xiàn)有的文本,這一過程都將非常有用。InsertTextInRang

24、e 過程使用兩個必要的變量和一個可選的變量。strNewText 變量包含您想要添加至 Range 對象的文本,此對象在 rngRange 變量中指定。intInsertMode 可選變量指定將新文本添加至范圍的方式。變量的值是三個自定義枚舉常數(shù)中的一個,指定是否使用 InsertBefore 方法、InsertAfter 方法或 Text 屬性替換現(xiàn)有的范圍文本。Public Enum opgTextInsertModeBeforeAfterReplaceEnd EnumFunction InsertTextInRange(strNewText As String, _Optional rn

25、gRange As Word.Range, _Optional intInsertMode As opgTextInsertMode = _Replace) As Boolean 此過程將 strNewText 參數(shù)指定文本插入 rngRange 指定的 Range 對象中。它調(diào)用 IsLastCharParagraph 過程從 rngRange 對象清除后續(xù)的段落標(biāo)記。Call IsLastCharParagraph(rngRange, True)With rngRangeSelect Case intInsertModeCase 0 在范圍之前插入文本。.InsertBefore strN

26、ewTextCase 1 在范圍之后插入文本。.InsertAfter strNewTextCase 2 替換范圍中的文本。.Text = strNewTextCase ElseEnd SelectInsertTextInRange = TrueEnd WithEnd Function請注意,在范圍中插入文本之前,使用了 IsLastCharParagraph 過程來刪除最后一個段落的段落標(biāo)記。以下示例使用 Chr$() 函數(shù),以字符代碼 13 表示段落標(biāo)記。Function IsLastCharParagraph(ByRef rngTextRange As Word.Range, _Opti

27、onal blnTrimParaMark As Boolean = False) As Boolean 本過程接受字符、單詞、句子或段落 Range 作為第一個參數(shù)。如果范圍中的最后一個字符 是段落標(biāo)記,則返回 True;否則返回 False。 本過程還接受一個 Boolean 參數(shù),用于指定 當(dāng)文本最后存在段落標(biāo)記時,是否將其刪除。 當(dāng) blnTrimParaMark 參數(shù)為 True 時,本過 程調(diào)用本身來刪除所有后續(xù)的段落標(biāo)記。Dim strLastChar As StringstrLastChar = Right$(rngTextRange.Text, 1)If InStr(strLastChar, Chr$(13) = 0 ThenIsLastCharParagraph = FalseExit FunctionElseIsLastCharParagraph = TrueIf Not blnTrimParaMark = True ThenExit FunctionElseDorngTextRange.SetRange rngTextRange.Start, _rngTextRange.Start + _

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論