在 Word VBA 中,Collapse 方法主要用于 Selection 和 Range 对象,用于折叠选定的区域,即将选定区域的起点和终点移动到同一个位置(光标位置)。这在文档编辑、光标控制和自动化操作中非常有用。
1. 具有 Collapse 方法的对象
- Selection 对象:表示用户当前选定的文本或插入点。
- Range 对象:表示文档中的一个连续区域。
2. Collapse 方法的参数
vbnet
object.Collapse(Direction)
- object :必需,可以是 Selection 或 Range 对象。
- Direction :可选,指定折叠后光标的位置。
- wdCollapseStart (默认值):将光标移动到选定区域的起点。
- wdCollapseEnd :将光标移动到选定区域的终点。
3. Collapse 方法的作用
对光标位置的影响
-
折叠到起点:
vbnetSelection.Collapse Direction:=wdCollapseStart光标移动到选定区域的开头。
-
折叠到终点:
vbnetSelection.Collapse Direction:=wdCollapseEnd光标移动到选定区域的结尾。
示例
vbnet
Sub CollapseExample()
' 选中一段文本
Selection.HomeKey Unit:=wdStory ' 移动到文档开头
Selection.End = Selection.End + 3 ' 选择3个字符建立选区
' 折叠到起点
Selection.Collapse Direction:=wdCollapseStart
Debug.Print Selection.Start ' 0
Selection.TypeText " start " ' 执行后光标不再是选区
Selection.End = Selection.End + 3 ' 重新选择3个字符建立选区
' 折叠到终点
Selection.Collapse Direction:=wdCollapseEnd
Debug.Print Selection.Start ' 9
Selection.TypeText " end "
End Sub
如果文档中前几个字符是"Collapse",那么执行以上宏后结果如下图:

4. 对页面视图的影响
- Collapse 不会改变页面视图 ,只会改变光标的位置。
- 如果折叠后的光标位置不在当前可视区域,Word 会自动滚动页面,使光标可见。
5. 典型应用场景
场景 1:在选定文本后插入内容
vbnet
Sub InsertAfterSelection()
Selection.Collapse Direction:=wdCollapseEnd ' 移动到选定区域的结尾
Selection.TypeText "(新插入的内容)" ' 在光标处插入文本
End Sub
场景 2:在选定文本前插入内容
vbnet
Sub InsertBeforeSelection()
Selection.Collapse Direction:=wdCollapseStart ' 移动到选定区域的开头
Selection.TypeText "【前缀】" ' 在光标处插入文本
End Sub
场景 3:模拟用户操作
vbnet
Sub SimulateUserTyping()
Selection.TypeText "Hello, World!" ' 输入文本
Selection.Collapse Direction:=wdCollapseEnd ' 移动到文本结尾
Selection.TypeParagraph ' 插入新段落
End Sub
6. Collapse 与 Range 对象
Range 对象 也支持 Collapse 方法,但不会改变用户界面的光标位置,只会改变 Range 的起点和终点。
vbnet
Sub RangeCollapseExample()
Dim rng As Range
Selection.HomeKey Unit:=wdStory ' 移动到文档开头
Set rng = ActiveDocument.Range(Start:=0, End:=10) ' 定义一个 Range
rng.Collapse Direction:=wdCollapseEnd ' 折叠到 Range 的结尾
Debug.Print "rng1.Start = " & rng.Start ' rng1.Start = 10
Set rng = ActiveDocument.Range(Start:=0, End:=10) ' 重新定义一个 Range
rng.Collapse ' 折叠到 Range 的开头,使用默认参数wdCollapseStart
Debug.Print "rng2.Start = " & rng.Start ' rng2.Start = 0
End Sub
7. 注意事项
- Collapse 不会删除文本,只会移动光标或 Range 的起点/终点。
- 如果没有选定文本 ,
Collapse方法不会产生任何效果(因为插入点已经是"折叠"的)。 - 在使用
Selection时 ,Collapse会影响用户看到的光标位置;在使用Range时,不会影响用户界面。
8. 总结表格
| 对象 | 方法 | 参数 | 作用 |
|---|---|---|---|
| Selection | Collapse |
wdCollapseStart |
光标移动到选定区域的起点 |
| Selection | Collapse |
wdCollapseEnd |
光标移动到选定区域的终点 |
| Range | Collapse |
wdCollapseStart |
Range 的起点和终点移动到起点 |
| Range | Collapse |
wdCollapseEnd |
Range 的起点和终点移动到终点 |
9. 常见问题
-
Q:为什么
Collapse后无法插入文本?
A:确保在Collapse后使用TypeText或InsertAfter/InsertBefore方法插入文本。 -
Q:如何判断当前是否有选定区域?
A:使用Selection.Type属性:vbnetIf Selection.Type = wdSelectionIP Then MsgBox "没有选定文本,光标处于插入点状态。" End If
10. 进阶技巧
-
结合
Move和Collapse实现精确定位 :vbnetSelection.MoveRight Unit:=wdWord, Count:=2 ' 移动 2 个单词 Selection.Collapse Direction:=wdCollapseEnd ' 折叠到结尾 -
获取表格单元格内容实际显示行数
表格单元格中的文本默认会随着单元格宽度变化自动换行,如果需要取得单元格文本实际显示的行数,最简单的办法就是应用collapse方法,示例如下:
vbnet
Sub GetLines()
Dim lines, lineStart, lineEnd As Integer
With Selection.Range
If .Information(wdWithInTable) Then
With Selection.Tables(1).cell(1, 1).Range
.MoveEnd wdCharacter, -1
lineStart = .Information(wdFirstCharacterLineNumber)
.Collapse wdCollapseEnd '如果使用wdCollapseEnd折叠引用整个段落的区域, 则该范围位于结束段落标记之后 (下一段的开头)
lineEnd = .Information(wdFirstCharacterLineNumber)
End With
lines = lineEnd - lineStart + 1
End If
End With
Debug.Print "lines = " & lines
End Sub
可以创建如下表格改变第一列的宽度然后执行上面的宏,可以看到总会输出正确的行数。
总结 :
Collapse 方法在 Word VBA 中主要用于精确控制光标或 Range 的位置 ,是实现文档自动化编辑的重要工具。如果你需要更复杂的操作(如批量替换、格式化),可以结合 Find、Move 和 Collapse 方法使用。
