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.ApplicationDim WdDoc As Word.DocumentDim strBookFullName As StringDim cell As RangeDim wdFind As ObjectstrBookFullName = ActiveWorkbook.FullNameSet appWd = CreateObject("Word.Application")appWd.Visible = TrueWith 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 cellEnd WithEnd Sub
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?
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.
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.
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%"
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.ApplicationDim WdDoc As Word.DocumentDim strBookFullName As StringDim cell As RangeDim wdFind As ObjectstrBookFullName = ActiveWorkbook.FullNameSet appWd = CreateObject("Word.Application")appWd.Visible = TrueWith 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 cellEnd WithEnd 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.