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

下載本文檔

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

文檔簡介

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

2、BA操彳Word時,Document對象表示一個打開的文檔,而且所有的 Document對象都是 Application 對象的 Documents集合的成員。文檔是一個由字符、單詞、句子和段落組成的集合,字符組成單詞,單詞組成句子, 句子組成段落,等等。因此,每一個 Document對象都具有 Characters、Words、Sentences和 Paragraghs四個集合。此外,每個文檔具有一個包含一個或多個節(jié)的Sections集合,每一個節(jié)都有一個包含該節(jié)頁眉和頁腳的HeadersFooters集合。注意:您可以在 Microsoft Office 2000 開發(fā)人員對象模型指南(英

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

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

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

6、ay" & vbCrLf _?& "Redmond, WA 98052”, ReturnAddress:= _?"David Shank" & vbCrLf & _?"77 First Street" & vbCrLf & _?"Any Town, USA 12345” End With下面的示例說明如何通過使用Documents集合的 Open方法,實例化 Document對象變量。Dim docPolicy As Word.DocumentSet docPolicy = D

7、ocuments.Open("c:my documentspolicies.doc")最后一個示例顯示如何通過使用Add方法,為新的空文檔創(chuàng)建Document對象的實例。Dim docPolicy As Word.DocumentSet docPolicy = Documents.Add通過使用 Open方法打開的文檔,或者通過使用Add方法創(chuàng)建的文檔,都將成為用ActiveDocument屬性表示的當前活動文檔。如果您想使 Documents集合里的其它文檔成為 活動文檔,可使用Document對象的Active方法。一旦您獲取了要操作的Document對象,絕大部分您想

8、通過VBA進行的工作將涉及文本的操作。首先要指定文檔的一個部分,然后對它進行某些操作。例如,添加或刪除文本, 或者設置單詞或字符的格式。您可以使用 Range或Selection這兩個對象來完成很多工作。 在本月的專欄中,我將只討論Range對象。下個月我們將進一步討論Selection對象的具體內(nèi)容。理解Word的段落標記當您通過程序處理文本時,必須理解Word如何處理段落標記。從根本上來看,Word文檔不過是一個巨大的字符流。人們傾向于認為文檔是單詞、句子和段落的集合。但實際上, 文檔就是一些字符。 每個字符都有一定的作用。某些字符是字母、空格或制表符,另一些字符是段落標記或分頁符。段落標

9、記在 Word文檔中扮演獨特的角色,有時這種角色容易被誤解。段落包含一個 段落標記以及所有位于此段落標記和前一個段落標記之間的文本(不包括前一個段落標記)。另外,重要的是,段落標記本包含該段落的所有格式信息。當復制單詞、句子和段落時,如果包含段落標記,則所有包含在段落標記中的格式信 息也被復制,并在它們被粘貼到其它位置時應用于所屬段落。如果您想從段落中復制文本并將其粘貼到另一個段落中,但不想同時復制段落格式, 復制時請不要包括您要復制的文本旁邊的段落標記。每個空白的 Word文檔僅有一個段落標記,其中同時包含 Character對象、Word對 象、Sentence對象和Paragragh對象

10、各一個。但是,屬性”對話框(文件”菜單)中的 統(tǒng)計信息”選項卡將報告空白文檔中沒有字符、單詞、句子和段落。這種差異突出顯示了Word的一個重要側(cè)面,當編程操作這些對象時,您需要特別注意這一點。Range對象Range對象表示文檔中的一個連續(xù)范圍,由一個起始字符位置和一個終止字符位置定 義。這個連續(xù)范圍可以小到一個插入點,大到整個文檔。它也可能是(而非必須是)由當前 節(jié)表示的范圍。您也可以定義一個Range對象,表示和當前節(jié)不同的范圍。也可以在同一個文檔中定義多個Range對象。Range對象中的字符包含非打印字符,例如,空格、回車符和段落標記。使用Range對象?電11建Range對象的典型方

11、法為:聲明一個Range類型的對象變量,然后用Document 對象的 Range 方法或另一個對象 (例如 Character、Word、Sentence 或 Selection 對象)的Range屬性來實例化該變量。例如,以下代碼創(chuàng)建了兩個Range對象,均表示活動文檔中的第二個句子。Dim rngRangeMethod As Word.RangeDim rngRangeProperty As Word.RangeWith ActiveDocument?If .Sentences.Count >= 2 Then?Set rngRangeMethod = .Range(.Sentenc

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

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

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

15、uot;個字符。"?.SetRange Start:=0, End:=ActiveDocument._?Paragraphs.Range.End?Debug.Print,范圍現(xiàn)在包含 "& .Characters.Count _?& "個字符。"?.MoveEnd unit:=wdParagraph, Count:=1?Debug.Print,范圍現(xiàn)在包含 "& .Characters.Count _?& "個字符。"?End WithEnd Sub您也可以通過使用對象的Find屬性返回Fin

16、d對象,重新定義 Range對象。以下示例演示用Find屬性在活動文檔中確定文本的位置。如果找到了文本,Range對象將自動重新定義以包含符合搜索條件的文本。With rngRangeText.Find?.ClearFormatting?If .Execute(FindTextk"Find Me!") Then?' rngRangeText 被重新定義。?End If End With許多 Word對象具有可返回 Range對象的 Range屬性。在您需要使用Range對象的屬性和方法進行操作,而對象本身又不提供這些屬性和方法的情況下,您可以使用對象的Range屬性

17、返回 Range對象。例如,以下代碼使用Paragragh對象的 Range屬性返回Range對象,從而設置文檔第一個段落中文本的格式:Dim rngPara As RangeSet rngPara = ActiveDocument.Paragraphs.RangeWith rngPara?.Bold = True?.ParagraphFormat.Alignment = wdAlignParagraphCenter?.Font.Name = "Arial" End With定義Range對象后,您可以應用此對象的方法和屬性修改所指定范圍的內(nèi)容或獲取有 關信息。例如,您可以

18、使用 Range對象的StoryType屬性來確定 Range在文檔中的位置。處理Range對象中的文本可以使用Range對象的Text屬性來指定或確定該范圍包含的文本。例如,以下代碼 首先顯示了 Range對象中的文本,然后更改文本并顯示新文本,最后還原為原始文本。此 示例說明了如何使用Range對象的Range屬性將文本復制和粘貼到文檔中并同時保持原段落結(jié)構(gòu)不變。請注意在strNewText變量中包含段落標記(vbCrLf)的新文本如何替換在選定原段落時包含的段落標記。Public Sub ChangeTextSample()?Dim rngText As Range?Dim strOri

19、ginalText As String?Dim strNewText As StringstrNewText = "This text is replacing the original" _?& " text in the first paragraph of the active" _?& " document. This is all done using only the" _?& " Text property of the Range object!" & vbCrLfS

20、et rngText = ActiveDocument.Paragraphs.Range?With rngText?MsgBox .Text, vbOKOnly, "This is the original text."?strOriginalText = .Text?.Text = strNewText?MsgBox .Text, vbOKOnly, "This is the new text" _?& " inserted in paragraph 1."?.Text = strOriginalText?MsgBox &q

21、uot;The original text is restored.?End WithEnd Sub您可以使用 Range對象的StoryType屬性確定范圍在文檔中的位置。文檔構(gòu)成部分是指文檔中包含文本的特定范圍。在一個文檔中最多可以有11種文檔構(gòu)成部分,表示正文、頁眉、頁腳、批注等不同范圍。您可以使用StoryRanges屬性返回StoryRanges集合。StoryRanges集合包含 Range對象,表示文檔中的每一個文檔構(gòu)成部分。新 Word文檔只包含一個文檔構(gòu)成部分,稱為“Main Text,表示文檔主體部分的文本。即使一個空白文檔也包含字符、單詞、句子和段落各一個。您不需要專門將

22、新文檔構(gòu)成部分添加至文檔。當您把文本添加至文檔的某個部分(11種文檔構(gòu)成部分之一)時, Word會自動添加它們。例如,如果您要添加頁腳,Word將添加Footnotes文檔構(gòu)成部分。如果您要添加批注, Word將把Comments文檔構(gòu)成部分添加 到文檔的 StoryRanges集合中。您可以使用 Range屬性返回Range對象來表示文檔中的每一個文檔構(gòu)成部分。例如,以下代碼打印與 Main Text和Comments文檔構(gòu)成部分相關的文本:Dim rngMainText As Word.RangeDim rngCommentsText As Word.RangeSet rngMainTex

23、t = ActiveDocument.StoryRanges(wdMainTextStory)Set rngComments = ActiveDocument.StoryRanges(wdCommentsStory)Debug.Print rngMainText.TextDebug.Print rngComments.Text使用 Range對象的InsertBefore或InsertAfter方法,可將文本添加至現(xiàn)有Range對象。事實上,有一整類方法,名稱以 “Inserts頭,可以用于操作 Range對象。如果有一個過程,能夠把 Range對象的InsertBefore和InsertAf

24、ter方法與 Text屬性結(jié)合,那么它將非常有用。在編程處理文本時,就可以使用這個過程在同一個地方處理大量工作。以下所示的 InsertTextInRange正是這樣一個過程。無論何時您需要將文本添加到 Range對象,都可以調(diào)用 InsertTextInRange過程。換句話說,無論何時您需要在Word文檔中編程更改現(xiàn)有的文本,這一過程都將非常有用。InsertTextInRange過程使用兩個必要的變量和一個可選的變量。strNewText變量包含您想要添加至 Range對象的文本,此對象在 rngRange變量中指定。intInsertMode可選變 量指定將新文本添加至范圍的方式。變量

25、的值是三個自定義枚舉常數(shù)中的一個,指定是否使用InsertBefore方法、InsertAfter方法或 Text屬性替換現(xiàn)有的范圍文本。Public Enum opgTextInsertMode?Before?After?ReplaceEnd EnumFunction InsertTextInRange(strNewText As String, _?Optional rngRange As Word.Range, _?Optional intInsertMode As opgTextInsertMode = _?Replace) As Boolean?此過程將strNewText參數(shù)指定文

26、本插入?' rngRange指定的Range對象中。它調(diào)用?' IsLastCharParagraph 過程從 rngRange?對象清除后續(xù)的段落標記。?Call IsLastCharParagraph(rngRange, True)With rngRange?Case 0在范圍之前插入文本。?.InsertBefore strNewText?Case 1在范圍之后插入文本。?.InsertAfter strNewText?Case 2替換范圍中的文本。?.Text = strNewText?Case Else?End Select?InsertTextInRange = T

27、rue?End WithEnd Function請注意,在范圍中插入文本之前,使用了 IsLastCharParagraph過程來刪除最后一個段落的段落標記。以下示例使用Chr$()函數(shù),以字符代碼13表示段落標記。Function IsLastCharParagraph(ByRef rngTextRange As Word.Range, _ ?Optional blnTrimParaMark As Boolean = False) As Boolean?本過程接受字符、單詞、句子或段落 Range?作為第一個參數(shù)。如果范圍中的最后一個字符?是段落標記,則返回True;否則返回 False。?

28、本過程還接受一個Boolean參數(shù),用于指定?當文本最后存在段落標記時,是否將其刪除。?'當 blnTrimParaMark 參數(shù)為 True 時,本過?'程調(diào)用本身來刪除所有后續(xù)的段落標記。Dim strLastChar As StringstrLastChar = Right$(rngTextRange.Text, 1)?If InStr(strLastChar, Chr$(13) = 0 Then?IsLastCharParagraph = False?Exit Function?Else?IsLastCharParagraph = True?If Not blnTrimParaMark = True Then?Exit Function?Else?Do?rn

溫馨提示

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

評論

0/150

提交評論