После определенной манипуляции из макроса с документом Word, необходимо обновить оглавление, которое уже было создано, но в силу изменения структуры документа стало не актуальным как в отношении номеров страниц, так и в отношении собственно пунктов оглавления (появились новые заголовки, на разных уровнях и их надо включить в оглавление). Путем экспериментов пытался найти команду используемую для этого самим вордом. т.е. ставил на запись макрос и обновлял только номера страниц и обновлял оглавление целиком. Но к моему удивлению в редакторе макросов я увидел использование дважды одной и той же команды:
Visual Basic | ||
|
Как я потом при запуске этого макроса я выяснил, что это команда для обновления только номеров страниц. Видимо, в режиме записи макроса, ворда не все команды пишет в модуль… И вот собственно возникла проблема, как же все-таки обновить оглавление целиком из макроса?
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?
asked Jun 22, 2010 at 13:29
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 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.
Error and then debug below
I would appreciate any help in fixing the problem.
asked Apr 29, 2017 at 11:57
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
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
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 с помощью событий» и » Запуск макроса автоматически при создании, открытии или закрытии документа».