Как вставить логику поля нумерации страниц в нижний колонтитул в шаблоне Word с помощью VBA? - PullRequest
0 голосов
/ 05 апреля 2019

У меня есть шаблон слова, который использует различные поля нижнего колонтитула в зависимости от раздела. Иногда пользователи этого шаблона портят нижние колонтитулы, и поэтому я пишу макрос для исправления нижних колонтитулов, возвращая поля нижнего колонтитула по умолчанию.
В полях нижнего колонтитула есть некоторая логика полей, основанная на разделе, и в основном мне нужно сделать следующее:

  1. Перезагрузите номер страницы из раздела 5

  2. Вставить текст в таблицу в нижнем колонтитуле в строке 1, столбце 2 на основе разделов, как указано ниже

Разделы с 1 по 4: {PAGE} // Обратите внимание, что это в формате римских цифр, для нижнего колонтитула установлена ​​опция «Другая первая страница»

Разделы 5 и далее {if {page} <{= {pageref ReferencesEnd} + 1} "Страница {= {page}} из {= {pageref ReferencesEnd}" "{Styleref" Заголовок Att-приложения "\ n}" </p>

Мне удалось выполнить первый шаг и вставить поле для разделов с 1 по 4, однако я борюсь с тем, как программно вставить логику сложного поля для Раздела 5+ в соответствующие нижние колонтитулы в моем шаблоне, используя VBA? Код, который мне нужен, комментируется в блоке кода ниже как: ТРЕБУЕТСЯ КОД ЗДЕСЬ, ЧТОБЫ ВСТАВИТЬ СЛЕДУЮЩУЮ ПОЛЕВУЮ ЛОГИКУ В ФУТБОЛ

Sub FixPageNumbering()

    Dim intSect As Integer

   On Error Resume Next

    'Insert footer code for Sections 1-4 into row1,col1 of 2x2 table
    For intSect = 1 To 4

        With ActiveDocument.Sections(intSect).Footers(wdHeaderFooterPrimary)
            .PageNumbers.NumberStyle = wdPageNumberStyleLowercaseRoman
            .Range.Tables(1).Rows(1).Cells(2).Select
            Selection.TypeText Text:="Page "
            Selection.Fields.Add Range:=Selection.Range, Type:=wdFieldEmpty, Text:= _
            "PAGE ", PreserveFormatting:=True
        End With
    Next intSect

    'Set page numbering to restart at #1 from Section 5
    With ActiveDocument.Sections(5).Footers(wdHeaderFooterPrimary).PageNumbers
     .RestartNumberingAtSection = True
     .StartingNumber = 1
    End With

    'Insert footer code for Sections 5 and onwards into row1,col1 of 2x2 table
    For intSect = 5 To ActiveDocument.Sections.Count
        With ActiveDocument.Sections(intSect).Footers(wdHeaderFooterPrimary)
            .PageNumbers.NumberStyle = wdPageNumberStyleArabic
            .Range.Tables(1).Rows(1).Cells(2).Select

            'NEED CODE HERE TO INSERT THE FOLLOWING FIELD LOGIC INTO FOOTER
            '{ if { page } < { = { pageref ReferencesEnd } + 1 } "Page { = { page } } of { = { pageref ReferencesEnd }" "{Styleref "Att-Appendix Heading" \n }"

          End With

    Next intSect

    ActiveWindow.View.Type = wdPrintView


End Sub

Для разделов 5 и далее в поле нижнего колонтитула должна отображаться страница # из &, или когда есть приложение (для страниц, существующих после закладки ReferencesEnd), оно будет отображать «приложение №»

Ответы [ 2 ]

0 голосов
/ 08 апреля 2019

Как указывалось ранее, можно создавать сложные структуры полей с помощью VBA.Для этого подхода вы можете использовать такой код:

Sub Demo()
Application.ScreenUpdating = False
Dim DocTgt As Document, StrCode As String
Dim i As Long, Rng As Range, HdFt As HeaderFooter
With ActiveDocument
  For i = 1 To .Sections.Count
    Select Case i
      Case 1 To 4
        With .Sections(i)
          For Each HdFt In .Footers
            With HdFt
              If .Exists Then
                With .PageNumbers
                  .NumberStyle = wdPageNumberStyleLowercaseRoman
                  .RestartNumberingAtSection = False
                End With
                If .LinkToPrevious = False Or i = 1 Then
                  .Range.Fields.Add .Range, wdFieldEmpty, "PAGE", False
                End If
              End If
            End With
          Next
        End With
      Case Else:
        With .Sections(i)
          For Each HdFt In .Footers
            With HdFt
              If .Exists Then
                If i = 5 Then
                  .LinkToPrevious = False
                  With .PageNumbers
                    .NumberStyle = wdPageNumberStyleArabic
                    .RestartNumberingAtSection = True
                    .StartingNumber = 1
                  End With
                Else
                  With .PageNumbers
                    .NumberStyle = wdPageNumberStyleArabic
                    .RestartNumberingAtSection = False
                  End With
                End If
                If .LinkToPrevious = False Then
                  With .Range
                    .Fields.Add .Duplicate, wdFieldEmpty, "IF<  ""Page  of """, False
                    Set Rng = .Duplicate
                    With Rng
                      .Start = .Start + 19
                      .Collapse wdCollapseStart
                      .Fields.Add .Duplicate, wdFieldEmpty, "STYLEREF ""Att-Appendix Heading"" \n", False
                    End With
                    Set Rng = .Duplicate
                    With Rng
                      .Start = .Start + 17
                      .Collapse wdCollapseStart
                      .Fields.Add .Duplicate, wdFieldEmpty, "PAGEREF ReferencesEnd", False
                    End With
                    Set Rng = .Duplicate
                    With Rng
                      .Start = .Start + 13
                      .Collapse wdCollapseStart
                      .Fields.Add .Duplicate, wdFieldEmpty, "PAGE", False
                    End With
                    Set Rng = .Duplicate
                    With Rng
                      .Start = .Start + 6
                      .Collapse wdCollapseStart
                      .Fields.Add .Duplicate, wdFieldEmpty, "=+1", False
                      .Start = .Start + 3
                      .Collapse wdCollapseStart
                      .Fields.Add .Duplicate, wdFieldEmpty, "PAGEREF ReferencesEnd", False
                    End With
                    .Start = .Start + 4
                    .Collapse wdCollapseStart
                    .Fields.Add .Duplicate, wdFieldEmpty, "PAGE", False
                  End With
                End If
              End If
            End With
          Next
        End With
    End Select
  Next
End With
End Sub
0 голосов
/ 05 апреля 2019

Хотя можно создавать сложные структуры полей с помощью VBA, лучше хранить требуемые коды полей в двух отдельных абзацах в исходном документе, откуда ваш макрос может скопировать и вставить их в соответствующие места в целевом объекте. документы. При таком подходе вы можете использовать код вроде:

Sub Demo()
Application.ScreenUpdating = False
Dim DocSrc As Document, DocTgt As Document
Dim i As Long, Rng As Range, HdFt As HeaderFooter
Set DocSrc = ThisDocument
With Application.FileDialog(FileDialogType:=msoFileDialogFilePicker)
  .Title = "Select the target file"
  .AllowMultiSelect = False
  If .Show = -1 Then
    Set DocTgt = Documents.Open(.SelectedItems(1))
  Else
    MsgBox "No target file selected. Exiting", vbExclamation
    GoTo ErrExit
  End If
End With
With DocTgt
  For i = 1 To .Sections.Count
    Select Case i
      Case 1 To 4: Set Rng = DocSrc.Paragraphs(1).Range
      Case Else: Set Rng = DocSrc.Paragraphs(2).Range
    End Select
    With .Sections(i)
      For Each HdFt In .Footers
        With HdFt
          If .Exists Then
            If .LinkToPrevious = False Then
              .Range.FormattedText = Rng.FormattedText
              .Range.Characters.Last.Delete
            End If
          End If
        End With
      Next
    End With
  Next
End With
ErrExit:
Set Rng = Nothing: Set DocSrc = Nothing: Set DocTgt = Nothing
Application.ScreenUpdating = True
End Sub

При необходимости, хотя это кажется маловероятным, вы можете дополнить приведенный выше код кодом для применения желаемого формата нумерации или добавить соответствующие переключатели к самим кодам полей.

PS: Ваш второй код поля может быть уменьшен до -

{IF{PAGE}< {={PAGEREF ReferencesEnd}+1} "Page {PAGE} of {PAGEREF ReferencesEnd}" {STYLEREF "Att-Appendix Heading" \n}}
...