Saving a mail merged document using the value from a datafield

B

Biz Analyst

Hi,

I am running a mail merge to a new document. The template is one
page, and I have some code to pull each page from the merged document
and save it as its own new file. So, right now, it ends up being
MergeResult1.doc, MergeResult2.doc, MergeResult3.doc, etc... What I
want to do is save each file using one of the datafield values
(employee ID). In this case, it would look like this:
employee_12345.doc, employee_67890.doc, employee_98765.doc, etc.
Right now the code saves the doc using a doc counter, but I want to
have it pull the value from the employee ID datafield and add it to
the filename string. I know this is simple for someone out there.
Can you help me out? ~ Sean


Here's my code


Sub SaveAllSubDocs(ByRef doc As Word.Document)
Dim subdoc As Word.Subdocument
Dim newdoc As Word.Document
Dim docCounter As Long
docCounter = 1
'Must be in MasterView to work with
'Subdocs as separate files
doc.ActiveWindow.View = wdMasterView
For Each subdoc In doc.Subdocuments
Set newdoc = subdoc.Open
'Remove NextPage section breaks
'originating from mailmerge
RemoveAllSectionBreaks newdoc
With newdoc
..SaveAs FileName:="MergeResult" & CStr(docCounter)
..Close
End With
docCounter = docCounter + 1
Next subdoc
End Sub
 
P

Peter Jamieson

It's actually a bit easier if you can pick up the value of the merge field
during the merge - after you have done the merge, the association between
the sections of the output document and the data source is in essence gone,
so you would have to know precisely where to look for the employee ID within
the output document.

In simple cases (where there is a one-to-one correspondence between a
record in the data source and an output letter), you can use code like the
following:

Sub ProduceOneDocPerSourceRec()
'
' NB, needs bettor error management and doubtless other things a VBA expert
' will point out.


Dim intSourceRecord
Dim objMerge As Word.MailMerge
Dim strOutputDocumentName As String
Dim TerminateMerge As Boolean


' Need to set up this object as the ActiveDocument changes when the
' merge is performed. Besides, it's clearer.


Set objMerge = ActiveDocument.MailMerge
With objMerge


' If no data source has been defined, do it here using OpenDataSource.
' But if it is already defined in the document, you should not need to
define it here.


' .OpenDataSource _
' Name:="whatever"


intSourceRecord = 1
TerminateMerge = False


Do Until TerminateMerge
.DataSource.ActiveRecord = intSourceRecord


' if we have gone past the end (and possibly, if there are no records)
' then the Activerecord will not be what we have just tried to set it to


If .DataSource.ActiveRecord <> intSourceRecord Then
TerminateMerge = True
' the record exists
Else


' while we are looking at the correct activerecord,
' create the document path name
' e.g. - you will need to change this -
' and make sure the merge field name is identical
' (here, it is case sensitive)

strOutputDocumentName = _
"c:\mydoc\MergeResult_" & _
trim(cstr(.DataSource.Datafields("employee ID").Value)) & ".doc"


.DataSource.FirstRecord = intSourceRecord
.DataSource.LastRecord = intSourceRecord
.Destination = wdSendToNewDocument
.Execute


' The Activedocument is always the output document
' Add any parameters you need to these calls
ActiveDocument.SaveAs strOutputDocumentName
ActiveDocument.Close
intSourceRecord = intSourceRecord + 1
End If
Loop
End With
End Sub


Other approaches are described on Graham Mayor's site at

http://www.gmayor.com/individual_merge_letters.htm

Peter Jamieson
 

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