Word | VBA - Range.Goto - Как заставить его работать правильно? - PullRequest
0 голосов
/ 03 мая 2018

Мой тестовый сценарий: Я на контуре. Я загрузил диапазон из закладки в переменную. На самом деле я хочу сделать следующее:

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, перемещается ...)
Что я пропускаю?
Edit:
Я добавил больше деталей в мой фрагмент кода выше; это должно быть достаточно для запуска теста для кого-либо, однако проблема для меня ОБЩАЯ для любых случайных диапазонов в сценариях использования (при нахождении в представлении Outline, либо AllLevelsVisible, либо Collapsed): "StartRange.GoTo What:=wdGoHeading, Which:=wdGoToPrevious, Count:=1"
Я на самом деле решил свою исходную проблему сейчас, используя выделение вместо диапазона, но было бы здорово узнать позже, в чем проблема с range.goto
Мой другой поток с обходным путем: Word | VBA - Как запустить Word в режиме Outline - открывается именно там, где вы остановились?

1 Ответ

0 голосов
/ 03 мая 2018

В вашем коде вы используете 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 - теперь он мягкий и предоставляет только основные описания. Более старую подробную информацию (включая ограничения, крайние случаи и потенциальные факторы ошибок) редактируют - возможно, некоторые ее считают улучшением .

...