用VBA操作Word.docx
- 文档编号:11975968
- 上传时间:2023-04-16
- 格式:DOCX
- 页数:12
- 大小:92.80KB
用VBA操作Word.docx
《用VBA操作Word.docx》由会员分享,可在线阅读,更多相关《用VBA操作Word.docx(12页珍藏版)》请在冰豆网上搜索。
用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。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- VBA 操作 Word
![提示](https://static.bdocx.com/images/bang_tan.gif)