How to get all mail merge fields in a document

M

maxmcclo

I am using COM automation and WordBasic to drive Word from another
application.
I have Word templates defined with mail merge fields in them.
I am trying to open one of my Word templates and ask it for all the
mail merge fields in it.
I am doing this because I want to build the data source file on the
fly.
I want to create a single record in the data source and have in it only
the fields required for the current template.
My problem is that I cant find a function which will return me all the
mail merge field names in a document.
I previously tried using bookmarks instead of mail merge fields and
this worked fine. I could ask the document for all its bookmarks and
then get the data transferred across from my app to Word for just the
bookmarks defined in the document.
Does anyone know of a function which will give me the names of all mail
merge fields in a document ?
The function MergeFieldName$(1) will get me the first mail merge field
name in a data source file but not in a document file.
Thanks
 
D

Doug Robbins - Word MVP

Macro to extract all of the email addresses from a document

Sub CopyAddressesToOtherDoc()


Dim Source As Document, Target As Document, myRange As Range
Set Source = ActiveDocument
Set Target = Documents.Add

Application.ScreenUpdating = False

Source.Activate
Selection.HomeKey Unit:=wdStory
Selection.Find.ClearFormatting
With Selection.Find
Do While .Execute(findText:="[+0-9A-z._-]{1,}\@[A-z.]{1,}", _
MatchWildcards:=True, Wrap:=wdFindStop, Forward:=True) = True
Set myRange = Selection.Range
Target.Range.InsertAfter myRange & vbCr
Loop
End With

Selection.HomeKey Unit:=wdStory
Target.Activate

End Sub

--
Hope this helps.

Please reply to the newsgroup unless you wish to avail yourself of my
services on a paid consulting basis.

Doug Robbins - Word MVP
 
G

Graham Mayor

Doug is on the right lines here, but the search routine may not give the
results required. Try the following, which extracts all the mergefields from
the document and writes them to another document, then deletes any
duplicates: You end up with a list of all the mergefields in the document.

Sub CopyMergefieldsToOtherDoc()
Dim Source As Document, Target As Document, myRange As Range, sView As
String
Set Source = ActiveDocument
sView = ActiveWindow.View.ShowFieldCodes
Set Target = Documents.Add
Application.ScreenUpdating = False
Source.Activate
ActiveWindow.View.ShowFieldCodes = True
Selection.HomeKey Unit:=wdStory
Selection.Find.ClearFormatting
With Selection.Find
Do While .Execute(findText:="^d Merge", _
MatchWildcards:=False, Wrap:=wdFindStop, _
Forward:=True) = True
Set myRange = Selection.Range
Target.Range.InsertAfter myRange & vbCr
Loop
End With
Selection.HomeKey Unit:=wdStory
ActiveWindow.View.ShowFieldCodes = sView
Target.Activate
Selection.Find.ClearFormatting
Selection.Find.Replacement.ClearFormatting
With Selection.Find
.Text = "Mergefield"
.Replacement.Text = "MERGEFIELD"
.Forward = True
.Wrap = wdFindContinue
.Format = False
.MatchCase = False
.MatchWholeWord = False
.MatchWildcards = False
.MatchSoundsLike = False
.MatchAllWordForms = False
End With
Selection.Find.Execute replace:=wdReplaceAll
Selection.Sort FieldNumber:="Paragraphs", _
SortFieldType:=wdSortFieldAlphanumeric, _
SortOrder:=wdSortOrderAscending
Selection.Find.ClearFormatting
Selection.Find.Replacement.ClearFormatting
With Selection.Find
.Text = "(*^13)@"
.Replacement.Text = "\1"
.Forward = True
.Wrap = wdFindContinue
.Format = False
.MatchCase = False
.MatchWholeWord = False
.MatchAllWordForms = False
.MatchSoundsLike = False
.MatchWildcards = True
End With
Selection.Find.Execute replace:=wdReplaceAll
Selection.Delete Unit:=wdCharacter, Count:=1
End Sub


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


<>>< ><<> ><<> <>>< ><<> <>>< <>><<>
Macro to extract all of the email addresses from a document

Sub CopyAddressesToOtherDoc()


Dim Source As Document, Target As Document, myRange As Range
Set Source = ActiveDocument
Set Target = Documents.Add

Application.ScreenUpdating = False

Source.Activate
Selection.HomeKey Unit:=wdStory
Selection.Find.ClearFormatting
With Selection.Find
Do While .Execute(findText:="[+0-9A-z._-]{1,}\@[A-z.]{1,}", _
MatchWildcards:=True, Wrap:=wdFindStop, Forward:=True) = True
Set myRange = Selection.Range
Target.Range.InsertAfter myRange & vbCr
Loop
End With

Selection.HomeKey Unit:=wdStory
Target.Activate

End Sub


I am using COM automation and WordBasic to drive Word from another
application.
I have Word templates defined with mail merge fields in them.
I am trying to open one of my Word templates and ask it for all the
mail merge fields in it.
I am doing this because I want to build the data source file on the
fly.
I want to create a single record in the data source and have in it
only the fields required for the current template.
My problem is that I cant find a function which will return me all
the mail merge field names in a document.
I previously tried using bookmarks instead of mail merge fields and
this worked fine. I could ask the document for all its bookmarks and
then get the data transferred across from my app to Word for just
the bookmarks defined in the document.
Does anyone know of a function which will give me the names of all
mail merge fields in a document ?
The function MergeFieldName$(1) will get me the first mail merge
field name in a data source file but not in a document file.
Thanks
 
M

mm

Thanks Doug and Graham.
However my point of reference is that I am in my own application, outside of
Word, using COM automation and 'WordBasic' functions to communicate with
Word.
Therefore I don't think I can run the code below from my application to get
the merge field names.
When I use bookmarks instead of merge fields I can invoke the procedure
BookmarkName$(Count) to get the names of bookmarks. I can then 'goto' the
bookmark and then insert text, all through the WordBasic interface.

So my requirement is - to open a word template, ask it for its fields, and
then populate just those fields.
I was hoping I could somehow use mail merge and build the merge data file
with 1 row in it on the fly. I was hoping I could build the merge data file
based on which fields the document needs. However if I can't get the names
of just the fields used in a specific template then I will have to revert
back to using bookmarks.

How about this idea. A merge field can also have a bookmark. If I gave the
merge fields a bookmark name with the same name then I would be all set. I
could ask for the bookmark names and then build a merge data file and
perform a mail merge. What do you think ? Any other ideas ?

Thanks.

Michael.



Graham Mayor said:
Doug is on the right lines here, but the search routine may not give the
results required. Try the following, which extracts all the mergefields
from the document and writes them to another document, then deletes any
duplicates: You end up with a list of all the mergefields in the document.

Sub CopyMergefieldsToOtherDoc()
Dim Source As Document, Target As Document, myRange As Range, sView As
String
Set Source = ActiveDocument
sView = ActiveWindow.View.ShowFieldCodes
Set Target = Documents.Add
Application.ScreenUpdating = False
Source.Activate
ActiveWindow.View.ShowFieldCodes = True
Selection.HomeKey Unit:=wdStory
Selection.Find.ClearFormatting
With Selection.Find
Do While .Execute(findText:="^d Merge", _
MatchWildcards:=False, Wrap:=wdFindStop, _
Forward:=True) = True
Set myRange = Selection.Range
Target.Range.InsertAfter myRange & vbCr
Loop
End With
Selection.HomeKey Unit:=wdStory
ActiveWindow.View.ShowFieldCodes = sView
Target.Activate
Selection.Find.ClearFormatting
Selection.Find.Replacement.ClearFormatting
With Selection.Find
.Text = "Mergefield"
.Replacement.Text = "MERGEFIELD"
.Forward = True
.Wrap = wdFindContinue
.Format = False
.MatchCase = False
.MatchWholeWord = False
.MatchWildcards = False
.MatchSoundsLike = False
.MatchAllWordForms = False
End With
Selection.Find.Execute replace:=wdReplaceAll
Selection.Sort FieldNumber:="Paragraphs", _
SortFieldType:=wdSortFieldAlphanumeric, _
SortOrder:=wdSortOrderAscending
Selection.Find.ClearFormatting
Selection.Find.Replacement.ClearFormatting
With Selection.Find
.Text = "(*^13)@"
.Replacement.Text = "\1"
.Forward = True
.Wrap = wdFindContinue
.Format = False
.MatchCase = False
.MatchWholeWord = False
.MatchAllWordForms = False
.MatchSoundsLike = False
.MatchWildcards = True
End With
Selection.Find.Execute replace:=wdReplaceAll
Selection.Delete Unit:=wdCharacter, Count:=1
End Sub


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


<>>< ><<> ><<> <>>< ><<> <>>< <>><<>
Macro to extract all of the email addresses from a document

Sub CopyAddressesToOtherDoc()


Dim Source As Document, Target As Document, myRange As Range
Set Source = ActiveDocument
Set Target = Documents.Add

Application.ScreenUpdating = False

Source.Activate
Selection.HomeKey Unit:=wdStory
Selection.Find.ClearFormatting
With Selection.Find
Do While .Execute(findText:="[+0-9A-z._-]{1,}\@[A-z.]{1,}", _
MatchWildcards:=True, Wrap:=wdFindStop, Forward:=True) = True
Set myRange = Selection.Range
Target.Range.InsertAfter myRange & vbCr
Loop
End With

Selection.HomeKey Unit:=wdStory
Target.Activate

End Sub


I am using COM automation and WordBasic to drive Word from another
application.
I have Word templates defined with mail merge fields in them.
I am trying to open one of my Word templates and ask it for all the
mail merge fields in it.
I am doing this because I want to build the data source file on the
fly.
I want to create a single record in the data source and have in it
only the fields required for the current template.
My problem is that I cant find a function which will return me all
the mail merge field names in a document.
I previously tried using bookmarks instead of mail merge fields and
this worked fine. I could ask the document for all its bookmarks and
then get the data transferred across from my app to Word for just
the bookmarks defined in the document.
Does anyone know of a function which will give me the names of all
mail merge fields in a document ?
The function MergeFieldName$(1) will get me the first mail merge
field name in a data source file but not in a document file.
Thanks
 
B

Benjamin S Pendygraft II

I realize this is a very old post, but I used your Macro and it worked perfectly on one document. But on the second document it skipped a few fields. Do you have any idea as to why it might have skipped some fields?

Doug is on the right lines here, but the search routine may not give the
results required. Try the following, which extracts all the mergefields from
the document and writes them to another document, then deletes any
duplicates: You end up with a list of all the mergefields in the document.

Sub CopyMergefieldsToOtherDoc()
Dim Source As Document, Target As Document, myRange As Range, sView As
String
Set Source = ActiveDocument
sView = ActiveWindow.View.ShowFieldCodes
Set Target = Documents.Add
Application.ScreenUpdating = False
Source.Activate
ActiveWindow.View.ShowFieldCodes = True
Selection.HomeKey Unit:=wdStory
Selection.Find.ClearFormatting
With Selection.Find
Do While .Execute(findText:="^d Merge", _
MatchWildcards:=False, Wrap:=wdFindStop, _
Forward:=True) = True
Set myRange = Selection.Range
Target.Range.InsertAfter myRange & vbCr
Loop
End With
Selection.HomeKey Unit:=wdStory
ActiveWindow.View.ShowFieldCodes = sView
Target.Activate
Selection.Find.ClearFormatting
Selection.Find.Replacement.ClearFormatting
With Selection.Find
.Text = "Mergefield"
.Replacement.Text = "MERGEFIELD"
.Forward = True
.Wrap = wdFindContinue
.Format = False
.MatchCase = False
.MatchWholeWord = False
.MatchWildcards = False
.MatchSoundsLike = False
.MatchAllWordForms = False
End With
Selection.Find.Execute replace:=wdReplaceAll
Selection.Sort FieldNumber:="Paragraphs", _
SortFieldType:=wdSortFieldAlphanumeric, _
SortOrder:=wdSortOrderAscending
Selection.Find.ClearFormatting
Selection.Find.Replacement.ClearFormatting
With Selection.Find
.Text = "(*^13)@"
.Replacement.Text = "\1"
.Forward = True
.Wrap = wdFindContinue
.Format = False
.MatchCase = False
.MatchWholeWord = False
.MatchAllWordForms = False
.MatchSoundsLike = False
.MatchWildcards = True
End With
Selection.Find.Execute replace:=wdReplaceAll
Selection.Delete Unit:=wdCharacter, Count:=1
End Sub


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


<>>< ><<> ><<> <>>< ><<> <>>< <>><<>
Macro to extract all of the email addresses from a document

Sub CopyAddressesToOtherDoc()


Dim Source As Document, Target As Document, myRange As Range
Set Source = ActiveDocument
Set Target = Documents.Add

Application.ScreenUpdating = False

Source.Activate
Selection.HomeKey Unit:=wdStory
Selection.Find.ClearFormatting
With Selection.Find
Do While .Execute(findText:="[+0-9A-z._-]{1,}\@[A-z.]{1,}", _
MatchWildcards:=True, Wrap:=wdFindStop, Forward:=True) = True
Set myRange = Selection.Range
Target.Range.InsertAfter myRange & vbCr
Loop
End With

Selection.HomeKey Unit:=wdStory
Target.Activate

End Sub


I am using COM automation and WordBasic to drive Word from another
application.
I have Word templates defined with mail merge fields in them.
I am trying to open one of my Word templates and ask it for all the
mail merge fields in it.
I am doing this because I want to build the data source file on the
fly.
I want to create a single record in the data source and have in it
only the fields required for the current template.
My problem is that I cant find a function which will return me all
the mail merge field names in a document.
I previously tried using bookmarks instead of mail merge fields and
this worked fine. I could ask the document for all its bookmarks and
then get the data transferred across from my app to Word for just
the bookmarks defined in the document.
Does anyone know of a function which will give me the names of all
mail merge fields in a document ?
The function MergeFieldName$(1) will get me the first mail merge
field name in a data source file but not in a document file.
Thanks
 

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