Home > Net >  Replace prefaced text with matching Mail Merge Field
Replace prefaced text with matching Mail Merge Field

Time:03-24

I have a series of report migrations I am trying to do and am looking for a method to make it a little easier. I will be copying a lot of fields from Crystal ({command.somename}) over to Word. What I would like to do is then replace Command.somename into a Mergefield somename, where the name is the dynamic variable. I am new to VBA and I have read a similar item to change a specifc word, but am not sure what to alter to have that word search be dynamic for the word after "Command." Example change command.srent to a mergefield { mergefield srent } (<<srent>>).

Any help would be appreciated. I'm starting into this so haven't honestly done a lot of research

Any help would be appreciated. I'm starting into this so haven't honestly done a lot of research.

CodePudding user response:

For example:

Sub Demo()
Application.ScreenUpdating = False
Dim StrFld As String
With ActiveDocument.Range
  With .Find
    .ClearFormatting
    .Replacement.ClearFormatting
    .Text = "\{*\}"
    .Replacement.Text = ""
    .Forward = True
    .Wrap = wdFindStop
    .Format = False
    .MatchWildcards = True
  End With
  Do While .Find.Execute
    StrFld = "MERGEFIELD " & Replace(Replace(.Text, "{command.", ""), "}", "")
    .Text = vbNullString
    .Fields.Add Range:=.Duplicate, Type:=wdFieldEmpty, Text:=StrFld, Preserveformatting:=False
    .Collapse wdCollapseEnd
  Loop
End With
Application.ScreenUpdating = True
End Sub

CodePudding user response:

I was able to solve the issue with the use of .Words.Parent. The issue with the suggested code was that it was returning the search .Text not the found word within the search text. Then iterating through each instance with variable i I was able to isolate each found word within the found range and replace that word with a {mergefield }. Once done a quick F9 in Word and it updated all the new mergefields. Thanks for the help and direction @macropod is was very helpful

Sub ReplaceCommandtoMergefield()
Application.ScreenUpdating = False
Dim StrFld As String
With ActiveDocument.Range
  With .Find
    .ClearFormatting
    .Replacement.ClearFormatting
    .Text = "Command\."
    .Replacement.Text = ""
    .Forward = True
    .Wrap = wdFindStop
    .Format = False
    .MatchWildcards = True
  End With
  Do While .Find.Execute
   'MsgBox .Words.Parent
    StrFld = Replace(.Words.Parent, "Command.", "")
    .Words.Parent.Delete
    .Fields.Add Range:=.Duplicate, Type:=wdFieldMergeField, Text:=StrFld, Preserveformatting:=True
    .Text = vbNullString
    .Collapse wdCollapseEnd
  Loop
End With
    Application.ScreenUpdating = True
End Sub
  • Related