Word|VBA - Range.Goto - 如何使其正常工作?

问题描述 投票:0回答:2

我的测试场景: 我处于大纲视图中。 我已将书签的范围加载到变量中。 我实际上想做以下事情:

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

我现在实际上已经解决了我原来的问题,使用选择而不是范围,但稍后知道 range.goto 有什么问题仍然会很高兴
我的另一个线程与解决方法:Word | VBA - 如何在大纲视图中启动 Word - 在您离开的位置准确打开?

vba range ms-word
2个回答
2
投票

在代码中使用

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 内容并不满意 - 它现在平淡无奇,仅提供基本描述。旧的深入信息(包括限制、边缘情况和潜在错误因素)正在被删除 - 可能被某些人视为“改进”。


0
投票

© www.soinside.com 2019 - 2024. All rights reserved.