Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Can't update TOC programmatically (but it worked yesterday)

267 views
Skip to first unread message

Kathleen

unread,
Jul 9, 2004, 5:27:39 AM7/9/04
to
This is a strange one. I took the standard macro that
updates all fields in the doc from the Microsoft website.
Yesterday it worked. Today it doesn't. Any ideas what I
might have done to the doc to break it? (I can still
manually update the TOC).

Dim aStory As Range
Dim aField As Field

For Each aStory In ActiveDocument.StoryRanges
For Each aField In aStory.Fields
aField.Update
Next aField
Next aStory

(By the way, despite what our friends at Microsoft say,
it doesn't update ALL fields, it misses out any that are
in the headers & footers but that's a different story.
bStory, perhaps? I have a workaround for that little
problem that *does* work, if anyone is interested)

Kathleen

unread,
Jul 9, 2004, 7:04:51 AM7/9/04
to
Some more info. This is Word 2002 SP-2. I can manually
select the TOC and update it. That's OK.

I can do Select All + F9 to update it. That's OK.

But if I record a macro that does Select All + F9, it
works while I'm recording the macro, but if I play it
back then macro stops working.

The recorded macro looks like this:
Selection.WholeStory
Selection.Fields.Update

Have I accidentally done something bad in Options? I am
forcing the setting for "Update fields when Printing" to
be true in the main macro (that's my workaround for
updating fields in the header)

I'd be very grateful for any insight into this. I need to
release this template and macro set for a group it's just
too flaky to inflict on innoncent people.

Graham Mayor

unread,
Jul 9, 2004, 6:09:40 AM7/9/04
to
Are you sure it's not working? Have you made changes that would affect the
TOC?

Try this one:

Sub UpdateAllTOC()
Dim oTOC As TableOfContents
For Each oTOC In ActiveDocument.TablesOfContents
oTOC.Update
Next oTOC
End Sub

or for all fields

Sub Update()
Dim oField As Field
Dim oSection As Section
Dim oHeader As HeaderFooter
Dim oFooter As HeaderFooter
Dim oTOC As TableOfContents
For Each oTOC In ActiveDocument.TablesOfContents
oTOC.Update
Next oTOC
For Each oSection In ActiveDocument.Sections
For Each oHeader In oSection.Headers
If oHeader.Exists Then
For Each oField In oHeader.Range.Fields
oField.Update
Next oField
End If
Next oHeader
For Each oFooter In oSection.Footers
If oFooter.Exists Then
For Each oField In oFooter.Range.Fields
oField.Update
Next oField
End If
Next oFooter
Next oSection
End Sub

For general use, I tend to use:

Sub UpdateAllFields()
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
End Sub

which is listed as an example on my web site at
http://www.gmayor.com/installing_macro.htm and should also work with TOC.

--
<>>< ><<> ><<> <>>< ><<> <>>< <>><<>
Graham Mayor - Word MVP

My web site www.gmayor.com
Word MVP web site http://word.mvps.org

anon...@discussions.microsoft.com

unread,
Jul 9, 2004, 11:21:20 AM7/9/04
to
Thanks very much! I'll try it now.
(And yes, the other one is definitely broken. Have tested
it myself on other documents and asked two other people
to run it on their machines ... same results)

>.
>

Kathleen

unread,
Jul 9, 2004, 11:33:17 AM7/9/04
to
Graham,
Interesting results. These two work perfectly:

>Sub UpdateAllTOC()
>Sub Update()

But this one doesn't:

>Sub UpdateAllFields()

I'm using Word 2002, SP-2. Thanks again, at least I know
I haven't gone mad.
-- Kathleen

>.
>

Graham Mayor

unread,
Jul 10, 2004, 4:07:45 AM7/10/04
to
Fields in different parts of the document structure can be difficult to
address, hence the alternative suggestions. :)

Shauna Kelly

unread,
Jul 10, 2004, 9:05:11 AM7/10/04
to
Hi Graham

FWIW, I've found the same problem. That is, in a macro that goes through the
StoryRanges as your UpdateAllFields() does, for some reason TOC fields don't
update. So I tend to tack on the equivalent of your UpdateAllTOC(). I've
seen this in Word 2000 and 2002, but I've never been able to reproduce it on
demand :-(

Shauna

Shauna Kelly. Microsoft MVP.
http://www.shaunakelly.com/word


"Graham Mayor" <gma...@DELETECAPSmvps.org> wrote in message
news:eMt5xolZ...@TK2MSFTNGP10.phx.gbl...

Graham Mayor

unread,
Jul 10, 2004, 10:27:04 AM7/10/04
to
I haven't been able to reproduce it on demand either which is why I have
stuck with that code. I don't do much work personally with T'sOC and for the
little I do, it is no big deal to use F9 :)

Kathleen

unread,
Jul 12, 2004, 3:37:56 AM7/12/04
to
I use TOCs and fields extensively in shared group
templates. It is really important to me that the users
have a reliable and easy way of updating _all_ fields in
a document, not just the TOC. It surprises me that you
find the results inconsistent, because in Word 2000 the
StoryRanges macro has *always* failed to update fields in
the headers for all users of the templates (but perhaps
it's because I was bringing templates forward from Word
97?).

Now in Word 2002, the StoryRanges macro fails to update
the TOC as well. I had two different users test it with
the same results, i.e., the StoryRanges macro fails to
update the TOC every time. My test document was the
world's simplest document: I launched Word using
winword.exe /a, created a brand new Normal.dot, did
absolutely no formatting changes and used all default
headings. I'm just a technical author, but it looks like
a bug to me. If it's not, I'd be very interested in
knowing what I've done to cause it to fail.

I'm grateful to Graham for providing the alternative
macros.
-- Regards,
Kathleen

>.
>

Stefan Blom

unread,
Jul 12, 2004, 8:33:10 AM7/12/04
to
When you update a table of contents with F9 or by using the context
menu you are prompted either to update only page numbers or to update
the entire table. In VBA, when you reference a table of contents as a
TableOfContents object, this corresponds to calling the
UpdatePageNumbers and Update methods, respectively.

However, if you reference the table of contents as a Field object, you
only have access to the Update method. This means that the coders at
Microsoft had to choose: should the Update method of the Field class
(as well as the Fields collection) update the entire TOC or only the
page numbers? Apparently, they chose the latter.

Two (simple) examples:

Example 1. To update all fields in the main body of the current
document, you can use this code:

ActiveDocument.Fields.Update 'updates all fields
'in main body of document;
'only page numbers updated
'for TOC fields

Example 2. To update all table of contents in the main body of the
current document, you could use something like this:

For Each toc In ActiveDocument.TablesOfContents
toc.Update 'Update entire TOC
Next toc

--
Stefan Blom


"Kathleen" <anon...@discussions.microsoft.com> wrote in message
news:2998e01c465a4$8e7041e0$a501...@phx.gbl...

0 new messages