VBA - Модификации нижнего колонтитула - PullRequest
0 голосов
/ 13 июня 2018

Я пытаюсь создать макрос, который создает новую страницу с другой ориентацией и с другой таблицей.

У меня есть этот код:

Selection.InsertBreak Type:=wdSectionBreakNextPage
If Selection.PageSetup.Orientation = wdOrientPortrait Then
  MsgBox "OK"
Else
  Selection.PageSetup.Orientation = wdOrientPortrait

  ActiveWindow.ActivePane.View.SeekView = wdSeekCurrentPageFooter
  Selection.HeaderFooter.LinkToPrevious = Not Selection.HeaderFooter. _
    LinkToPrevious

  Selection.ParagraphFormat.TabStops.ClearAll
  Selection.ParagraphFormat.TabStops(CentimetersToPoints(18)).Position = _
    CentimetersToPoints(18.5)
  Selection.ParagraphFormat.TabStops.Add Position:=CentimetersToPoints(9.5), _
      Alignment:=wdAlignTabCenter, Leader:=wdTabLeaderSpaces
  ActiveWindow.ActivePane.View.SeekView = wdSeekMainDocument
End If

Selection.Style = ActiveDocument.Styles("Annexe1")

К сожалению, это меняетТаблицы на странице непосредственно перед.

Есть ли способ, которым я могу решить это?Я попробовал функцию GoTo со страницей, разделом, ... но она не работает.

Спасибо!

1 Ответ

0 голосов
/ 13 июня 2018

Всегда сложно, когда вы работаете с 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 верны...

...