在Word
VBA
中,光标对象的名称为Selection
。一个Selection
实际上由两个位置指示器组成,其中一个指示器称为Start
,一个指示器称为End
,分别代表光标的起始位置和结束位置。当Start
与End
相等时,光标显示为一条竖线,不相等时光标显示为一个选择区域。
光标的移动主要有两大类方法,一种为Move
系方法,一种为GoTo
系方法。
1
、 Move
系方法
包括Move
、MoveDown
、MoveEnd
、MoveEndUntil
、MoveEndWhile
、MoveLeft
、MoveRight
、MoveStart
、MoveStartUntil
、MoveStartWhile
、MoveUntil
、MoveUp
、MoveWhile
、HomeKey
、EndKey
、StartOf
、EndOf
等,这些方法的共同特点是返回一个整型值,表示实际移动的数量,参数中一般都包含一个unit
(移动单位)和一个count
(移动数量),其中unit
参数可取值为WdUnits
枚举类型。部分方法还有一个Extend
参数,默认值为wdMove
,表示Start
位置指示器和End
位置指示器捆绑在一起移动,形成光标移动效果;当它取值为wdExtend
时,向后移动只有Start
位置指示器移动,向前移动只有End
位置指示器移动,形成选择一个区域的效果。此外,StartOf
、EndOf
与HomeKey
、EndKey
比较,前面两个方法的unit
参数可用的类型更多,例如wdSection
就只能用于做前者的参数而不能用于做后者的参数(office2010
,其它版本是否如此未测试)。
2
、 Goto
系方法
包括GoTo
、GoToNext
、GoToPrevious
等。
这组方法与Move
方法最大的差别是它的返回值为代表当前选择区域的Range
。无法从这组方法中知道实际移动了多少数量。它的参数有四个。what
参数取值为WdGoToItem
常量之一;which
参数为WdGoToDirection
常量之一;count
参数为项的数目,于Move
系方法不同的是,count
不能为负数;最后一个参数为name
,如果what
参数值为wdGoToBookmark
、 wdGoToComment
、 wdGoToField
或 wdGoToObject
,那么这个参数可以指定一个名称。
下面的代码演示先记录光标位置,在进行一些操作后恢复光标位置:
Sub SelectionPositionDemo()
Dim position, count As Long
position = Selection.Start
'记录光标距离文档最后一个字符的位置,注意光标不能在最后一个回车符之后,所以要调整一个字符
count = position - ActiveDocument.Characters.count + 1
'这里可以添加操作文档的代码,如果这些操作改变了文章内容的长度,需要调整及时count
'恢复光标位置:先将光标移动至文档末尾,再移动count个字符
Selection.EndOf wdStory
Selection.Move wdCharacter, count
Debug.Print "position:" & Selection.Start & "start:" & Selection.Start
End Sub
主要包括以下Insert
系列方法:InsertAfter
、InsertBefore
、InsertBreak
、InsertCaption
、InsertCells
、InsertColumns
、InsertColumnsRight
、InsertCrossReference
、InsertDateTime
、InsertFile
、InsertFormula
、InsertNewPage
、InsertParagraph
、InsertParagraphAfter
、InsertParagraphBefore
、InsertRows
、InsertRowsAbove
、InsertRowsBelow
、InsertStyleSeparator
、InsertSymbol
、InsertXML
。
还有一个直接输入字符串的方法TypeText
,输入的字符串由参数Text
指定。
Selection
获取其他对象1
、获取Range
对象:直接使用Selection
对象的Range
属性。
2
、获取BookMark
、Field
、Paragraph
、Character
、Section
、Cell
、Row
、Word
、Table
等对象:
这些对象在Selection
对象中均有相应的集合属性,使用Selection
对象的相应集合属性加上索引即可取得。所有索引均从1
开始计数。例如:Selection
. Paragraphs(1)
可以取得光标区域第一个段落,Selection
. Fields(1)
可以取得选择区的第一个域。
这些对象均可以通过For
Each
语句进行遍历。
直接用Selection.HeaderFooter
操作页眉页脚容易出错,需要先确保Selection
已经在页眉页脚区域中。可以通过Selection.Sections(1).Headers(wdHeaderFooterPrimary).Range.Select
将光标移动到当前光标所在页的页眉中。但是这一操作会导致视图变换为草稿视图。可以通过以下操作将视图恢复为页面视图:
' 恢复视图为页面视图
If ActiveWindow.View.SplitSpecial <> wdPaneNone Then
ActiveWindow.Panes(2).Close
End If
ActiveWindow.ActivePane.View.Type = wdPrintView
可以通过Selection
对象的位置指示器与文档内容结束位置的比较来判断光标是否已到达文档内容的结束位置。文档结束位置可以使用ActiveDocument.Content.End - 1
取得。如下代码片段,光标放在文档主体内容的最后一个回车符处时,将提示“True
”,否则将提示“False
”。需要注意的是,如果文档最后一页有脚注或尾注或光标位于最后一页页脚的最后一个回车符位置,下面的代码也将提示“False
”。
MsgBox Selection.start = (ActiveDocument.Content.End - 1)
VBA
中使用查找和替换,可以通过Selection
对象的Find
属性的Execute
方法实现。以下示例在选择范围内向前搜索“Microsoft”。 如果找到了该单词,则自动将其选中。
With Selection.Find
.Forward = True
.ClearFormatting
.MatchWholeWord = True
.MatchCase = False
.Wrap = wdFindContinue
.Execute FindText:="Microsoft"
End With
下面的示例查找选择范围内所有的“hi”,并且将其替换为“hello”。
With Selection.Find
.Forward = True
.ClearFormatting
.MatchWholeWord = True
.MatchCase = False
.Wrap = wdFindContinue
.Execute FindText:="hi", _
ReplaceWith:="hello", Replace:=wdReplaceAll
End With
VBA
中,Range
对象及其子类对象(如Selection
、Character
、Word
等)都有Information
方法,该方法有一个Type
参数,这个参数的取值为wdInformation
枚举类型,该枚举类型指定我们需要获取的信息,可用枚举值及其含义如下:
名称 | 值 | Description |
---|---|---|
wdActiveEndAdjustedPageNumber | 1 | 返回包含指定的所选内容或区域的活动结尾的页面数。 如果设置一个起始页码或进行其他手动调整,则返回经调整的页码(与 wdActiveEndPageNumber 不同)。 |
wdActiveEndPageNumber | 3 | 返回包含指定的选定内容或范围,从文档的开头开始计数的活动端的页面数。 与 wdActiveEndAdjustedPageNumber)不同, 忽略对页码的任何手动调整。 |
wdActiveEndSectionNumber | 2 | 返回节号,在该节中包含了指定的所选内容或区域的活动结尾。 |
wdAtEndOfRowMarker | 31 | 如果指定的所选内容或区域位于表格的行结尾标记处,则该参数返回 True 。 |
wdCapsLock | 21 | 如果 Caps Lock 有效,则该参数返回 True 。 |
wdEndOfRangeColumnNumber | 17 | 返回表格列号,在该表格列中包含指定的所选内容或区域的结尾。 |
wdEndOfRangeRowNumber | 14 | 返回表格行号,在该表格行中包含指定的所选内容或区域的结尾。 |
wdFirstCharacterColumnNumber | 9 | 返回指定的所选内容或区域中第一个字符的位置。 如果所选内容或区域是折叠的,则返回紧靠所选内容或区域右侧的字符编号(该编号与状态栏中"列"后面的字符列数相同)。 |
wdFirstCharacterLineNumber | 10 | 返回指定的所选内容或区域中第一个字符在当前页面处于第几行。 如果所选内容或区域是折叠的,则返回紧靠所选内容或区域右侧的字符编号(该编号与状态栏中"行"后面的字符行数相同)。 |
wdFrameIsSelected | 11 | 如果所选内容或区域是一个完整的图文框或文本框,则该参数返回 True 。 |
wdHeaderFooterType | 33 | 返回一个值,该值指示包含了指定所选内容或区域的页眉或页脚的类型。 有关其他信息,请参阅"注解"部分中的表。 |
wdHorizontalPositionRelativeToPage | 5 | 返回指定选定内容或区域的水平位置;这是从所选内容或范围的左边缘到页面左边缘的距离,以磅 (1 磅 = 20 twips,72 磅 = 1 英寸) 。 如果所选内容或范围不在屏幕区域内,则返回 -1。 |
wdHorizontalPositionRelativeToTextBoundary | 7 | 返回指定所选内容或区域相对于周围最近的正文边界左边缘的水平位置,以磅为单位(1 磅 = 20 缇,72 磅 = 1 英寸)。 如果所选内容或范围不在屏幕区域内,则返回 -1。 |
wdInBibliography | 42 | 如果指定的选定内容或区域位于书目,则返回 True 。 |
wdInCitation | 43 | 如果指定的选定内容或区域位于引文,则返回 True 。 |
wdInClipboard | 38 | 有关该常量的信息,请参阅包含在 Microsoft Office Macintosh Edition 中的语言参考帮助。 |
wdInCommentPane | 26 | 如果指定的所选内容或区域位于批注窗格,则该参数返回 True 。 |
wdInContentControl | 46 | 如果指定的选定内容或区域中的内容控件,则返回 True 。 |
wdInCoverPage | 41 | 如果指定的选定内容或区域位于封面,则返回 True 。 |
wdInEndnote | 36 | 如果指定的选定内容或区域位于或尾注窗格中页面视图的尾注区内在普通视图中,则返回 True 。 |
wdInFieldCode | 44 | 如果指定的选定内容或区域位于域代码,则返回 True 。 |
wdInFieldResult | 45 | 如果指定的选定内容或区域位于域结果,则返回 True 。 |
wdInFootnote | 35 | 如果指定的选定内容或区域位于或脚注窗格中页面视图的脚注区内在普通视图中,则返回 True 。 |
wdInFootnoteEndnotePane | 25 | 如果指定的选定内容或区域位于脚注或尾注窗格在普通视图和页面视图的脚注或尾注区内,则返回 True 。 有关详细信息,请参阅 wdInFootnote 和 wdInEndnote 在前面的段落中所描述。 |
wdInHeaderFooter | 28 | 如果所选内容或区域的页眉或页脚窗格中或在页眉或页脚中打印版式视图中,则返回 True 。 |
wdInMasterDocument | 34 | 如果所选内容或区域位于主控文档 (即包含至少一个子文档的文档),则返回 True 。 |
wdInWordMail | 37 | 如果所选内容或区域的页眉或页脚窗格中或在页眉或页脚中打印版式视图中,则返回 True 。 |
wdMaximumNumberOfColumns | 18 | 返回所选内容或区域中任何行的最大表格列数。 |
wdMaximumNumberOfRows | 15 | 返回指定的所选内容或区域中表格的最大行数。 |
wdNumberOfPagesInDocument | 4 | 返回与所选内容或区域相关联的文档的页数。 |
wdNumLock | 22 | 如果 Num Lock 有效,则该参数返回 True 。 |
wdOverType | 23 | 如果启用改写模式,则该参数返回 True 。 可使用 Overtype 属性改变改写模式的状态。 |
wdReferenceOfType | 32 | 返回一个值,该值表明所选内容相对于脚注、尾注或批注引用的位置,如"注解"部分中的表所示。 |
wdRevisionMarking | 24 | 如果打开修订功能,则该参数返回 True 。 |
wdSelectionMode | 20 | 返回一个值,该值表明当前的选定模式,如下表所示。 |
wdStartOfRangeColumnNumber | 16 | 返回表格列号,在该表格列中包含所选内容或区域的起点。 |
wdStartOfRangeRowNumber | 13 | 返回表格行号,在该表格行中包含所选内容或区域的起点。 |
wdVerticalPositionRelativeToPage | 6 | 返回所选内容或区域的垂直位置,即所选内容的上边缘与页面的上边缘之间的距离,以磅为单位(1 磅 = 20 缇,72 磅 = 1 英寸)。 如果所选内容在文档窗口中不可见,则返回 -1。 |
wdVerticalPositionRelativeToTextBoundary | 8 | 返回所选内容或区域相对于周围最近的正文边界的上边缘的垂直位置,以磅为单位(1 磅 = 20 缇,72 磅 = 1 英寸)。 该参数可用于在图文框或表格中确定插入点位置。 如果所选内容不可见,则返回 -1。 |
wdWithInTable | 12 | 如果所选内容位于表格中,则该参数返回 True 。 |
wdZoomPercentage | 19 | 按 百分比 属性返回当前设置的缩放百分比。 |
以下代码演示了获取光标所在节的起始页码和终止页码:
Sub 获取光标所在节的起始页码和终止页码()
With Selection
'在立即窗口打印节标题,默认为节的第一个段落
Debug.Print Replace(.Sections(1).Range.Paragraphs(1).Range.Text, Chr(13), "")
'光标移动到节开头位置
.StartOf wdSection
'打印出光标所在页码信息
Debug.Print "开始页码——" & .Information(wdActiveEndPageNumber)
'光标移动到节结束位置
.EndOf wdSection
'打印出光标所在页码信息
Debug.Print "结束页码——" & .Information(wdActiveEndPageNumber)
End With
End Sub
'上面的宏执行完成后光标位置发生了移动,如需要恢复到原始位置,可参考本文第一段演示代码
'下面的宏则可以在不移动光标的前提下获取光标所在节的起始页码和终止页码
Sub 不移动光标获取光标所在节的起始页码和终止页码()
With Selection.Sections(1).Range
Debug.Print "当前光标处于第" & .Information(wdActiveEndSectionNumber) & "节:" & _
"开始页码——" & .Characters(1).Information(wdActiveEndPageNumber) & _
";结束页码——" & .Characters.Last.Information(wdActiveEndPageNumber)
End With
End Sub