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,那么这个参数可以指定一个名称。
下面的代码演示先记录光标位置,在进行一些操作后恢复光标位置:

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系列方法: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
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

你可能感兴趣的:(VBA,办公软件,word)