Обновление номеров страниц в VBA

У меня есть документ Word, в котором используется много разных полей. Я написал макрос, который обновляет все поля sequence, reference, page и numpages в документе.

Обновление текстовых полей возвращает их к тексту по умолчанию, поэтому я не хочу, чтобы они обновлялись.

Этот макрос отлично работал в Word 2007, но недавно я обновился до Word 2013, и он больше не работает должным образом.

При запуске этого макроса для всех полей страницы и numpages устанавливается значение 1. Тем не менее, когда я обновляю их вручную, они обновляются правильно.

Были ли изменения в способе обновления полей в Office 2013?

Код макроса ниже.

Sub UpdateAllFields()
UnprotectDocument

'UpdateAllFields Macro
    Dim objDoc As Document
    Dim objFld As Field

'Updates the specified form fields. This can take a while when the document gets large
    Set objDoc = ActiveDocument
    For Each objFld In objDoc.Fields
        If objFld.Type = wdFieldRef Then 'Updates Cross References
            objFld.Update
        If objFld.Type = wdFieldPage Then 'Updates Page Numbers
            objFld.Update
        ElseIf objFld.Type = wdFieldNumPages Then 'Updates Total Page Count
            objFld.Update
        ElseIf objFld.Type = wdFieldSequence Then 'Updates Sequence Fields
            objFld.Update
        End If
    Next objFld

ProtectDocument

End Sub

person Mike Lloyd    schedule 17.07.2015    source источник
comment
Выдает ошибку? что такое подфункция UnprotectDocument?   -  person 0m3r    schedule 18.07.2015
comment
ваш IF THEN ELSE Statement неполный   -  person 0m3r    schedule 18.07.2015
comment
@omar UnprotectDocument — это функция, которая снимает защиту с документа, чтобы позволить макросу редактировать вещи за пределами полей формы. И да, оператор if then else не был завершен. Ранее у меня было несколько операторов if, и я подумал, что проблема может быть в этом, поэтому я переформатировал его, как вы видите выше. Никаких ошибок не выдает. Макрос работает нормально, но просто обновляет номера страниц до неправильного значения.   -  person Mike Lloyd    schedule 20.07.2015
comment
Кроме того, простое использование ActiveDocument.Fields.Update также устанавливает для всех ссылок на страницы и numpage значение 1, но выбор всех + F9 обновляет их правильно.   -  person Mike Lloyd    schedule 22.07.2015
comment
У нас с коллегой аналогичная проблема в Word 2013, но мы не можем ее надежно воспроизвести. Поля корректно обновляются с помощью F9, но Fields(...).Update устанавливает PAGEREFs на 1 вместо правильного номера страницы. Его установка ведет себя не так, как моя, так что это может быть что-то в реестре, какие обновления установлены, или что-то из обычных подозреваемых для каждой машины.   -  person cxw    schedule 04.07.2016


Ответы (2)


Со мной также случилось так, что все ссылки на страницы указывали на страницу 1 в документе, когда я использовал ActiveDocument.Fields.Update, но это сработало, когда я обновил их вручную. После некоторых проб и ошибок я заметил, что это работает с использованием Selection.Fields.Update, поэтому я изменил макрос на следующее:

Sub UpdateAllFields()
Dim oCurrentRng As Range
Dim oRng As Range

Application.ScreenUpdating = False
Set oCurrentRng = Selection.Range
Set oRng = ActiveDocument.Range
oRng.Select
Selection.Fields.Update

oCurrentRng.Select
Application.Screenupdating = True
End Sub

Надеюсь, что это поможет кому-то!

//Дэйвид

person David Håkansson    schedule 22.02.2017

Вы должны использовать SELECT вместо несколько IF ELSE следующим образом:

Sub UpdateAllFields()

   UnprotectDocument

   'UpdateAllFields Macro
   Dim objDoc As Document
   Dim objFld As Field

   'Updates the specified form fields. 
   'This can take a while when the document gets large
   Set objDoc = ActiveDocument

   For Each objFld In objDoc.Fields

       Select Case objFld.Type

           Case wdFieldRef, wdFieldPage, wdFieldNumPages, wdFieldSequence
               objFld.Update

       End Select

   Next objFld

   ProtectDocument

End Sub

Видите, код такой простой и понятный.

person R.Katnaan    schedule 18.07.2015
comment
Спасибо. Я забыл о функции выбора. Однако это все еще не работает. Я вручную обновил номера страниц на странице 2 из 2 моего документа и, запустив этот макрос, сбросил их на 1 из 1. Я также закомментировал подфункции, чтобы убедиться, что они не вызывают конфликта, но проблема не устранена. Кажется, что-то изменилось между Word 2007, где у меня не было проблем с этим макросом, и 2013 годом. - person Mike Lloyd; 20.07.2015