Office 中的 Word
在所有 Office 应用程序中,Microsoft Word 可能是应用最广泛的应用程序,它还经常在自定义 Office 解决方案中扮演重要的角色。开发人员用各种不同的方式使用 Word,有一些方式很简单,而另一些极其复杂。无论涉及何种自定义解决方案,用 Visual Basic for Applications (VBA) 处理 Word 文档的基本方法都是一样的
理解基本方法
在 Word 中,几乎所有的操作都要调用 Document 对象本身或其内容。当您用 VBA 操作 Word 时,Document 对象表示一个打开的文档,而且所有的 Document 对象都是 Application 对象的 Documents 集合的成员。
文档是一个由字符、单词、句子和段落组成的集合,字符组成单词,单词组成句子,句子组成段落,等等。因此,每一个 Document 对象都具有 Characters、Words、Sentences 和 Paragraghs 四个集合。此外,每个文档具有一个包含一个或多个节的 Sections 集合,每一个节都有一个包含该节页眉和页脚的 HeadersFooters 集合。
注意: 您可以在 Microsoft Office 2000 开发人员对象模型指南(英文)中查阅完整的 Word 对象模型。另外,您也可以使用对象浏览器和 Microsoft Word Visual Basic 参考帮助来学习有关具体某个对象、属性、方法和事件的详细内容。
通过 VBA 使用 Word 时,Document 对象处于中心位置。如果您要打开文档或创建新文档,就要创建新的 Document 对象。每个打开或新创建的文档均被添加至 Documents 集合。具有焦点的文档称为活动文档,由 ActiveDocument 属性表示。
Document 对象作为 Documents 集合中的一个成员,您可以通过使用 Document 对象的索引值(Document 对象在 Documents 集合中的位置,1 是集合中的第一个文档)或名称来引用它。另外,您也可以使用 ActiveDocument 属性来引用当前具有焦点的文档。例如,如果名为 Policies.doc 的文档是唯一打开的文档,则以下三个对象变量将全部指向 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 集合中的索引值来引用文档,因为当其它文档打开或关闭时,某个特定文档的索引值可能会随之改变。通常,您可以通过使用 ActiveDocument 属性或使用 Documents 集合的 Add 方法或 Open 方法创建的 Document 对象变量。以下示例显示了如何使用 ActiveDocument 属性把一个地址添加到当前具有焦点的文档中:
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
下面的示例说明如何通过使用 Documents 集合的 Open 方法,实例化 Document 对象变量。
Dim docPolicy As Word.Document
Set docPolicy = Documents.Open("c:/my documents/policies.doc")
最后一个示例显示如何通过使用 Add 方法,为新的空文档创建 Document 对象的实例。
Dim docPolicy As Word.Document
Set docPolicy = 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 对象,均表示活动文档中的第二个句子。
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
当您使用 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 方法将范围的结束位置扩展至文档的第二个段落末尾。此示例中的每一步都将当前范围中包含的字符的数量打印到“立即窗口”。
Sub RangeExample()
Dim rngSample As Range
Set rngSample = ActiveDocument.Content
With rngSample
Debug.Print "范围现在包含 " & .Characters.Count _
& " 个字符。"
.End = ActiveDocument.Sentences(1).End
Debug.Print "范围现在包含 " & .Characters.Count _
& " 个字符。"
.SetRange Start:=0, End:=ActiveDocument._
Paragraphs(1).Range.End
Debug.Print "范围现在包含 " & .Characters.Count _
& " 个字符。"
.MoveEnd Unit:=wdParagraph, Count:=1
Debug.Print "范围现在包含 " & .Characters.Count _
& " 个字符。"
End With
End Sub
您也可以通过使用对象的 Find 属性返回 Find 对象,重新定义 Range 对象。以下示例演示用 Find 属性在活动文档中确定文本的位置。如果找到了文本,Range 对象将自动重新定义以包含符合搜索条件的文本。
With rngRangeText.Find
.ClearFormatting
If .Execute(FindText:="Find Me!") Then
' rngRangeText 被重新定义。
End If
End With
许多 Word 对象具有可返回 Range 对象的 Range 属性。在您需要使用 Range 对象的属性和方法进行操作,而对象本身又不提供这些属性和方法的情况下,您可以使用对象的 Range 属性返回 Range 对象。例如,以下代码使用 Paragragh 对象的 Range 属性返回 Range 对象,从而设置文档第一个段落中文本的格式:
Dim rngPara As Range
Set rngPara = ActiveDocument.Paragraphs(1).Range
With rngPara
.Bold = True
.ParagraphFormat.Alignment = wdAlignParagraphCenter
.Font.Name = "Arial"
End With
定义 Range 对象后,您可以应用此对象的方法和属性修改所指定范围的内容或获取有关信息。例如,您可以使用 Range 对象的 StoryType 属性来确定 Range 在文档中的位置。
处理 Range 对象中的文本
可以使用 Range 对象的 Text 属性来指定或确定该范围包含的文本。例如,以下代码首先显示了 Range 对象中的文本,然后更改文本并显示新文本,最后还原为原始文本。此示例说明了如何使用 Range 对象的 Range 属性将文本复制和粘贴到文档中并同时保持原段落结构不变。请注意在 strNewText 变量中包含段落标记 (vbCrLf) 的新文本如何替换在选定原段落时包含的段落标记。
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 对象的 StoryType 属性确定范围在文档中的位置。文档构成部分是指文档中包含文本的特定范围。在一个文档中最多可以有 11 种文档构成部分,表示正文、页眉、页脚、批注等不同范围。您可以使用 StoryRanges 属性返回 StoryRanges 集合。StoryRanges 集合包含 Range 对象,表示文档中的每一个文档构成部分。
新 Word 文档只包含一个文档构成部分,称为“Main Text”,表示文档主体部分的文本。即使一个空白文档也包含字符、单词、句子和段落各一个。
您不需要专门将新文档构成部分添加至文档。当您把文本添加至文档的某个部分(11 种文档构成部分之一)时,Word 会自动添加它们。例如,如果您要添加页脚,Word 将添加 Footnotes 文档构成部分。如果您要添加批注,Word 将把 Comments 文档构成部分添加到文档的 StoryRanges 集合中。
您可以使用 Range 属性返回 Range 对象来表示文档中的每一个文档构成部分。例如,以下代码打印与 Main Text 和 Comments 文档构成部分相关的文本:
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 对象的 InsertBefore 或 InsertAfter 方法,可将文本添加至现有 Range 对象。事实上,有一整类方法,名称以“Insert”开头,可以用于操作 Range 对象。
如果有一个过程,能够把 Range 对象的 InsertBefore 和 InsertAfter 方法与 Text 属性结合,那么它将非常有用。在编程处理文本时,就可以使用这个过程在同一个地方处理大量工作。以下所示的 InsertTextInRange 正是这样一个过程。无论何时您需要将文本添加到 Range 对象,都可以调用 InsertTextInRange 过程。换句话说,无论何时您需要在 Word 文档中编程更改现有的文本,这一过程都将非常有用。
InsertTextInRange 过程使用两个必要的变量和一个可选的变量。strNewText 变量包含您想要添加至 Range 对象的文本,此对象在 rngRange 变量中指定。intInsertMode 可选变量指定将新文本添加至范围的方式。变量的值是三个自定义枚举常数中的一个,指定是否使用 InsertBefore 方法、InsertAfter 方法或 Text 属性替换现有的范围文本。
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
' 此过程将 strNewText 参数指定文本插入
' rngRange 指定的 Range 对象中。它调用
' IsLastCharParagraph 过程从 rngRange
' 对象清除后续的段落标记。
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
请注意,在范围中插入文本之前,使用了 IsLastCharParagraph 过程来删除最后一个段落的段落标记。以下示例使用 Chr$() 函数,以字符代码 13 表示段落标记。
Function IsLastCharParagraph(ByRef rngTextRange As Word.Range, _
Optional blnTrimParaMark As Boolean = False) As Boolean
' 本过程接受字符、单词、句子或段落 Range
' 作为第一个参数。如果范围中的最后一个字符
' 是段落标记,则返回 True;否则返回 False。
' 本过程还接受一个 Boolean 参数,用于指定
' 当文本最后存在段落标记时,是否将其删除。
' 当 blnTrimParaMark 参数为 True 时,本过
' 程调用本身来删除所有后续的段落标记。
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 对象的 Characters 集合的 Count 属性来重新定义 Range 对象的终点。
有关处理段落的更多信息
在前面讨论过的 ChangeTextSample 过程中,请注意 strNewText 变量中的文本如何使用 vbCrLf 内置常量在文本的结束处创建段落标记,从而替换活动文档的第 1 段中的现有文本。这样做是为了避免新文档成为第二个段落的一部分。
当您创建表示 Character、Word 或 Sentence 对象的 Range 对象,并且该对象位于段落的结束位置时,段落标记自动包含在范围之内。而且,Range 对象将包含后续的空段落标记。例如,在一个由两个段落组成的文档中,假设其中第一个段落包含三个句子,而第二个段落为空,那么以下代码创建的 Range 对象表示第一段中的最后一个句子:
Set rngCurrentSentence = ActiveDocument.Sentences(3)
因为 rngCurrentSentence Range 对象引用第一个段落的最后一个句子,该段的段落标记(和所有后续的空段落标记)将被自动包含在范围中。如果您接着将此对象中的 Text 属性应用到一个没有使用段落标记结束的文本字符串,那么文档中的第二段将被删除。
当您编写在 Word 文档中操作文本的 VBA 代码时,您需要自行处理文本中出现的段落标记。当您在 Range 对象中剪切或粘贴文本时,您可以使用两种基本方法来处理段落标记:
- 在要插入文档的文本中,包含一个新的段落标记(用 vbCrLf 常量表示),如 ChangeTextSample 过程所示。
- 将最后的段落标记从 Range 对象中排除,如在 InsertTextInRange 过程中 IsLastCharParagraph 函数的应用所示。
Office 中的 Word相关推荐
- Office中的Word无法关联内嵌EndNote
在进行论文或者文章写作的过程中,插入参考文献是一个常规操作,在文献少的时候手动插入可以完成,但是参考文献多的手动插入是一个非常不明智的方法,这时候文献管理软件Endnote就是一个非常好的工具. 之前 ...
- Office编程在dot Net环境中总结(Word生成表格报表篇)
本文的运行环境 dot FrameWork 1.1 ,Office 2003 开发环境 Vss2003 C# 前言 在 Excel中生成多个动态表格的报表是非常复杂的,因为在生成每一行数据的时候, ...
- 关于Office 中的墨迹功能(可作word电子签名)
关于Office 中的墨迹功能(可作word电子签名) 原文 关于Office 中的墨迹功能 通过使用 Microsoft Office 2003 中的墨迹功能,可使用 Tablet PC 和 Tab ...
- 关于安装Office之后,右键新建菜单中没有Word、PPT、Excel选项
文章目录 前言 一.个人感觉比较好用的方法: 二.该问题产生的原因 总结 前言 今天刚重装完系统,发现安装Office之后,右键新建菜单中没有Word.PPT.Excel选项.百度了下,相关问题的 ...
- 安装好office套件以后,右键新建中没有Word、Excel、PPT等怎么办
在新安装好office套件以后,如果右击鼠标新建过程中没有出现例如word.excel.ppt等格式的文件,那么可以尝试重启电脑试一下,如果不行的话,可以尝试修复一下 具体操作流程如下 第一步:打开控 ...
- 【已解决】WPS/OFFICE中word文件可以打印,excel打印后无响应
问题 WPS/OFFICE中word文件可以打印,excel打印后无响应 博主用的是办公室同事共享的HP打印机,在使用过程中出现了WORD文件可以打印,但是EXCEL文件打印无反应,查看打印作业进程也 ...
- Office中数学公式用Java解析,java解析word公式
公司正在做教育类产品,在遇到数学公式时,我们一般会使用latex表达式来做保存和渲染. 在其中一个项目上,遇到一个需求是要从office文档(Word或Excel)中导入题目内容至数据库,题目内容中就 ...
- word文件属性计算机删除,清除Office中个人信息等2则 -电脑资料
Q1:连续打印Word文档缺字 问:我打印Word文档,有时连续打印会发生缺字的现象,重装了几次打印机驱动程序,也重装了几次Office,还是有缺字的现象,不知道是怎么回事呢? 答:应该是打印机本身的 ...
- ABBYY在MS Office中创建PDF文件的方法
2019独角兽企业重金招聘Python工程师标准>>> ABBYY PDF Transformer+是一款可创建.编辑及将PDF文件转换为其他可编辑格式的OCR图文识别软件,不仅可以 ...
最新文章
- 关于python 中的__future__模块
- java 线程关闭小结(转)
- 002-layui颜色
- 积极的活下去本身就是挺好的一件事情了
- 09 Softmax 回归 + 损失函数 + 图片分类数据集【动手学深度学习v2】
- JPA基本注解的使用
- android布局错,Android Studio布局错误
- C++之调用C的so
- Android Studio安装、配置教程全 - 安卓开发环境的配置手册
- ssh mysql视屏_ssh+mysql实现的Java web在线订电影票系统项目源码附带视频指导教程...
- 银行突发事件演练方案_湘阴星龙村镇银行开展防抢劫应急预案实战演练
- 解决Protel 99se 老是未响应的问题
- 继屠呦呦后,下一个得诺奖的中国人可能是他?
- 自定义实现IOC与DI
- 期末前端web大作业:餐饮美食网站设计与实现——餐厅响应式网站制作html+css+javascript+jquery+bootstarp
- oracle 结果集已耗尽_java.sql.SQLException: 结果集已耗尽,该怎么解决
- 2021.10.8 车辆自适应巡航关键控制算法研究
- 阿里巴巴项目P8技术咖总结的Java心得,完整版PDF可下载
- owa for android 下载,Mobile Access for Outlook OWA
- maya2020卸载不干净_maya怎样卸载干净,如何完全彻底删除清理干净MAYA各种残留注册表和文件?...