Avatar of cErasmus
cErasmus
Flag for Namibia 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.
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

Open in new window


Thanks in advance
Elmo
VBAMicrosoft WordMicrosoft OfficeMicrosoft Excel

Avatar of undefined
Last Comment
cErasmus

8/22/2022 - Mon
cErasmus

ASKER
Hi I have now tested using the Preserve formatting checkbox and it also does not do what i need.
SOLUTION
Rgonzo1971

THIS SOLUTION ONLY AVAILABLE TO MEMBERS.
View this solution by signing up for a free trial.
Members can start a 7-Day free trial and enjoy unlimited access to the platform.
See Pricing Options
Start Free Trial
GET A PERSONALIZED SOLUTION
Ask your own question & get feedback from real experts
Find out why thousands trust the EE community with their toughest problems.
cErasmus

ASKER
Hi Rgonzo1971
How would i implement it in my code?
cErasmus

ASKER
Hi
I have now gone and in the Excel wb rounded all the values to 2 decimal points in another range i then copied and pasted the values to the range that i use for the mail merge and i still end up with odd numbers as per the attached image. Any ideas on why this happens?
 Capture.PNG
Experts Exchange is like having an extremely knowledgeable team sitting and waiting for your call. Couldn't do my job half as well as I do without it!
James Murphy
GrahamSkan

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.
Rgonzo1971

the fields in word have to be changed
GrahamSkan

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.
⚡ FREE TRIAL OFFER
Try out a week of full access for free.
Find out why thousands trust the EE community with their toughest problems.
cErasmus

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
GrahamSkan

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.
GrahamSkan

Cross posted. Will do.
Your help has saved me hundreds of hours of internet surfing.
fblack61
SOLUTION
Shums Faruk

THIS SOLUTION ONLY AVAILABLE TO MEMBERS.
View this solution by signing up for a free trial.
Members can start a 7-Day free trial and enjoy unlimited access to the platform.
See Pricing Options
Start Free Trial
⚡ FREE TRIAL OFFER
Try out a week of full access for free.
Find out why thousands trust the EE community with their toughest problems.
Shums Faruk

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 }

Open in new window

ASKER CERTIFIED SOLUTION
GrahamSkan

THIS SOLUTION ONLY AVAILABLE TO MEMBERS.
View this solution by signing up for a free trial.
Members can start a 7-Day free trial and enjoy unlimited access to the platform.
See Pricing Options
Start Free Trial
⚡ FREE TRIAL OFFER
Try out a week of full access for free.
Find out why thousands trust the EE community with their toughest problems.
cErasmus

ASKER
Thanks all i have it working now. I will close the question in a bit and add how i did it
cErasmus

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%"
⚡ FREE TRIAL OFFER
Try out a week of full access for free.
Find out why thousands trust the EE community with their toughest problems.
cErasmus

ASKER
Ok it seems the easy way around this is just to multiply by 100.
Shums Faruk

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%
cErasmus

ASKER
Below is the code that i used.
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

Open in new window

Rebate.JPGI 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
I started with Experts Exchange in 2004 and it's been a mainstay of my professional computing life since. It helped me launch a career as a programmer / Oracle data analyst
William Peck