用VBA操作Word.docx

上传人:b****4 文档编号:11975968 上传时间:2023-04-16 格式:DOCX 页数:12 大小:92.80KB
下载 相关 举报
用VBA操作Word.docx_第1页
第1页 / 共12页
用VBA操作Word.docx_第2页
第2页 / 共12页
用VBA操作Word.docx_第3页
第3页 / 共12页
用VBA操作Word.docx_第4页
第4页 / 共12页
用VBA操作Word.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

用VBA操作Word.docx

《用VBA操作Word.docx》由会员分享,可在线阅读,更多相关《用VBA操作Word.docx(12页珍藏版)》请在冰豆网上搜索。

用VBA操作Word.docx

用VBA操作Word

用VBA操作Word

用VBA操作Word

用VBA操作Word(转)

在所有Office应用程序中,MicrosoftWord可能是应用最广泛的应用程序,它还经常在自定义Office解决方案中扮演重要的角色。

开发人员用各种不同的方式使用Word,有一些方式很简单,而另一些极其复杂。

无论涉及何种自定义解决方案,用VisualBasicforApplications(VBA)处理Word文档的基本方法都是一样的。

在本栏目中,我将概括地介绍如何使用Word,并提供一些关于如何运用Range对象处理Word文档内容的详细资料。

理解基本方法

   在Word中,几乎所有的操作都要调用Document对象本身或其内容。

当您用VBA操作Word时,Document对象表示一个打开的文档,而且所有的Document对象都是Application对象的Documents集合的成员。

文档是一个由字符、单词、句子和段落组成的集合,字符组成单词,单词组成句子,句子组成段落,等等。

因此,每一个Document对象都具有Characters、Words、Sentences和Paragraghs四个集合。

此外,每个文档具有一个包含一个或多个节的Sections集合,每一个节都有一个包含该节页眉和页脚的HeadersFooters集合。

注意:

您可以在MicrosoftOffice2000开发人员对象模型指南(英文)中查阅完整的Word对象模型。

另外,您也可以使用对象浏览器和MicrosoftWordVisualBasic参考帮助来学习有关具体某个对象、属性、方法和事件的详细内容。

通过VBA使用Word时,Document对象处于中心位置。

如果您要打开文档或创建新文档,就要创建新的Document对象。

每个打开或新创建的文档均被添加至Documents集合。

具有焦点的文档称为活动文档,由ActiveDocument属性表示。

Document对象作为Documents集合中的一个成员,您可以通过使用Document对象的索引值(Document对象在Documents集合中的位置,1是集合中的第一个文档)或名称来引用它。

另外,您也可以使用ActiveDocument属性来引用当前具有焦点的文档。

例如,如果名为Policies.doc的文档是唯一打开的文档,则以下三个对象变量将全部指向Policies.doc:

 

DimdocOneAsWord.Document

    DimdocTwoAsWord.Document

    DimdocThreeAsWord.Document

SetdocOne=Documents

(1)

    SetdocTwo=Documents("Policies.doc")

    SetdocThree=ActiveDocument

 

一般情况下不要使用Documents集合中的索引值来引用文档,因为当其它文档打开或关闭时,某个特定文档的索引值可能会随之改变。

通常,您可以通过使用ActiveDocument属性或使用Documents集合的Add方法或Open方法创建的Document对象变量。

以下示例显示了如何使用ActiveDocument属性把一个地址添加到当前具有焦点的文档中:

WithActiveDocument

   .Envelope.InsertAddress:

="OfficeTalk"_

      &vbCrLf&"OneMicrosoftWay"&vbCrLf_

      &"Redmond,WA98052",ReturnAddress:

=_

      "DavidShank"&vbCrLf&_

      "77FirstStreet"&vbCrLf&_

      "AnyTown,USA12345"

EndWith

下面的示例说明如何通过使用Documents集合的Open方法,实例化Document对象变量。

 

DimdocPolicyAsWord.Document

SetdocPolicy=Documents.Open("c:

\mydocuments\policies.doc")

 

最后一个示例显示如何通过使用Add方法,为新的空文档创建Document对象的实例。

 

DimdocPolicyAsWord.Document

SetdocPolicy=Documents.Add

 

通过使用Open方法打开的文档,或者通过使用Add方法创建的文档,都将成为用ActiveDocument属性表示的当前活动文档。

如果您想使Documents集合里的其它文档成为活动文档,可使用Document对象的Active方法。

一旦您获取了要操作的Document对象,绝大部分您想通过VBA进行的工作将涉及文本的操作。

首先要指定文档的一个部分,然后对它进行某些操作。

例如,添加或删除文本,或者设置单词或字符的格式。

您可以使用Range或Selection这两个对象来完成很多工作。

在本月的专栏中,我将只讨论Range对象。

下个月我们将进一步讨论Selection对象的具体内容。

理解Word的段落标记

当您通过程序处理文本时,必须理解Word如何处理段落标记。

从根本上来看,Word文档不过是一个巨大的字符流。

人们倾向于认为文档是单词、句子和段落的集合。

但实际上,文档就是一些字符。

每个字符都有一定的作用。

某些字符是字母、空格或制表符,另一些字符是段落标记或分页符。

段落标记在Word文档中扮演独特的角色,有时这种角色容易被误解。

段落包含一个段落标记以及所有位于此段落标记和前一个段落标记之间的文本(不包括前一个段落标记)。

另外,重要的是,段落标记本包含该段落的所有格式信息。

当复制单词、句子和段落时,如果包含段落标记,则所有包含在段落标记中的格式信息也被复制,并在它们被粘贴到其它位置时应用于所属段落。

如果您想从段落中复制文本并将其粘贴到另一个段落中,但不想同时复制段落格式,复制时请不要包括您要复制的文本旁边的段落标记。

每个空白的Word文档仅有一个段落标记,其中同时包含Character对象、Word对象、Sentence对象和Paragragh对象各一个。

但是,“属性”对话框(“文件”菜单)中的“统计信息”选项卡将报告空白文档中没有字符、单词、句子和段落。

这种差异突出显示了Word的一个重要侧面,当编程操作这些对象时,您需要特别注意这一点。

Range对象

Range对象表示文档中的一个连续范围,由一个起始字符位置和一个终止字符位置定义。

这个连续范围可以小到一个插入点,大到整个文档。

它也可能是(而非必须是)由当前节表示的范围。

您也可以定义一个Range对象,表示和当前节不同的范围。

也可以在同一个文档中定义多个Range对象。

Range对象中的字符包含非打印字符,例如,空格、回车符和段落标记。

使用Range对象

   创建Range对象的典型方法为:

声明一个Range类型的对象变量,然后用Document对象的Range方法或另一个对象(例如Character、Word、Sentence或Selection对象)的Range属性来实例化该变量。

例如,以下代码创建了两个Range对象,均表示活动文档中的第二个句子。

DimrngRangeMethodAsWord.Range

DimrngRangePropertyAsWord.Range

WithActiveDocument

   If.Sentences.Count>=2Then

      SetrngRangeMethod=.Range(.Sentences

(2).Start,_

         .Sentences

(2).End)

      SetrngRangeProperty=.Sentences

(2)

   EndIf

EndWith

当您使用Range方法来指定文档的特定范围时,您必须使用此方法的Start参数指定这个范围开始的位置,使用End参数指定结束的位置。

文档的第一个字符的字符位置为0。

最后一个字符的位置和文档的字符总数相等。

您可以通过使用Characters集合的Count属性确定文档中的字符数。

如前面的示例所示,您也可以使用Bookmark、Selection或Range对象的Start和End属性来指定Range方法的Start和End参数。

您可以将Start和End参数设置为同一个数字,这将创建一个不包含任何字符的范围。

您可以使用对象的SetRange方法设置或重新定义Range对象的内容。

您也可以通过使用Range对象的Start属性或MoveStart方法指定或重新定义范围开始的位置。

同样地,您也可以通过使用Range对象的End属性或它的MoveEnd方法指定或重新定义范围结束的位置。

以下示例先用ContentRagne对象,该对象包含了文档的所有内容。

接着,改变EndSetRange方法重新定义范围,使之包含文档的第一个段落。

最后,使用MoveEnd方法将范围的结束位置扩展至文档的第二个段落末尾。

此示例中的每一步都将当前范围中包含的字符的数量打印到“立即窗口”。

SubRangeExample()

   DimrngSampleAsRange

SetrngSample=ActiveDocument.Content

WithrngSample

      Debug.Print"范围现在包含"&.Characters.Count_

         &"个字符。

"

      .End=ActiveDocument.Sentences

(1).End

      Debug.Print"范围现在包含"&.Characters.Count_

         &"个字符。

"

      .SetRangeStart:

=0,End:

=ActiveDocument._

         Paragraphs

(1).Range.End

      Debug.Print"范围现在包含"&.Characters.Count_

         &"个字符。

"

      .MoveEndUnit:

=wdParagraph,Count:

=1

      Debug.Print"范围现在包含"&.Characters.Count_

         &"个字符。

"

   EndWith

EndSub

您也可以通过使用对象的Find属性返回Find对象,重新定义Range对象。

以下示例演示用Find属性在活动文档中确定文本的位置。

如果找到了文本,Range对象将自动重新定义以包含符合搜索条件的文本。

WithrngRangeText.Find

   .ClearFormatting

   If.Execute(FindText:

="FindMe!

")Then

      'rngRangeText被重新定义。

   EndIf

EndWith

许多Word对象具有可返回Range对象的Range属性。

在您需要使用Range对象的属性和方法进行操作,而对象本身又不提供这些属性和方法的情况下,您可以使用对象的Range属性返回Range对象。

例如,以下代码使用Paragragh对象的Range属性返回Range对象,从而设置文档第一个段落中文本的格式:

DimrngParaAsRange

SetrngPara=ActiveDocument.Paragraphs

(1).Range

WithrngPara

   .Bold=True

   .ParagraphFormat.Alignment=wdAlignParagraphCenter

   .Font.Name="Arial"

EndWith

定义Range对象后,您可以应用此对象的方法和属性修改所指定范围的内容或获取有关信息。

例如,您可以使用Range对象的StoryType属性来确定Range在文档中的位置。

处理Range对象中的文本

可以使用Range对象的Text属性来指定或确定该范围包含的文本。

例如,以下代码首先显示了Range对象中的文本,然后更改文本并显示新文本,最后还原为原始文本。

此示例说明了如何使用Range对象的Range属性将文本复制和粘贴到文档中并同时保持原段落结构不变。

请注意在strNewText变量中包含段落标记(vbCrLf)的新文本如何替换在选定原段落时包含的段落标记。

PublicSubChangeTextSample()

   DimrngTextAsRange

   DimstrOriginalTextAsString

   DimstrNewTextAsString

strNewText="Thistextisreplacingtheoriginal"_

      &"textinthefirstparagraphoftheactive"_

      &"document.Thisisalldoneusingonlythe"_

      &"TextpropertyoftheRangeobject!

"&vbCrLf

SetrngText=ActiveDocument.Paragraphs

(1).Range

   WithrngText

      MsgBox.Text,vbOKOnly,"Thisistheoriginaltext."

      strOriginalText=.Text

      .Text=strNewText

      MsgBox.Text,vbOKOnly,"Thisisthenewtext"_

         &"insertedinparagraph1."

      .Text=strOriginalText

      MsgBox"Theoriginaltextisrestored."

   EndWith

EndSub

您可以使用Range对象的StoryType属性确定范围在文档中的位置。

文档构成部分是指文档中包含文本的特定范围。

在一个文档中最多可以有11种文档构成部分,表示正文、页眉、页脚、批注等不同范围。

您可以使用StoryRanges属性返回StoryRanges集合。

StoryRanges集合包含Range对象,表示文档中的每一个文档构成部分。

新Word文档只包含一个文档构成部分,称为“MainText”,表示文档主体部分的文本。

即使一个空白文档也包含字符、单词、句子和段落各一个。

您不需要专门将新文档构成部分添加至文档。

当您把文本添加至文档的某个部分(11种文档构成部分之一)时,Word会自动添加它们。

例如,如果您要添加页脚,Word将添加Footnotes文档构成部分。

如果您要添加批注,Word将把Comments文档构成部分添加到文档的StoryRanges集合中。

您可以使用Range属性返回Range对象来表示文档中的每一个文档构成部分。

例如,以下代码打印与MainText和Comments文档构成部分相关的文本:

DimrngMainTextAsWord.Range

DimrngCommentsTextAsWord.Range

SetrngMainText=ActiveDocument.StoryRanges(wdMainTextStory)

SetrngComments=ActiveDocument.StoryRanges(wdCommentsStory)

Debug.PrintrngMainText.Text

Debug.PrintrngComments.Text

使用Range对象的InsertBefore或InsertAfter方法,可将文本添加至现有Range对象。

事实上,有一整类方法,名称以“Insert”开头,可以用于操作Range对象。

如果有一个过程,能够把Range对象的InsertBefore和InsertAfter方法与Text属性结合,那么它将非常有用。

在编程处理文本时,就可以使用这个过程在同一个地方处理大量工作。

以下所示的InsertTextInRange正是这样一个过程。

无论何时您需要将文本添加到Range对象,都可以调用InsertTextInRange过程。

换句话说,无论何时您需要在Word文档中编程更改现有的文本,这一过程都将非常有用。

InsertTextInRange过程使用两个必要的变量和一个可选的变量。

strNewText变量包含您想要添加至Range对象的文本,此对象在rngRange变量中指定。

intInsertMode可选变量指定将新文本添加至范围的方式。

变量的值是三个自定义枚举常数中的一个,指定是否使用InsertBefore方法、InsertAfter方法或Text属性替换现有的范围文本。

PublicEnumopgTextInsertMode

    Before

    After

    Replace

EndEnum

FunctionInsertTextInRange(strNewTextAsString,_

         OptionalrngRangeAsWord.Range,_

         OptionalintInsertModeAsopgTextInsertMode=_

         Replace)AsBoolean

   '此过程将strNewText参数指定文本插入

   'rngRange指定的Range对象中。

它调用

   'IsLastCharParagraph过程从rngRange

   '对象清除后续的段落标记。

 

   CallIsLastCharParagraph(rngRange,True)

WithrngRange

      SelectCaseintInsertMode

         Case0'在范围之前插入文本。

            .InsertBeforestrNewText

         Case1'在范围之后插入文本。

            .InsertAfterstrNewText

         Case2'替换范围中的文本。

            .Text=strNewText

         CaseElse

      EndSelect

      InsertTextInRange=True

   EndWith

EndFunction

请注意,在范围中插入文本之前,使用了IsLastCharParagraph过程来删除最后一个段落的段落标记。

以下示例使用Chr$()函数,以字符代码13表示段落标记。

FunctionIsLastCharParagraph(ByRefrngTextRangeAsWord.Range,_

         OptionalblnTrimParaMarkAsBoolean=False)AsBoolean

   '本过程接受字符、单词、句子或段落Range

   '作为第一个参数。

如果范围中的最后一个字符

   '是段落标记,则返回True;否则返回False。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经管营销 > 经济市场

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1