Converting field results to hard text

T

Thomas Payne

I'm running XP Pro, and Word 2002.

My publisher needs me to convert my field results to hard text. Isn't there
a macro that does this? (I don't mean just F9 switching between viewing the
field and viewing the result -- I need to eliminate all the fields,
converting them into plain text that corresponds to their results).

On a related note: is there a macro that converts automatic numbering to
text numbering?

Thanks for any help.
Tom
 
C

Charles Kenyon

What follows is code that works to update all REF fields in a document. I
know that works. Then I am giving you code that I expect will do what you
want based on the macro I've tested.

Sub RefFieldUpdateAllStory()
' Written by Charles Kyle Kenyon 15 November 2001
' All Story Field Updater - Ref fields
Dim oField As Field
Dim oStory As Range
On Error Resume Next
For Each oStory In ActiveDocument.StoryRanges
' This goes into headers and footers as well as the regular document
For Each oField In ActiveDocument.Range.Fields
If oField.Type = wdFieldRef Then
oField.Update
End If
Next oField
Next oStory
End Sub

Sub FieldsUnlinkAllStory()
' Written by Charles Kyle Kenyon 9 December 2004
' All Story Field Unlinker
Dim oField As Field
Dim oStory As Range
On Error Resume Next
For Each oStory In ActiveDocument.StoryRanges
' This goes into headers and footers as well as the regular document
For Each oField In ActiveDocument.Range.Fields
oField.Unlink
Next oField
Next oStory
End Sub

There may be something less complex that will do it. If you don't have
headers/footers, text boxes or frames that contain fields you could just
use:

ActiveDocument.Fields.Unlink

Hope this helps,
 
J

Jezebel

Charles, there are bugs in your code --

1) Currently you are updating fields only in the body of the document,
notwithstanding your loop through the StoryRanges.

For Each oStory In ActiveDocument.StoryRanges
' This goes into headers and footers as well as the regular document
For Each oField In ActiveDocument.Range.Fields <-----
This is wrong

The line should be --

For Each oField In oStory.Fields


2) But even fixing that, your code will also miss fields in headers and
footers after the first section, and in textframes after the first.
Header/Footer and Textframe StoryRanges are linked lists. Iterating the
StoryRanges collection returns only the first item in the list. To get the
subsequent ranges you need something like

For Each oStory In ActiveDocument.StoryRanges

Do
oStory.Fields.Update
set oStory = oStory.Next
Loop until oStory is nothing

Next


Also there's no need to iterate the fields themselves. Once you have the
range you can operate on all its fields in one statement:

oStory.Fields.Update, oStory.field.unlink, etc
 
T

Thomas Payne

Yes, thanks. I figured that out, once I learned from Charles that the term
I should look for was "unlink."

Tom
 
C

Charles Kenyon

Thank you. I seldom work with mulit-section documents and so didn't trip
over this.
 
C

Charles Kenyon

For unlinking all fields I come up with:

Sub FieldsUnlinkAllStory()
' All Story Field Unlinker
Dim oStory As Range
On Error Resume Next
For Each oStory In ActiveDocument.StoryRanges
Do
oStory.Fields.Unlink
Set oStory = oStory.Next
Loop Until oStory Is Nothing
Next
End Sub

The reason, in the original macro, for iterating through the fields was to
test for field type. That macro was only to update REF fields and not other
fields. I think this is because in some instances it is used in documents
that have ASK or fill-in fields.

What I come up with for the one that only updates Ref fields, then, is:
Sub RefFieldUpdateAllStory()
' Written by Charles Kyle Kenyon 15 November 2001
' repaired with help from Jezebel
' All Story Field Updater - Ref fields
Dim oField As Field
Dim oStory As Range
For Each oStory In ActiveDocument.StoryRanges
' This goes into headers and footers as well as the regular document
Do
For Each oField In oStory.Fields
If oField.Type = wdFieldRef Then
oField.Update
End If
Next oField
Set oStory = oStory.Next
Loop Until oStory Is Nothing
Next oStory
End Sub

I'm still not sure why the loop should get me through different sections
when the iteration does not but I accept your advice that it does. It also
seems as if this goes through each storyrange twice. I guess that just shows
my lack of understanding of these structures.

Thank you again.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top