Vba word обновить оглавление

Студворк — интернет-сервис помощи студентам

После определенной манипуляции из макроса с документом Word, необходимо обновить оглавление, которое уже было создано, но в силу изменения структуры документа стало не актуальным как в отношении номеров страниц, так и в отношении собственно пунктов оглавления (появились новые заголовки, на разных уровнях и их надо включить в оглавление). Путем экспериментов пытался найти команду используемую для этого самим вордом. т.е. ставил на запись макрос и обновлял только номера страниц и обновлял оглавление целиком. Но к моему удивлению в редакторе макросов я увидел использование дважды одной и той же команды:

Visual Basic
1
Selection.Fields.Update

Как я потом при запуске этого макроса я выяснил, что это команда для обновления только номеров страниц. Видимо, в режиме записи макроса, ворда не все команды пишет в модуль… И вот собственно возникла проблема, как же все-таки обновить оглавление целиком из макроса?

I’m new to VBA. I’m trying to update the Table of Contents in my Word document everytime I open the document, but it does not seem to update it at all.

In ThisDocument I’ve done the following:

Private Sub Document_Open()
ActiveDocument.TablesOfContents(1).Update
End Sub

Can anyone help me?

Martijn Pieters's user avatar

asked Jun 22, 2010 at 13:29

Oppermann's user avatar

0

The issue is probably the use of Document_Open — you have to set up the event in the template, not the document you are opening. You can also use an Auto_Open macro. Note that ActiveDocument may also be part of the culprit — the document you open may not yet be the actual active document when you kick the Document_Open event — you may need to set a reference to the document you’re opening like:

Dim doc As Document
set doc = Documents.Open(your path here)
doc.TablesOfContents(1).Update

Finally, your Macro Security settings could be disallowing anything from executing.

In all cases, have a good read of Take Control of Microsoft Word Through Events and Running a macro automatically when a document is created, opened or closed.

answered Jun 22, 2010 at 15:37

Todd Main's user avatar

Todd MainTodd Main

28.9k11 gold badges82 silver badges146 bronze badges

Перейти к содержанию

Обновление всего оглавления из макроса

На чтение 1 мин. Просмотров 28 Опубликовано 16.05.2021

Если у вас есть документ, содержащий оглавление (TOC), и вы обновляете поля во всем документе, Word спрашивает, хотите ли вы обновить всю таблицу или только номера страниц в таблице. Это происходит потому, что оглавление реализуется с помощью поля, и когда вы обновляете все поля, вы сообщаете Word, что вы также хотите обновить поле, лежащее в основе оглавления.

Вы можете обновить оглавление с помощью макрос, используя коллекцию TablesOfContents. Каждый элемент в коллекции представляет собой одно оглавление в документе. (В большинстве документов коллекция будет состоять только из одного элемента.) Для обновления всего оглавления используется следующий формат команды:

 ActiveDocument.TablesOfContents (1) .Update 

Метод Update – это то, что делает работу; он обновляет оглавление. Если вы хотите обновить только номера страниц в оглавлении, вы используете совершенно другой метод:

 ActiveDocument.TablesOfContents (1) .UpdatePageNumbers 

Каждый раз, когда вы используете команды подобно тому, как это делается в макросе, рекомендуется убедиться, что в документе действительно есть оглавление, прежде чем пытаться выполнить какое-либо обновление. Самый простой способ сделать это – просто проверить свойство Count для коллекции, как показано здесь:

 Если ActiveDocument.TablesOfContents.Count = 1 Then _ ActiveDocument.TablesOfContents (1) .Update 

I have a macro for my word document which is meant to update all the fields and all the table of contents.

Sub UpdateFields()
    Dim oStory As Range
    For Each oStory In ActiveDocument.StoryRanges
        oStory.Fields.Update
        If oStory.StoryType <> wdMainTextStory Then
            While Not (oStory.NextStoryRange Is Nothing)
                Set oStory = oStory.NextStoryRange
                oStory.Fields.Update
            Wend
        End If
    Next oStory
    Set oStory = Nothing

    Dim TOC As TableOfContents
    For Each TOC In ActiveDocument.TablesOfContents
        TOC.Update
    Next
End Sub

However, when it is run I get this error.

enter image description here
Error and then debug below
I would appreciate any help in fixing the problem.

asked Apr 29, 2017 at 11:57

Dan's user avatar

5

The issue is caused by naming the sub UpdateFields. For unknown reasons this name is reserved in Word VBA. Rename the sub to an allowed name (for example, FieldUpdates) and the code will work fine.

answered Apr 30, 2017 at 1:33

joeschwa's user avatar

joeschwajoeschwa

2,9281 gold badge24 silver badges41 bronze badges

1

The error thrown indicates that the TableOfContents specified for update doesn’t exist. Word will produce errors of this type when using For ... Each loops to access some of its collections. The number of TOCs Word is aware of may have changed while editing the document. To avoid the error, avoid For ... Each enumerations. Use code like the following instead.

Dim i As Integer

With ActiveDocument
    For i = 1 To .TablesOfContents.Count
        .TableOfContents(i).Update
    Next i
End With

answered Apr 30, 2017 at 2:18

Variatus's user avatar

VariatusVariatus

14.3k2 gold badges14 silver badges30 bronze badges

1

Формулировка задачи:

После определенной манипуляции из макроса с документом Word, необходимо обновить оглавление, которое уже было создано, но в силу изменения структуры документа стало не актуальным как в отношении номеров страниц, так и в отношении собственно пунктов оглавления (появились новые заголовки, на разных уровнях и их надо включить в оглавление). Путем экспериментов пытался найти команду используемую для этого самим вордом. т.е. ставил на запись макрос и обновлял только номера страниц и обновлял оглавление целиком. Но к моему удивлению в редакторе макросов я увидел использование дважды одной и той же команды:

Как я потом при запуске этого макроса я выяснил, что это команда для обновления только номеров страниц. Видимо, в режиме записи макроса, ворда не все команды пишет в модуль… И вот собственно возникла проблема, как же все-таки обновить оглавление целиком из макроса?

Код к задаче: «Обновить целиком оглавление в Word из VBA»

textual

Sub TablesOfContentsUpdate()
   ActiveDocument.TablesOfContents(1).Update
End Sub

Полезно ли:

11   голосов , оценка 3.818 из 5

Вероятно, проблема заключается в использовании Document_Open — вам необходимо настроить событие в шаблоне, а не в документе, который вы открываете. Вы также можете использовать макрос Auto_Open. Обратите внимание, что ActiveDocument также может быть частью виновника — документ, который вы открываете, еще не может быть фактическим активным документом, когда вы пинете событие Document_Open — вам может потребоваться установить ссылку на открываемый документ, например:

Dim doc As Document
set doc = Documents.Open(your path here)
doc.TablesOfContents(1).Update

Наконец, ваши настройки Macro Security могут запрещать выполнение каких-либо действий.

Во всех случаях хорошо прочитайте Возьмите контроль над Microsoft Word через события и Выполнение макроса автоматически при создании, открытии или закрытии документа.

Проблема, вероятно, заключается в использовании Document_Open — вы должны настроить событие в шаблоне, а не в документе, который вы открываете. Вы также можете использовать Auto_Open макро. Обратите внимание, что ActiveDocument также может быть частью виновника — открытый вами документ может еще не быть действительным документом, когда вы нажимаете Document_Open событие — вам может понадобиться установить ссылку на открываемый документ, например:

Dim doc As Document
set doc = Documents.Open(your path here)
doc.TablesOfContents(1).Update

Наконец, ваши настройки безопасности макросов могут запрещать выполнение чего-либо.

Во всех случаях хорошо прочитайте » Взять под контроль Microsoft Word с помощью событий» и » Запуск макроса автоматически при создании, открытии или закрытии документа».

Like this post? Please share to your friends:
  • Vba word поля страницы
  • Vba word номер ячейки таблицы
  • Vba word поля документа
  • Vba word номер строки
  • Vba word положение курсора