Word | VBA - Range.Goto - 如何让它正常工作?

时间:2018-05-03 08:37:12

标签: vba range word-vba

我的测试场景: 我在大纲视图中。 我已经将书签中的范围加载到变量中。 我想实际做到以下几点:

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做同样的事情确实会移动......)
我错过了什么?
修改
我在上面的代码片段中添加了更多详细信息;这应该是为任何人运行测试,但是对于我来说,对于任何随机范围的问题都是GENERAL(当在Outline视图上时,AllLevelsVisible或Collapsed):“StartRange.GoTo What:=wdGoHeading, Which:=wdGoToPrevious, Count:=1
我现在实际上已经解决了我原来的问题,使用选择而不是范围,但是稍后会知道range.goto有什么问题。 我的另一个解决方法是:Word | VBA - How to start Word in Outline view - opened exactly where you left off?

1 个答案:

答案 0 :(得分: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

编辑:基于评论中的问题的其他信息。

某些范围方法(例如MoveStartExpand)可用于主动修改范围参数。 GoTo方法是一个返回Range对象的函数,而不是修改引用对象的活动。但是,MSDN文档对后一部分并不清楚,并暗示使用GoTo方法会移动范围。 GoTo会移动插入点,但这与移动Range不同。

Soapbox:我对新的MSDN内容不满意 - 它现在很乏味,只提供基本描述。旧的深入信息(包括限制,边缘情况和潜在的错误因素)正在被删除 - 可能被某些人视为改进