一、 光标对象及其位置属性
在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
,那么这个参数可以指定一个名称。由于WdGoToItem
常量没有提供类似wdGotoCharacter
的常数,无法通过这组方法指定移动多少字符。
下面的代码演示先记录光标位置,在进行一些操作后恢复光标位置:
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
用GoTo
系方法遍历文档时,如需判断当前所遍历到的对象是否是文档最后一个遍历对象,可以通过执行GoTo
系方法前后光标位置是否发生变化进行。如果文档中不存在遍历对象,第一次执行GoTo
系方法后光标的初始位置是0。以wdGoToHeading
作为参数遍历文档时的示例代码如下:
Sub test()
Dim pos As Long
With Selection
.HomeKey wdStory '光标回到文档开头,此时Selection.Start为0
Do
pos = .Start '先记录光标位置
.GoTo wdGoToHeading, wdGoToNext, 1 '向后移动到下一个标题,以标题为对象遍历文档
MsgBox "pos=" & pos & vbCrLf & ".Start=" & .Start
' 如果光标位置没有发生变化,则已遍历完文档中所有的标题
If .Start = pos Then
If .Start = 0 Then
MsgBox "文档中没有标题!"
Else
MsgBox "已到达文档中最后一个标题!"