You can use your favorite social network to register or link an existing account:
Or use your email address to register without a social network:
Sign in with these social networks:
Or enter your username and password
Forgot your password?
Yes, please link my existing account with for quick, secure access.
No, I would like to create a new account with my profile information.
Edit: Fixed up the unnecessary line breaks that appeared post-publish.
There are many of you out there who have used mail merge to get data into Word documents in the past (and it continues to be a great way to create mailings), but one of the questions we've been asked a few times already by customers is how to take templates with mail merge fields and convert them into content controls (so you can create templates leveraging the XML support that I've been blogging about).
Thanks to a co-worker here at Microsoft (Thanks Lethanial!), we've developed some simple VBA code that does this conversion for you – enjoy!
Private Sub Document_Open()
If (MsgBox("Convert Mail Merge fields to Content Controls?", vbYesNo, "Convert Mail Merge Fields") = vbYes) Then
ConvertMailMergeFields
End If
End Sub
'** Traverse Mail Merge fields collection and convert each mail merge field into a content control '** while preserving its font style and format.Private Sub ConvertMailMergeFields()
'** Traverse Mail Merge fields collection and convert each mail merge field into a content control
'** while preserving its font style and format.
Private Sub ConvertMailMergeFields()
Dim i As Integer, Count As Integer Dim currentFont As Font Dim mergeFieldname As String Dim field As MailMergeField
Dim i As Integer, Count As Integer
Dim currentFont As Font
Dim mergeFieldname As String
Dim field As MailMergeField
For Each field In ActiveDocument.MailMerge.Fields
'** Select Mail Merge field to process. field.Select Set currentFont = Selection.Font
'** Select Mail Merge field to process.
field.Select
Set currentFont = Selection.Font
'** Set name for content control. mergeFieldname = GetMailMergeFieldName(field.Code) Debug.Print ("Processing [" & mergeFieldname & "]")
'** Set name for content control.
mergeFieldname = GetMailMergeFieldName(field.Code)
Debug.Print ("Processing [" & mergeFieldname & "]")
'** Remove Mail Merge field and replace it with addition of new content control. Selection.Cut
'** Remove Mail Merge field and replace it with addition of new content control.
Selection.Cut
'** Add new content control. AddContentControl mergeFieldname, currentFont Count = Count + 1
'** Add new content control.
AddContentControl mergeFieldname, currentFont
Count = Count + 1
Next
Debug.Print ("Number of Mail Merge Fields converted to Content Controls: " & Count)
'** Add new content control.Private Sub AddContentControl(ByVal mergeFieldname As String, ByVal currentFont As Font)
Private Sub AddContentControl(ByVal mergeFieldname As String, ByVal currentFont As Font)
Dim newControl As ContentControl Dim fontStyleName As String
Dim newControl As ContentControl
Dim fontStyleName As String
Set newControl = ActiveDocument.ContentControls.Add(wdContentControlText)
'** The Title property only allows for 64 characters. '** If name is longer, we will put the rest in the Tag property. If (Len(mergeFieldname) < 64) Then
'** The Title property only allows for 64 characters.
'** If name is longer, we will put the rest in the Tag property.
If (Len(mergeFieldname) < 64) Then
newControl.Title = mergeFieldname newControl.Tag = ""
newControl.Title = mergeFieldname
newControl.Tag = ""
Else
newControl.Title = Mid(mergeFieldname, 1, 64) newControl.Tag = Mid(mergeFieldname, 65, Len(mergeFieldname) - 64)
newControl.Title = Mid(mergeFieldname, 1, 64)
newControl.Tag = Mid(mergeFieldname, 65, Len(mergeFieldname) - 64)
newControl.SetPlaceholderText , , "Click to add."
'** Set font for content control. fontStyleName = GetFontStyleName(currentFont) SetFontStyle newControl, fontStyleName, currentFont
'** Set font for content control.
fontStyleName = GetFontStyleName(currentFont)
SetFontStyle newControl, fontStyleName, currentFont
'** Allow carriage return. newControl.MultiLine = True
'** Allow carriage return.
newControl.MultiLine = True
'** Quick and dirty way to check to see if the given font style exist; if it does not, create it.Private Sub SetFontStyle(ByRef newControl As ContentControl, ByVal fontStyleName As String, ByVal currentFont As Font)
'** Quick and dirty way to check to see if the given font style exist; if it does not, create it.
Private Sub SetFontStyle(ByRef newControl As ContentControl, ByVal fontStyleName As String, ByVal currentFont As Font)
On Error GoTo Error_FontStyleDoesNotExist
newControl.DefaultTextStyle = fontStyleName
Exit Sub
Error_FontStyleDoesNotExist:
AddNewFontStyle fontStyleName, currentFont newControl.DefaultTextStyle = fontStyleName
AddNewFontStyle fontStyleName, currentFont
Private Sub AddNewFontStyle(ByVal newFontStyleName As String, ByVal currentFont As Font)
Dim fontStyle As Style
Set fontStyle = ActiveDocument.Styles.Add(newFontStyleName)
With currentFont
fontStyle.Font.Name = .Name fontStyle.Font.Size = .Size fontStyle.Font.Bold = .Bold fontStyle.Font.Italic = .Italic
fontStyle.Font.Name = .Name
fontStyle.Font.Size = .Size
fontStyle.Font.Bold = .Bold
fontStyle.Font.Italic = .Italic
End With
Private Function GetFontStyleName(ByVal currentFont As Font) As String
fontStyleName = .Name fontStyleName = fontStyleName & .Size fontStyleName = fontStyleName & .Bold fontStyleName = fontStyleName & .Italic
fontStyleName = .Name
fontStyleName = fontStyleName & .Size
fontStyleName = fontStyleName & .Bold
fontStyleName = fontStyleName & .Italic
'** Return result. GetFontStyleName = fontStyleName
'** Return result.
GetFontStyleName = fontStyleName
End Function
Private Function GetMailMergeFieldName(ByVal fieldCode As String) As String
Dim mergeFieldname As String: mergeFieldname = ""
Dim mergeFieldname As String:
mergeFieldname = ""
'** Name of Mail merge field: MERGEFIELD MailMergeFieldName \* MERGEFORMAT mergeFieldname = Replace(fieldCode, "MERGEFIELD", "") mergeFieldname = Replace(mergeFieldname, "\* MERGEFORMAT", "") mergeFieldname = Trim(mergeFieldname)
'** Name of Mail merge field: MERGEFIELD MailMergeFieldName \* MERGEFORMAT
mergeFieldname = Replace(fieldCode, "MERGEFIELD", "")
mergeFieldname = Replace(mergeFieldname, "\* MERGEFORMAT", "")
mergeFieldname = Trim(mergeFieldname)
'** Return result. GetMailMergeFieldName = mergeFieldname
GetMailMergeFieldName = mergeFieldname
- Tristan
Comments: (1) Collapse
Hey, Tristan,
That looks cool. But how about this problem: How would I (preferably without code) convert content controls to text? Why? Well suppose I have a final document that I want to send to a customer. I wouldn't want them to see bound custom control names 'companyshort' or 'clientFirstName' inside my attached document.
Or, it would be cool in an RFP template to have an 'input' page that had all of the controls used in the template. At the point of finalizing the doc, the conversion would take place and then input page would be deleted from the doc.
Thanks!
Chase
Comments: (loading) Collapse