Всегда сложно, когда вы работаете с Selection
в коде VBA - это не всегда точно подражает тому, что происходит, когда пользователь выполняет действия.Это особенно проблема с верхними и нижними колонтитулами, когда используется SeekView
.
Следующее работает с Range
объектами (думайте о Range как о невидимом выделении, но вы можете иметь много диапазонов в своем коде VBA- может быть только один выбор).
Он начинается с присвоения текущего выбора объекту Range, затем продолжается вставка разрыва раздела и сравнение ориентации страницы, как у вас.
Если необходимо изменить ориентацию страницы, нижний колонтитул нового раздела назначается объекту Footer
.Затем нижний колонтитул Range.ParagraphFormat
присваивается ParagraphFormat
объекту *.Обратите внимание, как они затем используются для изменения настроек, которые вы используете в своем коде.Большая разница в том, что код не помещает никакой выбор в нижний колонтитул: все делается напрямую.Это не только быстрее и точнее, но и уменьшает «мерцание» экрана.
В конце выбирается исходный диапазон (который с тех пор вышел за пределы исходного выделения), так как я предполагаю, что вы хотите продолжитьс вводом текста в этой точке.Если нет, то вы можете удалить эту строку.
Sub ChangePageOrientationAndTabs()
Dim ftr As word.HeaderFooter
Dim pf As word.ParagraphFormat
Dim rngSel As word.Range
Set rngSel = Selection.Range
rngSel.InsertBreak Type:=wdSectionBreakNextPage
If rngSel.PageSetup.Orientation = wdOrientPortrait Then
MsgBox "OK"
Else
rngSel.PageSetup.Orientation = wdOrientPortrait
Set ftr = ActiveDocument.Sections(rngSel.Sections(1).index).Footers(wdHeaderFooterPrimary)
ftr.LinkToPrevious = False
Set pf = ftr.Range.ParagraphFormat
pf.TabStops.ClearAll
pf.TabStops(CentimetersToPoints(18)).Position = _
CentimetersToPoints(18.5)
pf.TabStops.Add Position:=CentimetersToPoints(9.5), _
Alignment:=wdAlignTabCenter, Leader:=wdTabLeaderSpaces
End If
rngSel.Paragraphs(1).Range.style = ActiveDocument.styles("Annexe1")
rngSel.Select
End Sub
* Для меня загадка, почему назначение Footer.Range для объекта Range
работает в нижнем колонтитуле предыдущего раздела, в то время как нижний колонтитул и ParagraphFormat верны...