bblave
bblave

Reputation: 1

Word 2016/VBA Highlight first use of each word from a word list

I am working on a macro for Word that accesses a separately saved doc file with a long word list of several pages. The word list doc is formatted like,

FMS

CPR

Abc

...to separate each word by the line break.

The macro needs to highlight the first use of each word from the list.

Right now, the macro highlights every use of the word, and in addition, highlights that word when it's part of another word. For example, it highlights EZE in the word freeze, but it should only highlight when eze stands alone.

Can someone help with how to, 1. highlight first-use only, and 2. how to make sure it's only catching the actual word, not all the other words that contain that word? I can't seem to make that happen with VBA. My current code:

  Sub TD()
  '
  Dim sCheckDoc As String
  Dim docRef As Document
  Dim docCurrent As Document
  Dim wrdRef As String
  Dim wrdPara As Paragraph

  sCheckDoc = "c:\check.docx"
  Set docCurrent = Selection.Document
  Set docRef = Documents.Open(sCheckDoc)
  docCurrent.Activate

  With Selection.Find
  .ClearFormatting
  .Replacement.ClearFormatting
  .Replacement.Highlight = True
  .Replacement.Text = "^&"
  .Forward = True
  .Format = True
  .MatchWholeWord = True
  .MatchCase = False
  .MatchWildcards = False
  .MatchSoundsLike = False
  .MatchAllWordForms = 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 

Upvotes: 0

Views: 179

Answers (1)

June7
June7

Reputation: 21370

Try wdReplaceOne instead wdReplaceAll.

.MatchWholeWord = True should prevent highlighting embedded strings but it seems to be ignored.

I tested your original code in module behind ThisDocument and it highlighted all instances of only the last string from check document, ignoring the MatchWholeWord parameter. After the suggested edit, the code highlighted first instance of only the last string from check document. Now I can't get the procedure to work. It runs but words do not highlight. I've never used VBA behind Word. Hope this change works for you.

Upvotes: 0

Related Questions