MS Word Macro for Search and Replace
Here is a MS Word macro that worked well for search/replace function with confirmation for each change in all sections of MS Word document including headers, footers, EndNote, and Footnote, etc. in MS Word 2013, 2016, and 2019 using list of words in MS Word document in a table format. Make sure to copy and paste entire macro to avoid any typing error.
Sub SearchReplace_AllSections()
' *****************************************************************************************
' Modified by Wajeeh Bajwa (June 1, 2016) based on two macros given below and changes suggested by
' Doug Robbins - Word MVP on May 31, 2016 at:
' http://answers.microsoft.com/en-us/office/forum/office_2010-word/word-20...
'
' This macro is a combination of two macros:
' Macro 1 written by Graham Mayor, Aug 2010: http://www.word.mvps.org/FAQs/MacrosVBA/FindReplaceAllWithVBA.htm
' Macro 2 written by Rhonda (March 28, 2015): https://cybertext.wordpress.com/2015/03/03/word-macro-to-run-multiple-wi...
' ******************************************************************************************
Dim oChanges As Document, oDoc As Document
Dim myStoryRange As Range
Dim oTable As Table
Dim oRng As Range
Dim rFindText As Range, rReplacement As Range
Dim i As Long
Dim sFname As String
'Change the path in the line below to reflect the name and path of the document that contains list of original text and replacement text in a table
sFname = "C:\Add_Spaical_Characters.docx"
Set oDoc = ActiveDocument
Set oChanges = Documents.Open(FileName:=sFname, Visible:=False)
Set oTable = oChanges.Tables(1)
For i = 1 To oTable.Rows.Count
Set oRng = oDoc.Range
Set rFindText = oTable.Cell(i, 1).Range
rFindText.End = rFindText.End - 1
Set rReplacement = oTable.Cell(i, 2).Range
rReplacement.End = rReplacement.End - 1
Selection.HomeKey wdStory
'First search the main document using the Selection
With Selection.Find
.Text = rFindText
.Replacement.Text = rReplacement
.Forward = True
.Wrap = wdFindContinue
.Format = False
.MatchCase = False
.MatchWholeWord = False
.MatchWildcards = False
.MatchSoundsLike = False
.MatchAllWordForms = False
With oRng.Find
.ClearFormatting
.Replacement.ClearFormatting
Do While .Execute(findText:=rFindText, _
MatchWholeWord:=True, _
MatchWildcards:=False, _
Forward:=True, _
Wrap:=wdFindStop) = True
oRng.Select
sAsk = MsgBox("Replace: " & vbCr & oRng & vbCr + vbCr & _
"with: " & vbCr & rReplacement, vbYesNo + vbQuestion, _
"Replace from Table")
If sAsk = vbYes Then
oRng = rReplacement
End If
oRng.Collapse wdCollapseEnd
Loop
End With
End With
'Now search all other stories using Ranges
For Each myStoryRange In ActiveDocument.StoryRanges
If myStoryRange.StoryType <> wdMainTextStory Then
With myStoryRange.Find
.Text = rFindText
.Replacement.Text = rReplacement
.Wrap = wdFindContinue
With myStoryRange.Find
.ClearFormatting
.Replacement.ClearFormatting
Do While .Execute(findText:=rFindText, _
MatchWholeWord:=True, _
MatchWildcards:=False, _
Forward:=True, _
Wrap:=wdFindStop) = True
'Changed to myStoryRange.Select from oRng.Select on the next line
myStoryRange.Select
sAsk = MsgBox("Replace: " & vbCr & myStoryRange & vbCr + vbCr & _
"with: " & vbCr & rReplacement, vbYesNo + vbQuestion, _
"Replace from Table")
If sAsk = vbYes Then
myStoryRange = rReplacement
End If
myStoryRange.Collapse wdCollapseEnd
Loop
End With
End With
Do While Not (myStoryRange.NextStoryRange Is Nothing)
Set myStoryRange = myStoryRange.NextStoryRange
With myStoryRange.Find
.Text = rFindText
.Replacement.Text = rReplacement
.Wrap = wdFindContinue
With myStoryRange.Find
.ClearFormatting
.Replacement.ClearFormatting
Do While .Execute(findText:=rFindText, _
MatchWholeWord:=True, _
MatchWildcards:=False, _
Forward:=True, _
Wrap:=wdFindStop) = True
myStoryRange.Select
sAsk = MsgBox("Replace: " & vbCr & myStoryRange & vbCr + vbCr & _
"with: " & vbCr & rReplacement, vbYesNo + vbQuestion, _
"Replace from Table")
If sAsk = vbYes Then
myStoryRange = rReplacement
End If
myStoryRange.Collapse wdCollapseEnd
Loop
End With
End With
Loop
End If
Next myStoryRange
Next i
oChanges.Close wdDoNotSaveChanges
ActiveWindow.View = wdPrintView
Selection.HomeKey wdStory
MsgBox "All requested changes have been made!" & Chr(13) & Chr(13) & "Macro v1.00 to add special characters created" & Chr(13) & "by Dr. Wajeeh Bajwa, Jacksonville, FL", vbOKOnly, "Macro Completed"
End Sub