Мне нужно добавить номера страниц внизу моего слова документа в формате X of Y - PullRequest
0 голосов
/ 31 мая 2019

Я получаю сообщение об ошибке при попытке добавить номера страниц X из Y в нижнем правом углу текстового документа. X - номер текущей страницы, а Y - общее количество страниц в документе

Я попытался записать макрос, чтобы сделать это, а затем с помощью этого кода

Sub InsertPageLabelsXofY()

    If ActiveWindow.View.SplitSpecial <> wdPaneNone Then
        ActiveWindow.Panes(2).Close
    End If
    If ActiveWindow.ActivePane.View.Type = wdNormalView Or ActiveWindow. _
        ActivePane.View.Type = wdOutlineView Then
        ActiveWindow.ActivePane.View.Type = wdPrintView
    End If
    ActiveWindow.ActivePane.View.SeekView = wdSeekCurrentPageFooter

    Application.Templates( _
        "C:\Users\jhandler\AppData\Roaming\Microsoft\Document Building Blocks\1033\16\Built-In Building Blocks.dotx" _
        ).BuildingBlockEntries("Bold Numbers 3").Insert Where:=Selection.Range, _
        RichText:=True

    ActiveWindow.ActivePane.View.SeekView = wdSeekMainDocument

End Sub

Сначала это работает, но через день или около того перестает работать и выдает ошибку.

Ошибка, которую я получаю при попытке запустить код:

Ошибка времени выполнения '5941': запрошенный элемент коллекции не существует

Часть кода, которая генерирует ошибку, начинается с Application.Templates. Хотя это единственная строка текста в этой строке, строка кода на самом деле состоит из 4 строк, включая 3 под ней.

Кроме того, я бы хотел, чтобы другие люди, кроме меня, могли использовать макрос. Есть ли способ сохранить шаблон в публичном месте?

Ответы [ 2 ]

0 голосов
/ 03 июня 2019

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

Application.Templates.LoadBuildingBlocks

Однако, если вы воспользуетесь советом, предложенным @CindyMeister (и вы должны это сделать), вам не потребуетсясделайте это, так как шаблон, содержащий ваш код, будет уже загружен.Затем вы можете переписать свою процедуру следующим образом, избегая необходимости открывать и закрывать нижний колонтитул:

Sub InsertPageLabelsXofY()
  Dim sectionNumber As Long
  sectionNumber = Selection.Information(wdActiveEndSectionNumber)
  Dim footer As Range
  Set footer = ActiveDocument.Sections(sectionNumber).Footers(wdHeaderFooterPrimary).Range
  Dim tmp As Template
  Set tmp = ActiveDocument.AttachedTemplate
  tmp.BuildingBlockEntries("Bold Numbers 3").Insert Where:=footer, RichText:=True
End Sub
0 голосов
/ 31 мая 2019

Чтобы сделать вашу обычную работу, измените строку "Application.Templates ..." на:

 Templates(1).BuildingBlockEntries("Bold Numbers 3").Insert Selection.Range, True

Шаблон стандартных блоков Word всегда доступен как глобальный шаблон, а встроенная версия всегда является первым шаблоном, поэтому индекс имеет индекс 1.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...