Cole Bloodworth
asked on
Macro (Find & Replace) for MS Word
I’ve created a Macro (below) for MS Word that finds / replaces (with highlights) key “red flag” terms in contractual documents. It cross-references a master “checklist” (checklist.doc) against the open document and highlights key terms that may need additional review by the appropriate SME.
However, the “MatchWholeWord” function isn’t correctly working with the “checklist” document. For example:
• The word “lease” is being found in words such as “please” or “release” with only the “lease” portion of the word being highlighted.
• The word “SLA” is being found in words such as “legislate” with only the “sla” porting being highlighted.
• The word “govern” is being found in words such as such as “government” with only the “govern” portion of the word being highlighted.
I’m somewhat knowledgeable about macros but it’s been at least 10 years since I was proficient.
Any idea what might be causing the problem?
Thank you for any guidance!
-------------------------- -------
Edit by GrahamSkan: Code put into a code snippet box.
However, the “MatchWholeWord” function isn’t correctly working with the “checklist” document. For example:
• The word “lease” is being found in words such as “please” or “release” with only the “lease” portion of the word being highlighted.
• The word “SLA” is being found in words such as “legislate” with only the “sla” porting being highlighted.
• The word “govern” is being found in words such as such as “government” with only the “govern” portion of the word being highlighted.
I’m somewhat knowledgeable about macros but it’s been at least 10 years since I was proficient.
Any idea what might be causing the problem?
Thank you for any guidance!
--------------------------
Sub RedFlags()
Dim sCheckDoc As String
Dim docRef As Document
Dim docCurrent As Document
Dim wrdRef As String
Dim wrdPara As Paragraph
sCheckDoc = "c:\checklist.doc"
Set docCurrent = Selection.Document
Set docRef = Documents.Open(sCheckDoc)
docCurrent.Activate
Options.DefaultHighlightColorIndex = wdRed
Selection.Find.ClearFormatting
Selection.Find.Replacement.ClearFormatting
Selection.Find.Replacement.Highlight = True
With Selection.Find
.ClearFormatting
.Replacement.ClearFormatting
.Replacement.Highlight = True
.Replacement.Text = "^&"
.Forward = True
.Format = True
.MatchWholeWord = True
.MatchCase = False
.MatchWildcards = False
End With
For Each wrdPara In docRef.Paragraphs
wrdRef = wrdPara.Range.Text
If Asc(Left(wrdRef, 1)) > 32 Then
' remove the paragraph mark:
wrdRef = Left(wrdRef, Len(wrdRef) - 1)
With Selection.Find
.Wrap = wdFindContinue
.Text = wrdRef
.Execute Replace:=wdReplaceAll
End With
End If
Next wrdPara
docRef.Close
docCurrent.Activate
End Sub
Edit by GrahamSkan: Code put into a code snippet box.
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
For debugging, it could be helpful to use the Debug.Print statement to show the search term.
First save it to a variable, then
Debug.Print strSearch
Debug.Print strSearch
Sorry, I was referring to the first Selection.Find.
It is hard to consider the second part, because it isn't clear what the range of the Selection object now is.
It is hard to consider the second part, because it isn't clear what the range of the Selection object now is.
Helen,
I think the questioner is trying to discount empty paragraphs with that construct, but I could be wrong.
I think the questioner is trying to discount empty paragraphs with that construct, but I could be wrong.
I think the intention was to strip out the paragraph mark from the word or phrase used for searching -- but in fact the last character of the string is removed. I think the source doc would work better if it was a table, with each search word or phrase in its own cell, so no paragraph marks would be there in the first place. Then just select the cell contents and save to a variable for use in searching.
ASKER
Helen - Thank you for the feedback on the paragraph mark and about using tables as an alternative approach to removing paragraph marks.
ASKER
Graham - Thank you for the feedback about using a Range object. I'll certainly give it a try.