Word VBA中的光标操作

一、 光标对象及其位置属性

Word VBA中,光标对象的名称为Selection。一个Selection实际上由两个位置指示器组成,其中一个指示器称为Start,一个指示器称为End,分别代表光标的起始位置和结束位置。当StartEnd相等时,光标显示为一条竖线,不相等时光标显示为一个选择区域。

二、 光标的移动

光标的移动主要有两大类方法,一种为Move系方法,一种为GoTo系方法。
1Move系方法
包括MoveMoveDownMoveEndMoveEndUntilMoveEndWhileMoveLeftMoveRightMoveStartMoveStartUntilMoveStartWhileMoveUntilMoveUpMoveWhileHomeKeyEndKeyStartOfEndOf等,这些方法的共同特点是返回一个整型值,表示实际移动的数量,参数中一般都包含一个unit(移动单位)和一个count(移动数量),其中unit参数可取值为WdUnits枚举类型。部分方法还有一个Extend参数,默认值为wdMove,表示Start位置指示器和End位置指示器捆绑在一起移动,形成光标移动效果;当它取值为wdExtend时,向后移动只有Start位置指示器移动,向前移动只有End位置指示器移动,形成选择一个区域的效果。此外,StartOfEndOfHomeKeyEndKey比较,前面两个方法的unit参数可用的类型更多,例如wdSection就只能用于做前者的参数而不能用于做后者的参数(office2010,其它版本是否如此未测试)。
2Goto系方法
包括GoToGoToNextGoToPrevious等。
这组方法与Move方法最大的差别是它的返回值为代表当前选择区域的Range。要知道这组方法执行后实际移动了多少数量的字符,只能通过记录执行前后的光标位置来计算。它的参数有四个。what参数取值为WdGoToItem常量之一;which参数为WdGoToDirection 常量之一;count参数为项的数目,与Move系方法不同的是,count不能为负数;最后一个参数为name,如果what参数值为wdGoToBookmarkwdGoToCommentwdGoToFieldwdGoToObject,那么这个参数可以指定一个名称。由于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%
    
    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 "已到达文档中最后一个标题!"
               End If
               Exit Do
            End If
        Loop
    End With
    
End Sub

三、输入内容

主要包括以下Insert系列方法:InsertAfterInsertBeforeInsertBreakInsertCaptionInsertCellsInsertColumnsInsertColumnsRightInsertCrossReferenceInsertDateTimeInsertFileInsertFormulaInsertNewPageInsertParagraphInsertParagraphAfterInsertParagraphBeforeInsertRowsInsertRowsAboveInsertRowsBelowInsertStyleSeparatorInsertSymbolInsertXML
还有一个直接输入字符串的方法TypeText,输入的字符串由参数Text指定。

四、由Selection获取其他对象

1、获取Range对象:直接使用Selection对象的Range属性。
2、获取BookMarkFieldParagraphCharacterSectionCellRowWordTable等对象:
这些对象在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

八、Information方法

VBA中,Range对象及其子类对象(如SelectionCharacterWord等)都有Information方法,该方法有一个Type参数,这个参数的取值为wdInformation枚举类型,该枚举类型指定我们需要获取的信息,可用枚举值及其含义如下:

名称Description
wdActiveEndAdjustedPageNumber1返回包含指定的所选内容或区域的活动结尾的页面数。 如果设置一个起始页码或进行其他手动调整,则返回经调整的页码(与 wdActiveEndPageNumber 不同)。
wdActiveEndPageNumber3返回包含指定的选定内容或范围,从文档的开头开始计数的活动端的页面数。 与 wdActiveEndAdjustedPageNumber)不同, 忽略对页码的任何手动调整。
wdActiveEndSectionNumber2返回节号,在该节中包含了指定的所选内容或区域的活动结尾。
wdAtEndOfRowMarker31如果指定的所选内容或区域位于表格的行结尾标记处,则该参数返回 True 。
wdCapsLock21如果 Caps Lock 有效,则该参数返回 True 。
wdEndOfRangeColumnNumber17返回表格列号,在该表格列中包含指定的所选内容或区域的结尾。
wdEndOfRangeRowNumber14返回表格行号,在该表格行中包含指定的所选内容或区域的结尾。
wdFirstCharacterColumnNumber9返回指定的所选内容或区域中第一个字符的位置。 如果所选内容或区域是折叠的,则返回紧靠所选内容或区域右侧的字符编号(该编号与状态栏中"列"后面的字符列数相同)。
wdFirstCharacterLineNumber10返回指定的所选内容或区域中第一个字符在当前页面处于第几行。 如果所选内容或区域是折叠的,则返回紧靠所选内容或区域右侧的字符编号(该编号与状态栏中"行"后面的字符行数相同)。
wdFrameIsSelected11如果所选内容或区域是一个完整的图文框或文本框,则该参数返回 True 。
wdHeaderFooterType33返回一个值,该值指示包含了指定所选内容或区域的页眉或页脚的类型。 有关其他信息,请参阅"注解"部分中的表。
wdHorizontalPositionRelativeToPage5返回指定选定内容或区域的水平位置;这是从所选内容或范围的左边缘到页面左边缘的距离,以磅 (1 磅 = 20 twips,72 磅 = 1 英寸) 。 如果所选内容或范围不在屏幕区域内,则返回 -1。
wdHorizontalPositionRelativeToTextBoundary7返回指定所选内容或区域相对于周围最近的正文边界左边缘的水平位置,以磅为单位(1 磅 = 20 缇,72 磅 = 1 英寸)。 如果所选内容或范围不在屏幕区域内,则返回 -1。
wdInBibliography42如果指定的选定内容或区域位于书目,则返回 True 。
wdInCitation43如果指定的选定内容或区域位于引文,则返回 True 。
wdInClipboard38有关该常量的信息,请参阅包含在 Microsoft Office Macintosh Edition 中的语言参考帮助。
wdInCommentPane26如果指定的所选内容或区域位于批注窗格,则该参数返回 True 。
wdInContentControl46如果指定的选定内容或区域中的内容控件,则返回 True 。
wdInCoverPage41如果指定的选定内容或区域位于封面,则返回 True 。
wdInEndnote36如果指定的选定内容或区域位于或尾注窗格中页面视图的尾注区内在普通视图中,则返回 True 。
wdInFieldCode44如果指定的选定内容或区域位于域代码,则返回 True 。
wdInFieldResult45如果指定的选定内容或区域位于域结果,则返回 True 。
wdInFootnote35如果指定的选定内容或区域位于或脚注窗格中页面视图的脚注区内在普通视图中,则返回 True 。
wdInFootnoteEndnotePane25如果指定的选定内容或区域位于脚注或尾注窗格在普通视图和页面视图的脚注或尾注区内,则返回 True 。 有关详细信息,请参阅 wdInFootnote 和 wdInEndnote 在前面的段落中所描述。
wdInHeaderFooter28如果所选内容或区域的页眉或页脚窗格中或在页眉或页脚中打印版式视图中,则返回 True 。
wdInMasterDocument34如果所选内容或区域位于主控文档 (即包含至少一个子文档的文档),则返回 True 。
wdInWordMail37如果所选内容或区域的页眉或页脚窗格中或在页眉或页脚中打印版式视图中,则返回 True 。
wdMaximumNumberOfColumns18返回所选内容或区域中任何行的最大表格列数。
wdMaximumNumberOfRows15返回指定的所选内容或区域中表格的最大行数。
wdNumberOfPagesInDocument4返回与所选内容或区域相关联的文档的页数。
wdNumLock22如果 Num Lock 有效,则该参数返回 True 。
wdOverType23如果启用改写模式,则该参数返回 True 。 可使用 Overtype 属性改变改写模式的状态。
wdReferenceOfType32返回一个值,该值表明所选内容相对于脚注、尾注或批注引用的位置,如"注解"部分中的表所示。
wdRevisionMarking24如果打开修订功能,则该参数返回 True 。
wdSelectionMode20返回一个值,该值表明当前的选定模式,如下表所示。
wdStartOfRangeColumnNumber16返回表格列号,在该表格列中包含所选内容或区域的起点。
wdStartOfRangeRowNumber13返回表格行号,在该表格行中包含所选内容或区域的起点。
wdVerticalPositionRelativeToPage6返回所选内容或区域的垂直位置,即所选内容的上边缘与页面的上边缘之间的距离,以磅为单位(1 磅 = 20 缇,72 磅 = 1 英寸)。 如果所选内容在文档窗口中不可见,则返回 -1。
wdVerticalPositionRelativeToTextBoundary8返回所选内容或区域相对于周围最近的正文边界的上边缘的垂直位置,以磅为单位(1 磅 = 20 缇,72 磅 = 1 英寸)。 该参数可用于在图文框或表格中确定插入点位置。 如果所选内容不可见,则返回 -1。
wdWithInTable12如果所选内容位于表格中,则该参数返回 True 。
wdZoomPercentage19按 百分比 属性返回当前设置的缩放百分比。

以下代码演示了获取光标所在节的起始页码和终止页码:

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

九、判断文档中是否存在选择区域

要判断文档中是否存在被选择的字符,除了比较Selection.Start Selection.End是否相等外,还可以测试逻辑表达式Selection.Type= wdSelectionIP or Selection.Type=wdNoSelection,表达式为真时文档中没有选择字符(即此时按下Ctrl+C,剪贴板为空白),否则文档中选择了字符。

  • 4
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yivifu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值