我的测试场景: 我处于大纲视图中。 我已将书签的范围加载到变量中。 我实际上想做以下事情:
dim StartRange as range, nowLevel as integer, startLevel as integer
set StartRange = Selection.range
nowLevel = StartRange.Paragraphs(1).OutlineLevel
Do
StartRange.GoTo What:=wdGoToHeading, Which:=wdGoToPrevious, Count:=1
nowLevel = StartRange.Paragraphs(1).OutlineLevel
If nowLevel < startlevel Then ActiveWindow.View.ExpandOutline
Loop Until nowLevel = 1
我已经手动调试了代码并使用 Startrange.select 来检查范围对象所在的位置。
结果发现它根本就没有动。
我已经分别进行了测试,我的印象是 Range.goto 根本不起作用,因为它永远不会将自己移动到任何地方。 (虽然用 Selection.goto 做同样的事情确实会移动......)
我错过了什么?
编辑:
我在上面的代码片段中添加了更多详细信息;这应该足以为任何人运行测试,但是对于我来说,对于用例中的任何随机范围来说,问题是普遍的(在大纲视图中,AllLevelsVisible 或 Collapsed 时):“
StartRange.GoTo What:=wdGoHeading, Which:=wdGoToPrevious, Count:=1
”
在代码中使用
StartRange.GoTo
,但下一行再次使用 StartRange
,它只采用原始值。
也许:
Set newRange = StartRange.GoTo(What:=wdGoHeading, Which:=wdGoToPrevious, Count:=1)
nowLevel = newRange.Paragraphs(1).OutlineLevel
根据您想要做什么,以下内容可能更适用:
Set StartRange = StartRange.GoTo(What:=wdGoHeading, Which:=wdGoToPrevious, Count:=1)
nowLevel = StartRange.Paragraphs(1).OutlineLevel
编辑:根据评论中的问题提供附加信息。
一些范围方法(例如
MoveStart
和Expand
)可以主动修改范围参数。 GoTo
方法是一个返回 Range
对象而不是修改引用对象的活动的函数。然而,MSDN 文档对后一部分并不清楚,并暗示使用 GoTo
方法会移动范围。 GoTo
确实会移动插入点,但这与移动 Range
不同。
Soapbox:我对新的 MSDN 内容并不满意 - 它现在平淡无奇,仅提供基本描述。旧的深入信息(包括限制、边缘情况和潜在错误因素)正在被删除 - 可能被某些人视为“改进”。