Elmo Erasmus
asked on
Preserve formatting during mail merge using VBA
Hi All
I have created a Word document and Excel workbook to do a mail merge. The word document contains bookmarks to indicate where merged fields should be added. All the work from creating the connection to adding the merge fields happens in a macro in the Excel workbook. Everything works fine. The only problem that i'm having is that formatting is not carried over into the Word document form the Excel workbook. For example in the Excel wb a field might be a currency field with 2 decimal places when it is taken to the word document it does not retain this formatting and instead of $12.30 i end up with 12.3012943. I do not mind so much about the "$" signs as i can easily add this to the Word document the decimal places is the real issue. I have seen that when you add a field manually in a Word document and right click and Edit it there is a check box to Preserve formatting but i cannot find how to this with VBA. I have also tried to record a macro doing this but Word does not allow me to right click while recording. I have added the code i use below.
Thanks in advance
Elmo
I have created a Word document and Excel workbook to do a mail merge. The word document contains bookmarks to indicate where merged fields should be added. All the work from creating the connection to adding the merge fields happens in a macro in the Excel workbook. Everything works fine. The only problem that i'm having is that formatting is not carried over into the Word document form the Excel workbook. For example in the Excel wb a field might be a currency field with 2 decimal places when it is taken to the word document it does not retain this formatting and instead of $12.30 i end up with 12.3012943. I do not mind so much about the "$" signs as i can easily add this to the Word document the decimal places is the real issue. I have seen that when you add a field manually in a Word document and right click and Edit it there is a check box to Preserve formatting but i cannot find how to this with VBA. I have also tried to record a macro doing this but Word does not allow me to right click while recording. I have added the code i use below.
Sub DoMerge()
Dim appWd As Word.Application
Dim WdDoc As Word.Document
Dim strBookFullName As String
Dim cell As Range
Dim wdFind As Object
strBookFullName = ActiveWorkbook.FullName
Set appWd = CreateObject("Word.Application")
appWd.Visible = True
With appWd
Set WdDoc = appWd.Documents.Open("C:\Users\Elmo\Documents\Aaron\2nd Project 2017\WorkingOn\VendorRebateClientDoc4March17_2.docx")
WdDoc.Activate
WdDoc.MailMerge.OpenDataSource Name:=(strBookFullName), _
ReadOnly:=True, LinkToSource:=0, AddToRecentFiles:=False, _
PasswordDocument:="", PasswordTemplate:="", WritePasswordDocument:="", _
WritePasswordTemplate:="", Revert:=False, Format:=wdOpenFormatAuto, _
Connection:="", SQLStatement:="SELECT * FROM `MergeRange`", SQLStatement1:=""
Set wdFind = appWd.Selection.Find
'finds text in word doc and replace with merge field
For Each cell In Range("MergeText")
wdFind.Text = cell.Value
Dim MyDoc As String, txt As String, t As String
MyDoc = WdDoc.Range.Text
txt = cell.Offset(0, 1).Value
t = Replace(MyDoc, txt, "")
X = (Len(MyDoc) - Len(t)) / Len(txt)
'ActiveDocument.Bookmarks("Cname").Select
ActiveDocument.MailMerge.Fields.Add Range:=WdDoc.Bookmarks(cell.Offset(0, 2).Value).Range, Name:=txt
Next cell
End With
End Sub
Thanks in advance
Elmo
SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
Hi Rgonzo1971
How would i implement it in my code?
How would i implement it in my code?
ASKER
The 'Preserve formatting' checkbox ensures that the \* MERGEFORMAT switch is added to the field code. This tells the merge to copy the Font format from the merge field itself.
The modern default data transfer method is OLE DB. This works on the data alone. It ignores the display format that is set in the data source application. The original transfer method was DDE, which does take account of that display format . The method can be changed in the dialogue that opens when the merge is started if the Word option 'Confirm file format conversion on open' is set. It is not to be recommended. Rather use rgonzo's solution, unless you have many fields to change.
The modern default data transfer method is OLE DB. This works on the data alone. It ignores the display format that is set in the data source application. The original transfer method was DDE, which does take account of that display format . The method can be changed in the dialogue that opens when the merge is started if the Word option 'Confirm file format conversion on open' is set. It is not to be recommended. Rather use rgonzo's solution, unless you have many fields to change.
the fields in word have to be changed
It would be possible to add the switch in VBA, but it is far easier to do it in the Merge Main document.
The VBA code would need to be told somehow which merge fields need to have the switch added.
The VBA code would need to be told somehow which merge fields need to have the switch added.
ASKER
Graham could you perhaps give me an example of how the switch will be added in VBA?
The purpose of this is that a client will use the Excel wb and Word doc as a template to do create documents so this means that everything needs to happen with the click of a button.
Elmo
The purpose of this is that a client will use the Excel wb and Word doc as a template to do create documents so this means that everything needs to happen with the click of a button.
Elmo
Note, to see and edit the actual code for all the fields in a document, use the Alt+F9 shortcut. It is a toggle so can be used to hide the codes again when editing is finished.
Cross posted. Will do.
SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
When setting up the mail merge, use Alt + F9 to reveal the Mail Merge codes. The address field will look something like this.
{ MERGEFIELD Address }
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
Thanks all i have it working now. I will close the question in a bit and add how i did it
ASKER
Sorry one last question. In the Excel wb i have 3% and 4.2% what would the switch look to get this? I'm getting 0.03% and 0.04% this is what i used \#"0.00%"
ASKER
Ok it seems the easy way around this is just to multiply by 100.
In Excel if cell is formatted as percentage, then multiply by 1.
Suppose you are getting 0.03 % where cell is formatted as percentage then =0.03*1, it should display 3%
Suppose you are getting 0.03 % where cell is formatted as percentage then =0.03*1, it should display 3%
ASKER
Below is the code that i used.
Once again thank you very much for the help
Sub DoMerge()
Dim appWd As Word.Application
Dim WdDoc As Word.Document
Dim strBookFullName As String
Dim cell As Range
Dim wdFind As Object
strBookFullName = ActiveWorkbook.FullName
Set appWd = CreateObject("Word.Application")
appWd.Visible = True
With appWd
Set WdDoc = appWd.Documents.Open("C:\Users\Elmo\Documents\Aaron\2nd Project 2017\WorkingOn\VendorRebateClientDoc4March17_2.docx")
WdDoc.Activate
WdDoc.MailMerge.OpenDataSource Name:=(strBookFullName), _
ReadOnly:=True, LinkToSource:=0, AddToRecentFiles:=False, _
PasswordDocument:="", PasswordTemplate:="", WritePasswordDocument:="", _
WritePasswordTemplate:="", Revert:=False, Format:=wdOpenFormatAuto, _
Connection:="", SQLStatement:="SELECT * FROM `MergeRange`", SQLStatement1:=""
Set wdFind = appWd.Selection.Find
'finds text in word doc and replace with merge field
For Each cell In Range("MergeText")
wdFind.Text = cell.Value
Dim MyDoc As String, txt As String, t As String
MyDoc = WdDoc.Range.Text
txt = cell.Offset(0, 1).Value
ActiveDocument.MailMerge.Fields.Add Range:=WdDoc.Bookmarks(cell.Offset(0, 2).Value).Range, Name:=txt & cell.Offset(0, 3).Value
Next cell
End With
End Sub
I added the above to a hidden sheet Col F is the range MergeText and does not really do much G is the merged field to be inserted H is the bookmark in the word document and I is the format switch.Once again thank you very much for the help
ASKER