Link to home
Start Free TrialLog in
Avatar of Elmo Erasmus
Elmo ErasmusFlag 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
Avatar of Elmo Erasmus
Elmo Erasmus
Flag of Namibia image

ASKER

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

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
Hi Rgonzo1971
How would i implement it in my code?
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?
 User generated image
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.
Avatar of Rgonzo1971
Rgonzo1971

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.
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
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
Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
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
Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
Thanks all i have it working now. I will close the question in a bit and add how i did it
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%"
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%
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

User generated imageI 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