Home | Contact Us | FAQ | Search & Site Map | Link to Us
Sign In | Join | Other 45 Sites in Network
Home
DiscussionsAccessExcelInfoPathOutlookPowerPointPublisherWord
DirectoryUser Groups
Related Topics
Outlook ExpressInternet ExplorerWindowsMS Server ProductsMore Topics ...

MS Office Forum / Word / Tables / July 2004

Tip: Looking for answers? Try searching our database.

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

Thread view: 
Enable EMail Alerts  Start New Thread
Thread rating: 
Kathleen - 09 Jul 2004 10:27 GMT
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)
Graham Mayor - 09 Jul 2004 11:09 GMT
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.

Signature

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

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

> This is a strange one. I took the standard macro that
> updates all fields in the doc from the Microsoft website.
[quoted text clipped - 16 lines]
> bStory, perhaps? I have a workaround for that little
> problem that *does* work, if anyone is interested)
- 09 Jul 2004 16:21 GMT
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)

>-----Original Message-----
>Are you sure it's not working? Have you made changes that would affect the
[quoted text clipped - 79 lines]
>
>.
Kathleen - 09 Jul 2004 16:33 GMT
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

>-----Original Message-----
>Sub UpdateAllTOC()
[quoted text clipped - 3 lines]
>    Next oTOC
>End Sub

>or for all fields
>
[quoted text clipped - 66 lines]
>
>.
Graham Mayor - 10 Jul 2004 09:07 GMT
Fields in different parts of the document structure can be difficult to
address, hence the alternative suggestions. :)

Signature

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

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

> Graham,
> Interesting results. These two work perfectly:
[quoted text clipped - 97 lines]
>>
>> .
Shauna Kelly - 10 Jul 2004 14:05 GMT
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

> Fields in different parts of the document structure can be difficult to
> address, hence the alternative suggestions. :)
[quoted text clipped - 100 lines]
> >>
> >> .
Graham Mayor - 10 Jul 2004 15:27 GMT
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 :)

Signature

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

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

> Hi Graham
>
[quoted text clipped - 121 lines]
>>>>
>>>> .
Kathleen - 12 Jul 2004 08:37 GMT
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

>-----Original Message-----
>I haven't been able to reproduce it on demand either which is why I have
[quoted text clipped - 128 lines]
>
>.
Kathleen - 09 Jul 2004 12:04 GMT
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.
Stefan Blom - 12 Jul 2004 13:33 GMT
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

Signature

Stefan Blom

> Some more info. This is Word 2002 SP-2. I can manually
> select the TOC and update it. That's OK.
[quoted text clipped - 17 lines]
> release this template and macro set for a group it's just
> too flaky to inflict on innoncent people.
 
Sign In
Join
My Latest Posts
My Monitored Threads
My Blog
My Photo Gallery
My Profile
My Homepage

Start New Thread
Enable EMail Alerts
Rate this Thread



©2008 Advenet LLC   Privacy Policy - Terms of Use
This website includes both content owned or controlled by Advenet as well as content owned or controlled by third parties.