第四课:WORD中的Range对象
在操纵Word VBA,绝大多数是针对Word中的各视图中的文本进行的,正确掌握、理解和应用Word Range是Word Vba的重要一课,初学者甚至熟悉Excel的编程人员,往往对Word 中的Range对象手足无措,原因是不了解Word中Range对象的本质和意义。 1. Range 对象的定义:
该对象代表文档中的一个连续范围。每一个 Range 对象由一起始和一终止字符位置定义。和文档中书签的使用方法类似,Visual Basic 使用 Range 对象识别文档的指定部分。但和书签不同,Range 对象只在定义该对象的过程正在运行时才存在。
Range 对象和所选内容相互独立。也就是说,可定义和复制一个范围而不需改变所选内容。还可在文档中定义多个范围,但每一个窗格中只能有一个所选内容。
透彻的理解,只要是以文本形式存在的区域,就有Range对象,无论是页眉页脚中,批注脚注中,还是图形的文本框中,无论是一个光标,一个字符、一个词、一个句子、一个段落、一节还是一个文档,都可以看成是一个Range对象。 2. 对比Range对象
如果同EXCEL中的Range对象对比,你也许会更容易理解一些。
Excel中,每个单元格,是一个Range对象,连续或者非连续的单元格,都可以组成一个Range对象,它由单元格地址组成的;在Word中,每个字符是一个“单元格”,它是由每个字符(无论是否可见,如段落标记等)构成了一个文档的Range对象,尽管它存活在运行时间中,也就是凡是由字符组成的具有起点和终点位置的连续文本,哪怕起点等于终点(光标)或者终点是起点位置的下一个字符,都是一个Range对象。 而Word中的Selection对象可以理解成EXCEL中的ActiveCell对象。 3. StoryRanges对象:
StoryRanges由 Range 对象组成的集合,该集合代表文档中的文字部分。可使用 StoryRanges(index) 返回单个部分(作为一个 Range 对象),其中 index 为一个 wdStoryType 常量。
Start、End和StoryType属性唯一地确定了一个Range对象。Start和End属性分别返回或者设置Range对象的起始和结束字符的位置。每个文档构成部分起始处的字符位置是0 (zero),而第一个字符之后的位置是1,依此类推。StoryType 属性的WdStoryType常量可以表示十一种不同的文档构成部分类型,如下: wdCommentsStory wdEndnotesStory
wdEvenPagesFooterStory wdEvenPagesHeaderStory wdFirstPageFooterStory wdFirstPageHeaderStory wdFootnotesStory wdMainTextStory
wdPrimaryFooterStory wdPrimaryHeaderStory wdTextFrameStory (3) 在句子中循环
以下示例罗列出所选文本中的句子数量和结尾的标点符号。 Sub Example()
Dim i As Range, SenCount As Integer, MyString As String, EndChar As String With Selection
If .Type = wdSelectionIP Then Exit Sub
SenCount = .Sentences.Count '取得所选内容的句子数 For Each i In .Sentences '在句子中循环
'如果句子中的最后一个字符为段落标记则EndChar为段落标记的前一个字符 If i.Characters(i.Characters.Count) = Chr(13) Then EndChar = i.Characters(i.Characters.Count - 1) Else
EndChar = i.Characters(i.Characters.Count) End If
'以英文分号为分隔符,将结束标点在变量中累加 MyString = MyString & \Next
'去除最后一个\
MyString = Right(MyString, Len(MyString) - 1) End With
MsgBox \所选内容的句子数:\它们的结束标点分别为:\End Sub
(4) 在段落中循环
以下示例将本文档中的空白段落删除,并提示删除的空白段落数量。 Sub Example()
Dim Par As Paragraph, ParRange As Range, BlankCount As Integer Application.ScreenUpdating = False For Each Par In Me.Paragraphs Set ParRange = Par.Range
If Len(ParRange) = 1 Then ParRange.Delete: BlankCount = BlankCount + 1 Next
Application.ScreenUpdating = True
MsgBox \共为您删除了\个空白段落!\End Sub
(5) 表格中的Range对象
以下示例将活动文档表格1中的空白单元格填充0值。 Sub Sample()
Dim myTable As Table, oCell As Cell Set myTable = ActiveDocument.Tables(1) For Each oCell In myTable.Range.Cells
If oCell.Range.End - oCell.Range.Start = 1 Then oCell.Range = 0 Next End Sub
以下示例在表格的起始位置插入表格各单元格中的文本,然后删除表格。 Sub Sample()
Dim myTable As Table, myRange As Range, CellsString As String With ActiveDocument
Set myTable = .Tables(1)
Set myRange = .Range(myTable.Range.Start, myTable.Range.Start) CellsString = myTable.Range.Text myTable.Delete
myRange.InsertAfter CellsString End With End Sub
(6) 节中的Range对象
以下示例中统计每节的字符数(含所有可见与不可见字符),以及显示本节的结束位置。 Dim i As Section, MyRange As Range For Each i In ThisDocument.Sections
Set MyRange = ThisDocument.Range(i.Range.End - 1, i.Range.End - 1)
MsgBox \第\字符总符为:\该节结束标记位于第\MyRange.Information(wdActiveEndPageNumber) & \页中.\Next
(7) Find与Replacement中的Range 对象 以下示例在文档中向下搜索(向尾部)“狐狸”,并在其上方标注上标字体的编号。
Sub Sample()
Dim MyRange As Range, FindCount As Integer Application.ScreenUpdating = False '定义一个Range对象 GN: With ActiveDocument
If Not MyRange Is Nothing Then
Set MyRange = .Range(MyRange.End, .Content.End) Else
Set MyRange = ActiveDocument.Content End If End With
With MyRange.Find '查找
.ClearFormatting '清除查找格式 .Forward = True '向下搜索 .Text = \狐狸\搜索文本
Do While .Execute '如果能查找到 FindCount = FindCount + 1 '计数
MyRange.InsertAfter FindCount '在查找到的文本区域后插入数字 '将此数字变为上标格式
MyRange.Words(MyRange.Words.Count).Font.Superscript = True GoTo GN'转到指定的行标签处 Loop End With
Application.ScreenUpdating = True End Sub
(8) 书签中的Range对象
以下示例将活动文档中的书签对应的文本区域设置字体格式 Dim oBmk As Bookmark
For Each oBmk In ActiveDocument.Bookmarks With oBmk.Range.Font .Bold = True .Name = \宋体\.Size = 14
.Color = wdColorRed End With Next
(9) 修订中的Range对象
以下示例显示活动文档中第一个修订对象的位置
Dim StartRange As Range, EndRange As Range, MyRange As Range Set MyRange = ActiveDocument.Revisions(1).Range With MyRange
If ActiveDocument.Revisions(1).Type = wdRevisionDelete Then Set StartRange = ActiveDocument.Range(.Start, .Start)
Set EndRange = ActiveDocument.Range(.End + .Start - 2, .End + .Start - 2)
MsgBox \您第一个修订区域的起始页码为\& \您第一个修订区域的起始行号为\& \您第一个修订区域的起始列数为\& \您第一个修订区域的结束页码为\
& \您第一个修订区域的结束行号为\
& \您第一个修订区域的结束列数为\
End If End With
(10) 页眉页脚中的Range对象 Sub Example()
Dim myRange As Range
'定义一个Range对象,为活动文档第一节的页脚
Set myRange = ActiveDocument.Sections(1).Footers(wdHeaderFooterPrimary).Range With myRange
'它将覆盖原有文本内容
.Text = \'居右
.ParagraphFormat.Alignment = wdAlignParagraphRight .Font.Name = \.Font.ColorIndex = wdBlue End With End Sub
(11) 自选图形中的Range对象
以下示例修改活动文档中第一个文本框中第三段落中的指定字符: Dim MyRange As Range, TabPostion As Integer
'定义一个Range对象,注意这是一个文本框区域的Range对象,而非DOCUMENT下的正文文字部分的Range对象 Set MyRange = ActiveDocument.StoryRanges(wdTextFrameStory).Paragraphs(3).Range '取得制表位的位置
TabPostion = VBA.InStr(MyRange, vbTab)
'重新定义该RANGE对象的起始位置和结束位置,由于要改写两个地方,因此,可以重后面先改写,这样TAB的位置不需重新计算
MyRange.SetRange MyRange.Start + TabPostion + 2, MyRange.End - 1 '改写文本内容
MyRange.Text = \
'再次定义MyRange对象(恢复)
Set MyRange = ActiveDocument.StoryRanges(wdTextFrameStory).Paragraphs(3).Range '重新定义
MyRange.SetRange MyRange.Start + 4, MyRange.Start + TabPostion - 1 '改写文本内容
MyRange.Text = \(12) Shapes中的Range方法 本示例逢单选定图形 Option Explicit
Option Base 1 '下标为1 Sub Example()
Dim i As Integer, ShapesCount As Integer, myArray() As Variant With ActiveDocument
ShapesCount = .Shapes.Count '自选图形总数 '声明一个动态一维数组
ReDim myArray(Int((ShapesCount + 1) / 2)) For i = 1 To ShapesCount Step 2 myArray((i + 1) / 2) = i '分配数组 Next
.Shapes.Range(myArray()).Select '选定图形 End With End Sub