理解基本方法在 Word 中,幾乎所有的操作都要調(diào)用 Document 對(duì)象本身或其內(nèi)容。當(dāng)您用 VBA 操作 Word 時(shí),Document 對(duì)象表示一個(gè)打開(kāi)的文檔,而且所有的 Document 對(duì)象都是 Application 對(duì)象的 Documents 集合的成員。 文檔是一個(gè)由字符、單詞、句子和段落組成的集合,字符組成單詞,單詞組成句子,句子組成段落,等等。因此,每一個(gè) Document 對(duì)象都具有 Characters、Words、Sentences 和 Paragraghs 四個(gè)集合。此外,每個(gè)文檔具有一個(gè)包含一個(gè)或多個(gè)節(jié)的 Sections 集合,每一個(gè)節(jié)都有一個(gè)包含該節(jié)頁(yè)眉和頁(yè)腳的 HeadersFooters 集合。 注意: 您可以在 Microsoft Office 2000 開(kāi)發(fā)人員對(duì)象模型指南(英文)中查閱完整的 Word 對(duì)象模型。另外,您也可以使用對(duì)象瀏覽器和 Microsoft Word Visual Basic 參考幫助來(lái)學(xué)習(xí)有關(guān)具體某個(gè)對(duì)象、屬性、方法和事件的詳細(xì)內(nèi)容。 通過(guò) VBA 使用 Word 時(shí),Document 對(duì)象處于中心位置。如果您要打開(kāi)文檔或創(chuàng)建新文檔,就要?jiǎng)?chuàng)建新的 Document 對(duì)象。每個(gè)打開(kāi)或新創(chuàng)建的文檔均被添加至 Documents 集合。具有焦點(diǎn)的文檔稱為活動(dòng)文檔,由 ActiveDocument 屬性表示。 Document 對(duì)象作為 Documents 集合中的一個(gè)成員,您可以通過(guò)使用 Document 對(duì)象的索引值(Document 對(duì)象在 Documents 集合中的位置,1 是集合中的第一個(gè)文檔)或名稱來(lái)引用它。另外,您也可以使用 ActiveDocument 屬性來(lái)引用當(dāng)前具有焦點(diǎn)的文檔。例如,如果名為 Policies.doc 的文檔是唯一打開(kāi)的文檔,則以下三個(gè)對(duì)象變量將全部指向 Policies.doc: Dim docOne As Word.Document Dim docTwo As Word.Document Dim docThree As Word.Document Set docOne = Documents(1) Set docTwo = Documents("Policies.doc") Set docThree = ActiveDocument 一般情況下不要使用 Documents 集合中的索引值來(lái)引用文檔,因?yàn)楫?dāng)其它文檔打開(kāi)或關(guān)閉時(shí),某個(gè)特定文檔的索引值可能會(huì)隨之改變。通常,您可以通過(guò)使用 ActiveDocument 屬性或使用 Documents 集合的 Add 方法或 Open 方法創(chuàng)建的 Document 對(duì)象變量。以下示例顯示了如何使用 ActiveDocument 屬性把一個(gè)地址添加到當(dāng)前具有焦點(diǎn)的文檔中: With ActiveDocument .Envelope.Insert Address:="Office Talk" _ & vbCrLf & "One Microsoft Way" & vbCrLf _ & "Redmond, WA 98052", ReturnAddress:= _ "David Shank" & vbCrLf & _ "77 First Street" & vbCrLf & _ "Any Town, USA 12345" End With 下面的示例說(shuō)明如何通過(guò)使用 Documents 集合的 Open 方法,實(shí)例化 Document 對(duì)象變量。 Dim docPolicy As Word.Document Set docPolicy = Documents.Open("c:\my documents\policies.doc") 最后一個(gè)示例顯示如何通過(guò)使用 Add 方法,為新的空文檔創(chuàng)建 Document 對(duì)象的實(shí)例。 Dim docPolicy As Word.Document Set docPolicy = Documents.Add 通過(guò)使用 Open 方法打開(kāi)的文檔,或者通過(guò)使用 Add 方法創(chuàng)建的文檔,都將成為用 ActiveDocument 屬性表示的當(dāng)前活動(dòng)文檔。如果您想使 Documents 集合里的其它文檔成為活動(dòng)文檔,可使用 Document 對(duì)象的 Active 方法。 一旦您獲取了要操作的 Document 對(duì)象,絕大部分您想通過(guò) VBA 進(jìn)行的工作將涉及文本的操作。首先要指定文檔的一個(gè)部分,然后對(duì)它進(jìn)行某些操作。例如,添加或刪除文本,或者設(shè)置單詞或字符的格式。您可以使用 Range 或 Selection 這兩個(gè)對(duì)象來(lái)完成很多工作。在本月的專欄中,我將只討論 Range 對(duì)象。下個(gè)月我們將進(jìn)一步討論 Selection 對(duì)象的具體內(nèi)容。 理解 Word 的段落標(biāo)記當(dāng)您通過(guò)程序處理文本時(shí),必須理解 Word 如何處理段落標(biāo)記。從根本上來(lái)看,Word 文檔不過(guò)是一個(gè)巨大的字符流。人們傾向于認(rèn)為文檔是單詞、句子和段落的集合。但實(shí)際上,文檔就是一些字符。每個(gè)字符都有一定的作用。某些字符是字母、空格或制表符,另一些字符是段落標(biāo)記或分頁(yè)符。 段落標(biāo)記在 Word 文檔中扮演獨(dú)特的角色,有時(shí)這種角色容易被誤解。段落包含一個(gè)段落標(biāo)記以及所有位于此段落標(biāo)記和前一個(gè)段落標(biāo)記之間的文本(不包括前一個(gè)段落標(biāo)記)。另外,重要的是,段落標(biāo)記本包含該段落的所有格式信息。 當(dāng)復(fù)制單詞、句子和段落時(shí),如果包含段落標(biāo)記,則所有包含在段落標(biāo)記中的格式信息也被復(fù)制,并在它們被粘貼到其它位置時(shí)應(yīng)用于所屬段落。 如果您想從段落中復(fù)制文本并將其粘貼到另一個(gè)段落中,但不想同時(shí)復(fù)制段落格式,復(fù)制時(shí)請(qǐng)不要包括您要復(fù)制的文本旁邊的段落標(biāo)記。 每個(gè)空白的 Word 文檔僅有一個(gè)段落標(biāo)記,其中同時(shí)包含 Character 對(duì)象、Word 對(duì)象、Sentence 對(duì)象和 Paragragh 對(duì)象各一個(gè)。但是,“屬性”對(duì)話框(“文件”菜單)中的“統(tǒng)計(jì)信息”選項(xiàng)卡將報(bào)告空白文檔中沒(méi)有字符、單詞、句子和段落。這種差異突出顯示了 Word 的一個(gè)重要側(cè)面,當(dāng)編程操作這些對(duì)象時(shí),您需要特別注意這一點(diǎn)。 Range 對(duì)象Range 對(duì)象表示文檔中的一個(gè)連續(xù)范圍,由一個(gè)起始字符位置和一個(gè)終止字符位置定義。這個(gè)連續(xù)范圍可以小到一個(gè)插入點(diǎn),大到整個(gè)文檔。它也可能是(而非必須是)由當(dāng)前節(jié)表示的范圍。您也可以定義一個(gè) Range 對(duì)象,表示和當(dāng)前節(jié)不同的范圍。也可以在同一個(gè)文檔中定義多個(gè) Range 對(duì)象。Range 對(duì)象中的字符包含非打印字符,例如,空格、回車符和段落標(biāo)記。 使用 Range 對(duì)象創(chuàng)建 Range 對(duì)象的典型方法為:聲明一個(gè) Range 類型的對(duì)象變量,然后用 Document 對(duì)象的 Range 方法或另一個(gè)對(duì)象(例如 Character、Word、Sentence 或 Selection 對(duì)象)的 Range 屬性來(lái)實(shí)例化該變量。例如,以下代碼創(chuàng)建了兩個(gè) Range 對(duì)象,均表示活動(dòng)文檔中的第二個(gè)句子。 Dim rngRangeMethod As Word.Range Dim rngRangeProperty As Word.Range With ActiveDocument If .Sentences.Count >= 2 Then Set rngRangeMethod = .Range(.Sentences(2).Start, _ .Sentences(2).End) Set rngRangeProperty = .Sentences(2) End If End With 當(dāng)您使用 Range 方法來(lái)指定文檔的特定范圍時(shí),您必須使用此方法的 Start 參數(shù)指定這個(gè)范圍開(kāi)始的位置,使用 End 參數(shù)指定結(jié)束的位置。文檔的第一個(gè)字符的字符位置為 0。最后一個(gè)字符的位置和文檔的字符總數(shù)相等。您可以通過(guò)使用 Characters 集合的 Count 屬性確定文檔中的字符數(shù)。如前面的示例所示,您也可以使用 Bookmark、Selection 或 Range 對(duì)象的 Start 和 End 屬性來(lái)指定 Range方法的 Start 和 End 參數(shù)。您可以將 Start 和 End 參數(shù)設(shè)置為同一個(gè)數(shù)字,這將創(chuàng)建一個(gè)不包含任何字符的范圍。 您可以使用對(duì)象的 SetRange 方法設(shè)置或重新定義 Range 對(duì)象的內(nèi)容。您也可以通過(guò)使用 Range 對(duì)象的 Start 屬性或 MoveStart 方法指定或重新定義范圍開(kāi)始的位置。同樣地,您也可以通過(guò)使用 Range 對(duì)象的 End 屬性或它的 MoveEnd 方法指定或重新定義范圍結(jié)束的位置。 以下示例先用 ContentRagne 對(duì)象,該對(duì)象包含了文檔的所有內(nèi)容。接著,改變 EndSetRange 方法重新定義范圍,使之包含文檔的第一個(gè)段落。最后,使用 MoveEnd 方法將范圍的結(jié)束位置擴(kuò)展至文檔的第二個(gè)段落末尾。此示例中的每一步都將當(dāng)前范圍中包含的字符的數(shù)量打印到“立即窗口”。 Sub RangeExample() Dim rngSample As Range Set rngSample = ActiveDocument.Content With rngSample Debug.Print "范圍現(xiàn)在包含 " & .Characters.Count _ & " 個(gè)字符。" .End = ActiveDocument.Sentences(1).End Debug.Print "范圍現(xiàn)在包含 " & .Characters.Count _ & " 個(gè)字符。" .SetRange Start:=0, End:=ActiveDocument._ Paragraphs(1).Range.End Debug.Print "范圍現(xiàn)在包含 " & .Characters.Count _ & " 個(gè)字符。" .MoveEnd Unit:=wdParagraph, Count:=1 Debug.Print "范圍現(xiàn)在包含 " & .Characters.Count _ & " 個(gè)字符。" End With End Sub 您也可以通過(guò)使用對(duì)象的 Find 屬性返回 Find 對(duì)象,重新定義 Range 對(duì)象。以下示例演示用 Find 屬性在活動(dòng)文檔中確定文本的位置。如果找到了文本,Range 對(duì)象將自動(dòng)重新定義以包含符合搜索條件的文本。 With rngRangeText.Find .ClearFormatting If .Execute(FindText:="Find Me!") Then ' rngRangeText 被重新定義。 End If End With 許多 Word 對(duì)象具有可返回 Range 對(duì)象的 Range 屬性。在您需要使用 Range 對(duì)象的屬性和方法進(jìn)行操作,而對(duì)象本身又不提供這些屬性和方法的情況下,您可以使用對(duì)象的 Range 屬性返回 Range 對(duì)象。例如,以下代碼使用 Paragragh 對(duì)象的 Range 屬性返回 Range 對(duì)象,從而設(shè)置文檔第一個(gè)段落中文本的格式: Dim rngPara As Range Set rngPara = ActiveDocument.Paragraphs(1).Range With rngPara .Bold = True .ParagraphFormat.Alignment = wdAlignParagraphCenter .Font.Name = "Arial" End With 定義 Range 對(duì)象后,您可以應(yīng)用此對(duì)象的方法和屬性修改所指定范圍的內(nèi)容或獲取有關(guān)信息。例如,您可以使用 Range 對(duì)象的 StoryType 屬性來(lái)確定 Range 在文檔中的位置。 處理 Range 對(duì)象中的文本可以使用 Range 對(duì)象的 Text 屬性來(lái)指定或確定該范圍包含的文本。例如,以下代碼首先顯示了 Range 對(duì)象中的文本,然后更改文本并顯示新文本,最后還原為原始文本。此示例說(shuō)明了如何使用 Range 對(duì)象的 Range 屬性將文本復(fù)制和粘貼到文檔中并同時(shí)保持原段落結(jié)構(gòu)不變。請(qǐng)注意在 strNewText 變量中包含段落標(biāo)記 (vbCrLf) 的新文本如何替換在選定原段落時(shí)包含的段落標(biāo)記。 Public Sub ChangeTextSample() Dim rngText As Range Dim strOriginalText As String Dim strNewText As String strNewText = "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!" & vbCrLf Set rngText = ActiveDocument.Paragraphs(1).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 "The original text is restored." End With End Sub 您可以使用 Range 對(duì)象的 StoryType 屬性確定范圍在文檔中的位置。文檔構(gòu)成部分是指文檔中包含文本的特定范圍。在一個(gè)文檔中最多可以有 11 種文檔構(gòu)成部分,表示正文、頁(yè)眉、頁(yè)腳、批注等不同范圍。您可以使用 StoryRanges 屬性返回 StoryRanges 集合。StoryRanges 集合包含 Range 對(duì)象,表示文檔中的每一個(gè)文檔構(gòu)成部分。 新 Word 文檔只包含一個(gè)文檔構(gòu)成部分,稱為“Main Text”,表示文檔主體部分的文本。即使一個(gè)空白文檔也包含字符、單詞、句子和段落各一個(gè)。 您不需要專門將新文檔構(gòu)成部分添加至文檔。當(dāng)您把文本添加至文檔的某個(gè)部分(11 種文檔構(gòu)成部分之一)時(shí),Word 會(huì)自動(dòng)添加它們。例如,如果您要添加頁(yè)腳,Word 將添加 Footnotes 文檔構(gòu)成部分。如果您要添加批注,Word 將把 Comments 文檔構(gòu)成部分添加到文檔的 StoryRanges 集合中。 您可以使用 Range 屬性返回 Range 對(duì)象來(lái)表示文檔中的每一個(gè)文檔構(gòu)成部分。例如,以下代碼打印與 Main Text 和 Comments 文檔構(gòu)成部分相關(guān)的文本: Dim rngMainText As Word.Range Dim rngCommentsText As Word.Range Set rngMainText = ActiveDocument.StoryRanges(wdMainTextStory) Set rngComments = ActiveDocument.StoryRanges(wdCommentsStory) Debug.Print rngMainText.Text Debug.Print rngComments.Text 使用 Range 對(duì)象的 InsertBefore 或 InsertAfter 方法,可將文本添加至現(xiàn)有 Range 對(duì)象。事實(shí)上,有一整類方法,名稱以“Insert”開(kāi)頭,可以用于操作 Range 對(duì)象。 如果有一個(gè)過(guò)程,能夠把 Range 對(duì)象的 InsertBefore 和 InsertAfter 方法與 Text 屬性結(jié)合,那么它將非常有用。在編程處理文本時(shí),就可以使用這個(gè)過(guò)程在同一個(gè)地方處理大量工作。以下所示的 InsertTextInRange 正是這樣一個(gè)過(guò)程。無(wú)論何時(shí)您需要將文本添加到 Range 對(duì)象,都可以調(diào)用 InsertTextInRange 過(guò)程。換句話說(shuō),無(wú)論何時(shí)您需要在 Word 文檔中編程更改現(xiàn)有的文本,這一過(guò)程都將非常有用。 InsertTextInRange 過(guò)程使用兩個(gè)必要的變量和一個(gè)可選的變量。strNewText 變量包含您想要添加至 Range 對(duì)象的文本,此對(duì)象在 rngRange 變量中指定。intInsertMode 可選變量指定將新文本添加至范圍的方式。變量的值是三個(gè)自定義枚舉常數(shù)中的一個(gè),指定是否使用 InsertBefore 方法、InsertAfter 方法或 Text 屬性替換現(xiàn)有的范圍文本。 Public Enum opgTextInsertMode Before After Replace End Enum Function InsertTextInRange(strNewText As String, _ Optional rngRange As Word.Range, _ Optional intInsertMode As opgTextInsertMode = _ Replace) As Boolean ' 此過(guò)程將 strNewText 參數(shù)指定文本插入 ' rngRange 指定的 Range 對(duì)象中。它調(diào)用 ' IsLastCharParagraph 過(guò)程從 rngRange ' 對(duì)象清除后續(xù)的段落標(biāo)記。 Call IsLastCharParagraph(rngRange, True) With rngRange Select Case intInsertMode Case 0 ' 在范圍之前插入文本。 .InsertBefore strNewText Case 1 ' 在范圍之后插入文本。 .InsertAfter strNewText Case 2 ' 替換范圍中的文本。 .Text = strNewText Case Else End Select InsertTextInRange = True End With End Function 請(qǐng)注意,在范圍中插入文本之前,使用了 IsLastCharParagraph 過(guò)程來(lái)刪除最后一個(gè)段落的段落標(biāo)記。以下示例使用 Chr$() 函數(shù),以字符代碼 13 表示段落標(biāo)記。 Function IsLastCharParagraph(ByRef rngTextRange As Word.Range, _ Optional blnTrimParaMark As Boolean = False) As Boolean ' 本過(guò)程接受字符、單詞、句子或段落 Range ' 作為第一個(gè)參數(shù)。如果范圍中的最后一個(gè)字符 ' 是段落標(biāo)記,則返回 True;否則返回 False。 ' 本過(guò)程還接受一個(gè) Boolean 參數(shù),用于指定 ' 當(dāng)文本最后存在段落標(biāo)記時(shí),是否將其刪除。 ' 當(dāng) blnTrimParaMark 參數(shù)為 True 時(shí),本過(guò) ' 程調(diào)用本身來(lái)刪除所有后續(xù)的段落標(biāo)記。 Dim strLastChar As String strLastChar = 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 rngTextRange.SetRange rngTextRange.Start, _ rngTextRange.Start + _ rngTextRange.Characters.Count - 1 Call IsLastCharParagraph(rngTextRange, True) Loop While InStr(rngTextRange.Text, Chr$(13)) <> 0 End If End If End Function 在此示例中,使用了 Range 對(duì)象的 Characters 集合的 Count 屬性來(lái)重新定義 Range 對(duì)象的終點(diǎn)。 有關(guān)處理段落的更多信息在前面討論過(guò)的 ChangeTextSample 過(guò)程中,請(qǐng)注意 strNewText 變量中的文本如何使用 vbCrLf 內(nèi)置常量在文本的結(jié)束處創(chuàng)建段落標(biāo)記,從而替換活動(dòng)文檔的第 1 段中的現(xiàn)有文本。這樣做是為了避免新文檔成為第二個(gè)段落的一部分。 當(dāng)您創(chuàng)建表示 Character、Word 或 Sentence 對(duì)象的 Range 對(duì)象,并且該對(duì)象位于段落的結(jié)束位置時(shí),段落標(biāo)記自動(dòng)包含在范圍之內(nèi)。而且,Range 對(duì)象將包含后續(xù)的空段落標(biāo)記。例如,在一個(gè)由兩個(gè)段落組成的文檔中,假設(shè)其中第一個(gè)段落包含三個(gè)句子,而第二個(gè)段落為空,那么以下代碼創(chuàng)建的 Range 對(duì)象表示第一段中的最后一個(gè)句子: Set rngCurrentSentence = ActiveDocument.Sentences(3) 因?yàn)?rngCurrentSentence Range 對(duì)象引用第一個(gè)段落的最后一個(gè)句子,該段的段落標(biāo)記(和所有后續(xù)的空段落標(biāo)記)將被自動(dòng)包含在范圍中。如果您接著將此對(duì)象中的 Text 屬性應(yīng)用到一個(gè)沒(méi)有使用段落標(biāo)記結(jié)束的文本字符串,那么文檔中的第二段將被刪除。 當(dāng)您編寫在 Word 文檔中操作文本的 VBA 代碼時(shí),您需要自行處理文本中出現(xiàn)的段落標(biāo)記。當(dāng)您在 Range 對(duì)象中剪切或粘貼文本時(shí),您可以使用兩種基本方法來(lái)處理段落標(biāo)記:
15:41:02 |
|站長(zhǎng)郵箱|小黑屋|手機(jī)版|Office中國(guó)/Access中國(guó)
( 粵ICP備10043721號(hào)-1 )
GMT+8, 2025-7-13 08:05 , Processed in 0.069104 second(s), 16 queries .
Powered by Discuz! X3.3
© 2001-2017 Comsenz Inc.