用VBA操作Word_第1页
用VBA操作Word_第2页
免费预览已结束,剩余6页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、用VBA操作Word(转)在所有 Office 应用程序中,Microsoft Word 可能是应用最广泛的应用程序,它还经常在自定 义 Office 解决方案中扮演重要的角色。开发人员用各种不同的方式使用Word,有一些方式很简单,而另一些极其复杂。无论涉及何种自定义解决方案,用Visual Basic for Applicatio ns (VBA) 处理 Word 文档的基本方法都是一样的。在本栏目中,我将概括地介绍如何使用Word,并提供一些关于如何运用Range 对象处理 Word 文档内容的详细资料。理解基本方法在 Word 中,几乎所有的操作都要调用Document 对象本身或其内

2、容。当您用 VBA 操作Word 时,Document 对象表示一个打开的文档,而且所有的Document 对象都是 Application 对象的 Documents 集合的成员。文档是一个由字符、单词、句子和段落组成的集合,字符组成单词,单词组成句子,句子组成段落,等等。因此,每一个Document 对象都具有 Characters、Words、Sentences 和 Paragraghs 四个集合。此外,每个文档具有一个包含一个或多个节的Sections 集合,每一个节都有一个包含该节页眉和页脚的 HeadersFooters 集合。注意: 您可以在 Microsoft Office 2

3、000 开发人员对象模型指南(英文)中查阅完整的Word对象模型。另外,您也可以使用对象浏览器和Microsoft Word Visual Basic 参考帮助来学习有关具体某个对象、属性、方法和事件的详细内容。通过 VBA 使用 Word 时,Document 对象处于中心位置。如果您要打开文档或创建新文档, 就要创建新的Document 对象。每个打开或新创建的文档均被添加至Documents 集合。具有焦点的文档称为活动文档,由ActiveDocument 属性表示。Document 对象作为 Documents 集合中的一个成员,您可以通过使用Document 对象的索引值(Docum

4、ent 对象在 Documents 集合中的位置,1 是集合中的第一个文档)或名称来引用它。另 外,您也可以使用 ActiveDocument 属性来引用当前具有焦点的文档。例如,如果名为Policies.doc的文档是唯一打开的文档,则以下三个对象变量将全部指向Policies.doc:Dim docO ne As Word.Docume ntDim docTwo As Word.Docume ntDim docThree As Word.Docume ntSet docO ne = Docume nts(1)Set docTwo = Docume nts(Policies.doc)Set

5、docThree = ActiveDocume nt一般情况下不要使用Documents 集合中的索引值来引用文档,因为当其它文档打开或关闭时,某个特定文档的索引值可能会随之改变。通常,您可以通过使用ActiveDocument 属性或使用Documents 集合的 Add 方法或 Open 方法创建的 Document 对象变量。以下示例显示了如何使用 ActiveDocument 属性把一个地址添加到当前具有焦点的文档中:With ActiveDocume nt.En velope .Insert Address:=Office Talk _& vbCrLf & One Microsoft

6、 Way & vbCrLf _& Redmo nd, WA 98052, ReturnAddress:= _David Sha nk & vbCrLf & _77 First Street & vbCrLf & _A ny Tow n, USA 12345End With下面的示例说明如何通过使用Documents 集合的 Open 方法,实例化 Document 对象变量。Dim docPolicy As Word.Docume ntSet docPolicy = Docume nts.Ope n(c:my docume ntspolicies.doc)最后一个示例显示如何通过使用Add 方

7、法,为新的空文档创建Document 对象的实例。Dim docPolicy As Word.Docume ntSet docPolicy = Docume nts.Add通过使用 Open 方法打开的文档,或者通过使用Add 方法创建的文档,都将成为用ActiveDocument 属性表示的当前活动文档。如果您想使Documents 集合里的其它文档成为活动文档,可使用 Document 对象的 Active 方法。一旦您获取了要操作的Document 对象,绝大部分您想通过VBA 进行的工作将涉及文本的操作。首先要指定文档的一个部分,然后对它进行某些操作。例如,添加或删除文本,或者设置单词

8、 或字符的格式。您可以使用Range 或 Selection 这两个对象来完成很多工作。在本月的专栏中,我将只讨论 Ran ge 对象。下个月我们将进一步讨论Selecti on 对象的具体内容。理解Word的段落标记当您通过程序处理文本时,必须理解Word 如何处理段落标记。从根本上来看,Word 文档不过是一个巨大的字符流。人们倾向于认为文档是单词、句子和段落的集合。但实际上,文档就是一 些字符。每个字符都有一定的作用。某些字符是字母、空格或制表符,另一些字符是段落标记或分 页符。段落标记在 Word 文档中扮演独特的角色,有时这种角色容易被误解。段落包含一个段落标记 以及所有位于此段落标

9、记和前一个段落标记之间的文本(不包括前一个段落标记)。另外,重要的 是,段落标记本包含该段落的所有格式信息。当复制单词、句子和段落时,如果包含段落标记,则所有包含在段落标记中的格式信息也被复 制,并在它们被粘贴到其它位置时应用于所属段落。如果您想从段落中复制文本并将其粘贴到另一个段落中,但不想同时复制段落格式,复制时请 不要包括您要复制的文本旁边的段落标记。每个空白的 Word 文档仅有一个段落标记,其中同时包含Character 对象、Word 对象、Sentenee 对象和 Paragragh 对象各一个。但是,属性对话框(文件菜单)中的 统计信息选项卡将报告空白文档中没有字符、单词、句子

10、和段落。这种差异突出显示了Word 的一个重要侧面,当编程操作这些对象时,您需要特别注意这一点。Range 对象Ran ge 对象表示文档中的一个连续范围,由一个起始字符位置和一个终止字符位置定义。这个 连续范围可以小到一个插入点,大到整个文档。它也可能是(而非必须是)由当前节表示的范围。 您也可以定义一个Range 对象,表示和当前节不同的范围。也可以在同一个文档中定义多个Range对象。Range 对象中的字符包含非打印字符,例如,空格、回车符和段落标记。使用Range对象创建 Range 对象的典型方法为:声明一个Range 类型的对象变量,然后用 Document 对象的Range 方

11、法或另一个对象(例如 Character、Word、Sentence 或 Selection 对象)的 Range 属性来 实例化该变量。例如,以下代码创建了两个Range 对象,均表示活动文档中的第二个句子。Dim rngRa ngeMethod As Word.Ra ngeDim rn gRa ngeProperty As Word.Ra ngeWith ActiveDocume ntIf .Se nten ces.Co unt = 2 ThenSet rngRa ngeMethod = .Ran ge(.Se nten ces(2).Start, _.Se nten ces(2).E n

12、d)Set rn gRa ngeProperty = .Se nten ces(2)End IfEnd With当您使用 Range 方法来指定文档的特定范围时,您必须使用此方法的 Start 参数指定这个范围 开始的位置,使用 End 参数指定结束的位置。文档的第一个字符的字符位置为0。最后一个字符的位置和文档的字符总数相等。您可以通过使用Characters 集合的 Count 属性确定文档中的字符数。如前面的示例所示,您也可以使用Bookmark、Selection 或 Range 对象的 Start 和 End 属性来指定 Range 方法的 Start 和 End 参数。您可以将St

13、art 和 End 参数设置为同一个数字,这将创建一个不包含任何字符的范围。您可以使用对象的 SetRa nge 方法设置或重新定义 Range 对象的内容。您也可以通过使用 Range 对象的Start 属性或 MoveStart 方法指定或重新定义范围开始的位置。同样地,您也可以通 过使用 Range 对象的 End 属性或它的 MoveEnd 方法指定或重新定义范围结束的位置。以下示例先用ContentRagne 对象,该对象包含了文档的所有内容。接着,改变EndSetRange方法重新定义范围,使之包含文档的第一个段落。最后,使用MoveEnd 方法将范围的结束位置扩展至文档的第二个段

14、落末尾。此示例中的每一步都将当前范围中包含的字符的数量打印到立即窗口”。Sub Ran geExample()Dim rngSample As RangeSet rn gSample = ActiveDocume nt.C ontentWith rngSampleDebug .Print 范围现在包含” & .Characters.Count _& ”个字符。”.End = ActiveDocume nt.Se nten ces(1).E ndDebug .Print 范围现在包含” & .Characters.Count _& ”个字符。”.SetRa nge Start:=0, En d:

15、=ActiveDocume nt._Paragraphs(1).Ra nge.E ndDebug .Print 范围现在包含 ” & .Characters.Count _& ”个字符。”.MoveE nd Un it:=wdParagraph, Coun t:=1Debug .Print 范围现在包含 ” & .Characters.Count _& ”个字符。”End WithEnd Sub您也可以通过使用对象的Find 属性返回 Find 对象,重新定义Range 对象。以下示例演示用Find 属性在活动文档中确定文本的位置。如果找到了文本,Range 对象将自动重新定义以包含符合搜索条

16、件的文本。With rn gRa ngeText. Find.ClearFormatt ingIf .Execute(FindText:=Find Me!) ThenrngRangeText 被重新定义。End IfEnd With许多 Word 对象具有可返回Range 对象的 Range 属性。在您需要使用Range 对象的属性和方法进行操作,而对象本身又不提供这些属性和方法的情况下,您可以使用对象的Range 属性返回Range 对象。例如,以下代码使用Paragragh 对象的 Ra nge 属性返回 Range 对象,从而设置文档第一个段落中文本的格式:Dim rn gPara As

17、 RangeSet rn gPara = ActiveDocume nt.Paragraphs(1).Ra ngeWith rngPara.Bold = True.ParagraphFormat.Alig nment = wdAlig nParagraphCe nter.Fo nt.Name = ArialEnd With定义 Range 对象后,您可以应用此对象的方法和属性修改所指定范围的内容或获取有关信 息。例如,您可以使用Range 对象的 StoryType 属性来确定 Range 在文档中的位置。处理Range对象中的文本可以使用 Range 对象的 Text 属性来指定或确定该范围

18、包含的文本。例如,以下代码首先显示 了 Range对象中的文本,然后更改文本并显示新文本,最后还原为原始文本。此示例说明了如何使 用 Range 对象的 Range属性将文本复制和粘贴到文档中并同时保持原段落结构不变。请注意在 strNewText 变量中包含段落标记(vbCrLf)的新文本如何替换在选定原段落时包含的段落标记。Public Sub Cha ngeTextSample()Dim rn gText As RangeDim strOrigi nalText As Stri ngDim strNewText As Stri ngstrNewText = This text is re

19、placing the original _& text in the first paragraph of the active _& docume nt. This is all done using only the _& ” Text property of the Ra nge object! & vbCrLfSet rn gText = ActiveDocume nt.Paragraphs(1).Ra ngeWith rngTextMsgBox .Text, vbOKOnly, This is the original text.strOrigi nalText = .Text.T

20、ext = strNewTextMsgBox .Text, vbOKOnly, This is the new text _& in serted in paragraph 1.Text = strOrigi nalTextMsgBox The origi nal text is restored.End WithEnd Sub您可以使用 Range 对象的 StoryType 属性确定范围在文档中的位置。文档构成部分是指文档 中包含文本的特定范围。在一个文档中最多可以有11 种文档构成部分,表示正文、页眉、页脚、批注等不同范围。您可以使用StoryRanges 属性返回 StoryRange

21、s 集合。StoryRanges 集合包含Ran ge 对象,表示文档中的每一个文档构成部分。新 Word 文档只包含一个文档构成部分,称为“Main Text,表示文档主体部分的文本。即使一个空白文档也包含字符、单词、句子和段落各一个。您不需要专门将新文档构成部分添加至文档。当您把文本添加至文档的某个部分(11 种文档构成部分之一)时, Word 会自动添加它们。例如,如果您要添加页脚,Word 将添加 Foot notes 文档构成部分。如果您要添加批注,Word 将把 Comments 文档构成部分添加到文档的StoryRanges集合中。您可以使用 Ra nge 属性返回 Ra nge

22、 对象来表示文档中的每一个文档构成部分。例如,以下代 码打印与Main Text 和 Comments 文档构成部分相关的文本:Dim rngMa in Text As Word.Ra ngeDim rngComme ntsText As Word.Ra ngeSet rn gMa in Text = ActiveDocume nt.StoryRa nges(wdMa in TextStory)Set rn gComme nts = ActiveDocume nt.StoryRa nges(wdComme ntsStory)Debug.Pri nt rn gMa in Text.TextDeb

23、ug.Pri nt rn gComme nts.Text使用 Range 对象的 InsertBefore 或 InsertAfter 方法,可将文本添加至现有Range 对象。事实上,有一整类方法,名称以“ In sert 开头,可以用于操作Range 对象。如果有一个过程,能够把 Range 对象的 InsertBefore 和 InsertAfter 方法与 Text 属性结合, 那么它将非常有用。在编程处理文本时,就可以使用这个过程在同一个地方处理大量工作。以下所示的 InsertTextInRange 正是这样一个过程。无论何时您需要将文本添加到Range 对象,都可以调用 Inse

24、rtTextInRange 过程。换句话说,无论何时您需要在Word 文档中编程更改现有的文本,这一过程都将非常有用。InsertTextInRange 过程使用两个必要的变量和一个可选的变量。strNewText 变量包含您想要添加至 Range 对象的文本,此对象在rngRange 变量中指定。intlnsertMode 可选变量指定将新文本添加至范围的方式。变量的值是三个自定义枚举常数中的一个,指定是否使用InsertBefore 方法、InsertAfter 方法或 Text 属性替换现有的范围文本。Public Enum opgText In sertModeBeforeAfterR

25、eplaceEnd EnumFunction In sertTextI nRan ge(strNewText As String, _Optio nal rn gRa nge As Word.Ra nge, _Opti onal intln sertMode As opgText In sertMode = _Replace) As Boolea n此过程将 strNewText 参数指定文本插入rngRa nge 指定的 Range 对象中。它调用TsLastCharParagraph 过程从 rngRange对象清除后续的段落标记。Call lsLastCharParagraph(r ng

26、Ra nge, True)With rn gRa ngeSelect Case intln sertModeCase 0 在范围之前插入文本。n sertBefore strNewTextCase 1 在范围之后插入文本。n sertAfter strNewTextCase 2 替换范围中的文本。.Text = strNewTextCase ElseEnd SelectIn sertText InRange = TrueEnd WithEnd Function请注意,在范围中插入文本之前,使用了 IsLastCharParagraph 过程来删除最后一个段落的段落 标记。以下示例使用 Chr$

27、()函数,以字符代码13 表示段落标记。Function lsLastCharParagraph(ByRef rn gTextRa nge As Word.Ra nge, _Opti onal bln TrimParaMark As Boolea n = False) As Boolea n本过程接受字符、单词、句子或段落Range作为第一个参数。如果范围中的最后一个字符是段落标记,则返回True;否则返回 False。本过程还接受一个Boolean 参数,用于指定当文本最后存在段落标记时,是否将其删除。当 blnTrimParaMark 参数为 True 时,本过程调用本身来删除所有后续的段落标记。Dim strLastChar As Stri ngstrLastChar = Right$(rngTextRa nge.Text, 1)If In Str(strLastChar, Chr$(13) = 0 The nIsLastCharParagraph = FalseExit Fun cti onElseIsLastCharParagraph = TrueIf Not bl nTrimParaMark = True The nExit Fun cti onElseDorn gTextRa nge.SetRa nge rngTextR

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论