I suppose I should have just posted the entire thing
:But there were one
or two options. Here'sthe code with the oMMMD stuff inserted. I hope it's
correct:
Sub ModifyZipFieldName()
' Macro by PJ Jamieson, March 2004
' v1.1 Modified May 2004 to do a merge to a document
' This macro looks for a field name called "ZIP/Postal Code"
' in the header record of a mail merge data source and modifies
' the name so that Word automatically maps its ZIP/Postal code
' to the field.
' Written for use with Word 2003/Outlook 2003, but it may work
' in earlier versions
' Requires the "Microsoft Scripting Runtime" object library:
' You will need to use the VBA Editor menu command
' Tools|References to add a reference to this library
' This macro is intended to be used when a merge is initiated
' from Outlook. In that case, I believe the following assumptions
' can be made:
' The merge data file is a Unicode format text file
' (notice that by default it has a .doc extension)
' Outlook reconnects to the data source and removes any
' sort/filter options you may have defined
' The macro also assumes that it is OK to create/overwrite a
' file with the same name as the data source + ".tmp"
Dim oFileSystemObject As Scripting.FileSystemObject
Dim oSourceStream As Scripting.TextStream
Dim oDestStream As Scripting.TextStream
Dim sHeaderRecord As String
Dim sMergeDataSourceName As String
Dim vMergeType As WdMailMergeMainDocType
' v1.1 don't need this line any more
' Dim vMergeDestination As WdMailMergeDestination
Dim oMMMD As Word.Document
On Error GoTo finish
Set oMMMD = ActiveDocument
With oMMMD.MailMerge
If .MainDocumentType = wdNotAMergeDocument Then
MsgBox "This document is not a mail merge main document"
Else
' Save merge type
vMergeType = .MainDocumentType
' v1.1 don't need this line any more
' vMergeDestination = .Destination
sMergeDataSourceName = .DataSource.Name
.MainDocumentType = wdNotAMergeDocument
Set oFileSystemObject = CreateObject("Scripting.FileSystemObject")
With oFileSystemObject
' This assumes the file is Unicode format (I think)
Set oSourceStream = .OpenTextFile( _
FileName:=sMergeDataSourceName, _
IOMode:=ForReading, _
Create:=False, _
Format:=TristateTrue)
' Verify that the required string exists before going any further
sHeaderRecord = oSourceStream.ReadLine
If InStr(1, sHeaderRecord, "ZIP/Postal Code") = 0 Then
MsgBox "Could not find the field name 'ZIP/Postal Code'" & _
"in the merge data source." & _
vbCrLf & "You will need to match fields manually"
oSourceStream.Close
Set oSourceStream = Nothing
Else
' create the output file
Set oDestStream = .CreateTextFile( _
FileName:=sMergeDataSourceName + ".tmp", _
overwrite:=True, _
unicode:=True)
' Make the substitution. The field names "ZIP" and "Postcode"
' seem to be recognised automatically by Word
oDestStream.WriteLine _
Text:=Replace(sHeaderRecord, "ZIP/Postal Code", "ZIP")
' copy the rest of the file
Do Until oSourceStream.AtEndOfStream
oDestStream.WriteLine Text:=oSourceStream.ReadLine
Loop
' Close everything and replace the old file by the new one
oDestStream.Close
Set oDestStream = Nothing
oSourceStream.Close
Set oSourceStream = Nothing
oFileSystemObject.DeleteFile _
filespec:=sMergeDataSourceName, _
force:=True
oFileSystemObject.MoveFile _
Source:=sMergeDataSourceName + ".tmp", _
Destination:=sMergeDataSourceName
End If
End With
Set oFileSystemObject = Nothing
End If
' Set up the mail merge data source etc. again
' You may find that you need to save and restore
' other settings
.OpenDataSource Name:=sMergeDataSourceName
.MainDocumentType = vMergeType
' v1.1 don't restore the original destination,
' just make it a newdocument
' .Destination = vMergeDestination
.Destination = wdSendToNewDocument
With .DataSource
.FirstRecord = wdDefaultFirstRecord
.LastRecord = wdDefaultLastRecord
End With
.Execute Pause:=False
End With
oMMMD.Close SaveChanges:=False
Set oMMMD = Nothing
Exit Sub
Exit Sub
finish:
Close #1
MsgBox "Error " & Err.Number & _
" when trying to modify the ZIP field name: " & _
vbCrLf & Err.Description
Err.Clear
On Error Resume Next
Set oSourceStream = Nothing
Set oDestStream = Nothing
Set oFileSystemObject = Nothing
Set oMMMD = Nothing
End Sub
--
Peter Jamieson
Bob S said:
Thanks Peter. That is much clearer. I have made the changes as you
described them. I just have one question.
Below you seem to suggest putting
oMMMD.Close SaveChanges:=False
Set oMMMD = Nothing
between
End With
anf
Exit Sub
finish:
Close #1
Ok, but in your initial code you had a line between there already. It was
.Execute Pause:=False
such that it looked like the following.
End With
.Execute Pause:=False
Exit Sub
finish:
Close #1
Do I need that line? If so, where in relation to this statement of
"Execute: Pause=False" do I put these two lines?
oMMMD.Close SaveChanges:=False
Set oMMMD = Nothing
Thank you Peter.
<snip>