How to Find & ReplaceAll on a batch of documents in the same folder

Article contributed by Ibby

The following code, if stored in a Global template, will perform a Find & ReplaceAll in all of the documents in a specified folder. The FindReplace dialog is displayed for the first document only. The user sets the parameters in the dialog and presses Replace All and then Close. The user is then asked whether to process all of the files in the specified directory – if Yes, the rest of the files are processed with the settings as entered in the original FindReplace dialog.

Option Explicit

Public Sub BatchReplaceAll()

Dim FirstLoop As Boolean
Dim
myFile As String
Dim PathToUse As String
Dim myDoc As Document
Dim Response As Long

PathToUse = "C:\Test\"

'Error handler to handle error generated whenever
'the FindReplace dialog is closed

On Error Resume Next

'Close all open documents before beginning

Documents.Close SaveChanges:=wdPromptToSaveChanges

'Boolean expression to test whether first loop
'This is used so that the FindReplace dialog will
'only be displayed for the first document

FirstLoop = True

'Set the directory and type of file to batch process

myFile = Dir$(PathToUse & "*.doc")

While myFile <> ""

    'Open document
    Set myDoc = Documents.Open(PathToUse & myFile)

    If FirstLoop Then

        'Display dialog on first loop only

        Dialogs(wdDialogEditReplace).Show

        FirstLoop = False

        Response = MsgBox("Do you want to process " & _
        "the rest of the files in this folder", vbYesNo)
        If Response = vbNo Then Exit Sub

    Else

        'On subsequent loops (files), a ReplaceAll is
        'executed with the original settings and without
        'displaying the dialog box again

        With Dialogs(wdDialogEditReplace)
            .ReplaceAll = 1
            .Execute
        End With

    End If

    'Close the modified document after saving changes

    myDoc.Close SaveChanges:=wdSaveChanges

    'Next file in folder

    myFile = Dir$()

Wend

End Sub

If there is a posibility that some files might be password protected, see also: Skipping Password-Protected Documents in a Batch Process.

If you want to perform the Find & ReplaceAll in all subfolders as well, use the FileSearch object instead of Dir.  Dir is significantly faster than FileSearch when searching a single directory – and it's also simpler to code; but when searching all subdirectories as well, it's simplest to use  FileSearch, e.g.:

Option Explicit

Public Sub BatchReplaceAll()

Dim FirstLoop As Boolean
Dim
myFile As String
Dim
PathToUse As String
Dim myDoc As Document
Dim
Response As Long
Dim
i As Long

PathToUse = "C:\Test\"

'Error handler to handle error generated whenever
'the FindReplace dialog is closed

On Error Resume Next

'Close all open documents before beginning

Documents.Close SaveChanges:=wdPromptToSaveChanges

'Boolean expression to test whether first loop
'This is used so that the FindReplace dialog will
'only be displayed for the first document

FirstLoop = True

'Set the directory and type of file to batch process

With Application.FileSearch
   .NewSearch
   .LookIn = PathToUse
   .SearchSubFolders = True
   .FileName = "*.doc"
   .MatchTextExactly = True
   .FileType = msoFileTypeAllFiles

    If .Execute() Then

        For i = 1 To .FoundFiles.Count

            'Open document
            Set myDoc = Documents.Open(.FoundFiles(i))

            If FirstLoop Then

                'display dialog on first loop only

                Dialogs(wdDialogEditReplace).Show

                FirstLoop = False

                Response = MsgBox("Do you want to process " & _
                "the rest of the files in this folder", vbYesNo)
                If Response = vbNo Then Exit Sub

            Else

                'On subsequent loops (files), a ReplaceAll is
                'executed with the original settings and without
                'displaying the dialog box again


                With Dialogs(wdDialogEditReplace)
                    .ReplaceAll = 1
                    .Execute
                End With

            End If

            'Close the modified document after saving changes
            myDoc.Close SaveChanges:=wdSaveChanges

        Next i

    End If

End With

End Sub