vili
vili

Reputation: 319

VBA Word I want to replace one word with this + different words in a cycle

Here is my code, but it doesn't make replace! First I change AnyText to TEMP, after I make a cycle for replace TEMP with elements of Array TargetList, but can't replace TEMP.

Sub First()
'
' First Macro

    Dim i As Long
    i = 0
    Dim j As Long
    Dim myWord As String
    Dim msg As String
    myWord = "TEMP"
    TargetList = Array("AnyText", "NewWord1", "NewWord2", "NewWord3", "NewWord4") 
    For Each myStoryRange In ActiveDocument.StoryRanges
     With myStoryRange.Find
         .Text = "AnyText"
         .Replacement.Text = myWord
         .Wrap = wdFindContinue
         .Execute Replace:=wdReplaceAll
     End With
    Next myStoryRange

     For Each myStoryRange In ActiveDocument.StoryRanges
     With myStoryRange.Find
            Do While .Execute(FindText:=myWord, Forward:=True) _
                = True
                j = j + 1
            Loop
            msg = msg & "The string " & myWord & _
            " found " & j & " times."
        End With
        msg = msg & vbCrLf & vbCrLf
    MsgBox msg

     Next myStoryRange

       For Each myStoryRange In ActiveDocument.StoryRanges
     With myStoryRange.Find
         Do While j > -1
             .Text = "TEMP"
             .Replacement.Text = TargetList(i)
             msg = msg & "The string " & myWord & _
                " j = " & j & " i = " & i & TargetList(i) & " times."
              msg = msg & vbCrLf & vbCrLf
        MsgBox msg

             j = j - 1
             i = i + 1

             If i = 5 Then
                i = 0
             End If

         Loop
         .Wrap = wdFindContinue
         .Execute Replace:=wdReplaceAll
      End With
   Next myStoryRange
End Sub

Upvotes: 1

Views: 2012

Answers (1)

Kevin Pope
Kevin Pope

Reputation: 2982

This code will replace any instances of "AnyText" with "TEMP", then will replace any instances of "TEMP" with the current (count of finds) mod 5:

Sub First()
    Dim i As Long
    i = 0
    Dim myWord As String
    myWord = "TEMP"
    TargetList = Array("AnyText", "NewWord1", "NewWord2", "NewWord3", "NewWord4")
    With ActiveDocument.Content.Find
         .Text = "AnyText"
         .Replacement.Text = myWord
         .Wrap = wdFindContinue
         .Execute Replace:=wdReplaceAll
    End With

    With ActiveDocument.Content.Find
        .Text = "TEMP"
        .Replacement.Text = TargetList(i)
        .Wrap = wdFindContinue
        Do While .Execute(Replace:=wdReplaceOne) = True
            i = i + 1
            If i = 5 Then i = 0
            .Replacement.Text = TargetList(i)
        Loop
    End With
End Sub

Note that this will change all instances of "AnyText" - even if they're part of a larger word (for example "myAnyTextWord" will be changed to "myTEMPWord"). If you only want to search for whole words, add .MatchWholeWord = True to each With block.

Upvotes: 1

Related Questions