《2022年用VBA操作Word》由会员分享,可在线阅读,更多相关《2022年用VBA操作Word(8页珍藏版)》请在金锄头文库上搜索。
1、用 VBA 操作 Word( 转在所有Office 应用程序中, Microsoft Word 可能是应用最广泛的应用程序,它还经常在自定义Office 解决方案中扮演重要的角色。开发人员用各种不同的方式使用Word,有一些方式很简单,而另一些极其复杂。无论涉及何种自定义解决方案,用Visual Basic for Applications (VBA) 处理Word 文档的基本方法都是一样的。在本栏目中,我将概括地介绍如何使用Word,并提供一些关于如何运用Range 对象处理Word 文档内容的详细资料。理解基本方法在 Word 中,几乎所有的操作都要调用Document 对象本身或其内容。
2、当您用VBA 操作 Word 时, Document 对象表示一个打开的文档,而且所有的Document 对象都是Application 对象的Documents 集合的成员。文档是一个由字符、单词、句子和段落组成的集合,字符组成单词,单词组成句子,句子组成段落,等等。因此,每一个Document 对象都具有Characters、Words、Sentences 和 Paragraghs 四个集合。此外,每个文档具有一个包含一个或多个节的Sections 集合,每一个节都有一个包含该节页眉和页脚的HeadersFooters 集合。注意:您可以在Microsoft Office 2000 开发人
3、员对象模型指南英文中查阅完整的 Word 对象模型。另外,您也可以使用对象浏览器和Microsoft Word Visual Basic 参考帮助来学习有关具体某个对象、属性、方法和事件的详细内容。通过VBA 使用Word 时, Document 对象处于中心位置。如果您要打开文档或创建新文档,就要创建新的Document 对象。每个打开或新创建的文档均被添加至Documents 集合。具有焦点的文档称为活动文档,由ActiveDocument 属性表示。Document 对象作为Documents 集合中的一个成员,您可以通过使用Document 对象的索引值 Document 对象在Doc
4、uments 集合中的位置,1 是集合中的第一个文档或名称来引用它。另外,您也可以使用ActiveDocument 属性来引用当前具有焦点的文档。例如,如果名为Policies.doc 的文档是唯一打开的文档,则以下三个对象变量将全部指向:Dim docOne As Dim docTwo As Dim docThree As Set docOne = Documents(1) Set docTwo = Documents(Policies.doc) Set docThree = ActiveDocument 一般情况下不要使用Documents 集合中的索引值来引用文档,因为当其它文档打开或关
5、闭时,某个特定文档的索引值可能会随之改变。通常,您可以通过使用ActiveDocument 属性或使用Documents 集合的Add 方法或Open 方法创建的Document 对象变量。以下例如显示了如何使用ActiveDocument 属性把一个地址添加到当前具有焦点的文档中:精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 1 页,共 8 页With ActiveDocument . Address:=Office Talk _ & vbCrLf & One Microsoft Way & vbCrLf _ & Redmond, WA 980
6、52, ReturnAddress:= _ David Shank & vbCrLf & _ 77 First Street & vbCrLf & _ Any Town, USA 12345 End With 下面的例如说明如何通过使用Documents 集合的Open 方法,实例化Document 对象变量。Dim docPolicy As Set docPolicy = (c:my documentspolicies.doc) 最后一个例如显示如何通过使用Add 方法,为新的空文档创建Document 对象的实例。Dim docPolicy As Set docPolicy = 通过使用O
7、pen 方法打开的文档,或者通过使用Add 方法创建的文档,都将成为用ActiveDocument 属性表示的当前活动文档。如果您想使Documents 集合里的其它文档成为活动文档,可使用Document 对象的Active 方法。一旦您获取了要操作的Document 对象,绝大部分您想通过VBA 进行的工作将涉及文本的操作。首先要指定文档的一个部分,然后对它进行某些操作。例如,添加或删除文本,或者设置单词或字符的格式。您可以使用Range 或 Selection 这两个对象来完成很多工作。在本月的专栏中,我将只讨论Range 对象。下个月我们将进一步讨论Selection 对象的具体内容。
8、理解 Word 的段落标记当您通过程序处理文本时,必须理解Word 如何处理段落标记。从根本上来看,Word 文档不过是一个巨大的字符流。人们倾向于认为文档是单词、句子和段落的集合。但实际上,文档就是一些字符。每个字符都有一定的作用。某些字符是字母、空格或制表符,另一些字符是段落标记或分页符。段落标记在Word 文档中扮演独特的角色,有时这种角色容易被误解。段落包含一个段落标记以及所有位于此段落标记和前一个段落标记之间的文本不包括前一个段落标记。另外,重要的是,段落标记本包含该段落的所有格式信息。当复制单词、句子和段落时,如果包含段落标记,则所有包含在段落标记中的格式信息也被复制,并在它们被粘
9、贴到其它位置时应用于所属段落。如果您想从段落中复制文本并将其粘贴到另一个段落中,但不想同时复制段落格式,复制时请不要包括您要复制的文本旁边的段落标记。精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 2 页,共 8 页每个空白的Word 文档仅有一个段落标记,其中同时包含Character 对象、 Word 对象、 Sentence 对象和Paragragh 对象各一个。但是,“ 属性 ” 对话框 “ 文件 ” 菜单中的 “ 统计信息 ” 选项卡将报告空白文档中没有字符、单词、句子和段落。这种差异突出显示了Word 的一个重要侧面,当编程操作这些对象
10、时,您需要特别注意这一点。Range 对象Range 对象表示文档中的一个连续范围,由一个起始字符位置和一个终止字符位置定义。这个连续范围可以小到一个插入点,大到整个文档。它也可能是而非必须是由当前节表示的范围。您也可以定义一个Range 对象,表示和当前节不同的范围。也可以在同一个文档中定义多个Range 对象。 Range 对象中的字符包含非打印字符,例如,空格、回车符和段落标记。使用 Range 对象创建Range 对象的典型方法为:声明一个Range 类型的对象变量,然后用Document 对象的Range 方法或另一个对象例如Character、 Word、Sentence 或 Se
11、lection 对象的 Range 属性来实例化该变量。例如,以下代码创建了两个Range 对象,均表示活动文档中的第二个句子。Dim rngRangeMethod As Dim rngRangeProperty As With ActiveDocument If . = 2 Then Set rngRangeMethod = .Range(.Sentences(2).Start, _ .Sentences(2).End) Set rngRangeProperty = .Sentences(2) End If End With 当您使用Range 方法来指定文档的特定范围时,您必须使用此方法的
12、Start 参数指定这个范围开始的位置,使用End 参数指定结束的位置。文档的第一个字符的字符位置为 0。最后一个字符的位置和文档的字符总数相等。您可以通过使用Characters 集合的Count 属性确定文档中的字符数。如前面的例如所示,您也可以使用Bookmark 、Selection 或 Range 对象的Start 和 End 属性来指定Range方法的Start 和 End 参数。您可以将Start 和 End 参数设置为同一个数字,这将创建一个不包含任何字符的范围。您可以使用对象的SetRange 方法设置或重新定义Range 对象的内容。您也可以通过使用Range 对象的Sta
13、rt 属性或MoveStart 方法指定或重新定义范围开始的位置。同样地,您也可以通过使用Range 对象的End 属性或它的MoveEnd 方法指定或重新定义范围结束的位置。以下例如先用ContentRagne 对象,该对象包含了文档的所有内容。接着,改变EndSetRange 方法重新定义范围,使之包含文档的第一个段落。最后,使用MoveEnd 方法将范围的结束位置扩展至文档的第二个段落末尾。此例如中的每一步都将当前范围中包含的字符的数量打印到“ 立即窗口 ” 。Sub RangeExample() Dim rngSample As Range Set rngSample = 精选学习资料
14、 - - - - - - - - - 名师归纳总结 - - - - - - -第 3 页,共 8 页With rngSample 范围现在包含 & . _ & 个字符。 .End = (1).End 范围现在包含 & . _ & 个字符。 .SetRange Start:=0, End:=ActiveDocument._ Paragraphs(1). 范围现在包含 & . _ & 个字符。 .MoveEnd Unit:=wdParagraph, Count:=1 范围现在包含 & . _ & 个字符。 End With End Sub 您也可以通过使用对象的Find 属性返回Find 对象,重
15、新定义Range 对象。以下例如演示用Find 属性在活动文档中确定文本的位置。如果找到了文本,Range 对象将自动重新定义以包含符合搜索条件的文本。With .ClearFormatting If .Execute(FindText:=Find Me!) Then rngRangeText 被重新定义。 End If End With 许多Word 对象具有可返回Range 对象的Range 属性。在您需要使用Range 对象的属性和方法进行操作,而对象本身又不提供这些属性和方法的情况下,您可以使用对象的 Range 属性返回Range 对象。例如,以下代码使用Paragragh 对象的R
16、ange 属性返回 Range 对象,从而设置文档第一个段落中文本的格式:Dim rngPara As Range Set rngPara = (1).Range With rngPara .Bold = True . = wdAlignParagraphCenter . = Arial End With 定义Range 对象后,您可以应用此对象的方法和属性修改所指定范围的内容或获取有关信息。例如,您可以使用Range 对象的StoryType 属性来确定Range 在文档中的位置。处理 Range 对象中的文本可以使用Range 对象的Text 属性来指定或确定该范围包含的文本。例如,以下代
17、码首先显示了Range 对象中的文本,然后更改文本并显示新文本,最后复原为原始文本。此例如精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 4 页,共 8 页说明了如何使用Range 对象的Range 属性将文本复制和粘贴到文档中并同时保持原段落结构不变。请注意在strNewText 变量中包含段落标记(vbCrLf) 的新文本如何替换在选定原段落时包含的段落标记。Public Sub ChangeTextSample() Dim rngText As Range Dim strOriginalText As String Dim strNewTex
18、t 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 = (1).Range With rngText MsgBox .Text, vbOKOnly, This is the original text. strOriginal
19、Text = .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 对象的StoryType 属性确定范围在文档中的位置。文档构成部分是指文档中包含文本的特定范围。在一个文档中最多可以有11 种文档构成部分,表示正文、页眉、页脚、批注等不同范围。您可以使用StoryRange
20、s 属性返回StoryRanges 集合。 StoryRanges 集合包含Range 对象,表示文档中的每一个文档构成部分。新 Word 文档只包含一个文档构成部分,称为“Main Text ”,表示文档主体部分的文本。即使一个空白文档也包含字符、单词、句子和段落各一个。您不需要专门将新文档构成部分添加至文档。当您把文本添加至文档的某个部分11 种文档构成部分之一时,Word 会自动添加它们。例如,如果您要添加页脚,Word 将添加 Footnotes 文档构成部分。如果您要添加批注,Word 将把Comments 文档构成部分添加到文档的StoryRanges 集合中。您可以使用Range
21、 属性返回Range 对象来表示文档中的每一个文档构成部分。例如,以下代码打印与Main Text 和 Comments 文档构成部分相关的文本:Dim rngMainText As Dim rngCommentsText As Set rngMainText = (wdMainTextStory) Set rngComments = (wdCommentsStory) 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 5 页,共 8 页使用Range 对象的InsertBefore 或 InsertAfter 方法,可将文本添加至现有Range 对
22、象。事实上,有一整类方法,名称以“Insert ”开头,可以用于操作Range 对象。如果有一个过程,能够把Range 对象的InsertBefore 和 InsertAfter 方法与Text 属性结合,那么它将非常有用。在编程处理文本时,就可以使用这个过程在同一个地方处理大量工作。以下所示的InsertTextInRange 正是这样一个过程。无论何时您需要将文本添加到 Range 对象,都可以调用InsertTextInRange 过程。换句话说,无论何时您需要在Word 文档中编程更改现有的文本,这一过程都将非常有用。InsertTextInRange 过程使用两个必要的变量和一个可选
23、的变量。strNewText 变量包含您想要添加至Range 对象的文本,此对象在rngRange 变量中指定。 intInsertMode 可选变量指定将新文本添加至范围的方式。变量的值是三个自定义枚举常数中的一个,指定是否使用InsertBefore 方法、 InsertAfter 方法或Text 属性替换现有的范围文本。Public Enum opgTextInsertMode Before After Replace End Enum Function InsertTextInRange(strNewText As String, _ Optional rngRange As , _
24、Optional intInsertMode As opgTextInsertMode = _ Replace) As Boolean 此过程将strNewText 参数指定文本插入 rngRange 指定的Range 对象中。它调用 IsLastCharParagraph 过程从rngRange 对象清除后续的段落标记。 Call IsLastCharParagraph(rngRange, True) With rngRange Select Case intInsertMode Case 0 在范围之前插入文本。 .InsertBefore strNewText Case 1 在范围之后插
25、入文本。 .InsertAfter strNewText Case 2 替换范围中的文本。 .Text = strNewText Case Else End Select InsertTextInRange = True End With End Function 请注意,在范围中插入文本之前,使用了IsLastCharParagraph 过程来删除最后一个段落的段落标记。以下例如使用Chr$() 函数,以字符代码13 表示段落标记。精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 6 页,共 8 页Function IsLastCharParagr
26、aph(ByRef rngTextRange As , _ Optional blnTrimParaMark As Boolean = False) As Boolean 本过程接受字符、单词、句子或段落Range 作为第一个参数。如果范围中的最后一个字符 是段落标记,则返回True;否则返回False。 本过程还接受一个Boolean 参数,用于指定 当文本最后存在段落标记时,是否将其删除。 当 blnTrimParaMark 参数为True 时,本过 程调用本身来删除所有后续的段落标记。Dim strLastChar As String strLastChar = Right$(, 1)
27、If InStr(strLastChar, Chr$(13) = 0 Then IsLastCharParagraph = False Exit Function Else IsLastCharParagraph = True If Not blnTrimParaMark = True Then Exit Function Else Do , _ + _ - 1 Call IsLastCharParagraph(rngTextRange, True) Loop While InStr(, Chr$(13) 0 End If End If End Function 在此例如中,使用了Range
28、对象的Characters 集合的Count 属性来重新定义Range 对象的终点。有关处理段落的更多信息在前面讨论过的ChangeTextSample 过程中,请注意strNewText 变量中的文本如何使用vbCrLf 内置常量在文本的结束处创建段落标记,从而替换活动文档的第1 段中的现有文本。这样做是为了防止新文档成为第二个段落的一部分。当您创建表示Character、Word 或 Sentence 对象的Range 对象,并且该对象位于段落的结束位置时,段落标记自动包含在范围之内。而且,Range 对象将包含后续的空段落标记。例如,在一个由两个段落组成的文档中,假设其中第一个段落包含三
29、个句子,而第二个段落为空,那么以下代码创建的Range 对象表示第一段中的最后一个句子:Set rngCurrentSentence = (3) 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 7 页,共 8 页因为rngCurrentSentence Range 对象引用第一个段落的最后一个句子,该段的段落标记和所有后续的空段落标记将被自动包含在范围中。如果您接着将此对象中的Text 属性应用到一个没有使用段落标记结束的文本字符串,那么文档中的第二段将被删除。当您编写在Word 文档中操作文本的VBA 代码时,您需要自行处理文本中出现的段落标记。当您在Range 对象中剪切或粘贴文本时,您可以使用两种基本方法来处理段落标记:在要插入文档的文本中,包含一个新的段落标记用vbCrLf 常量表示 ),如ChangeTextSample 过程所示。将最后的段落标记从Range 对象中排除,如在InsertTextInRange 过程中IsLastCharParagraph 函数的应用所示。精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 8 页,共 8 页