An undefined category at the end of the document is an edge case I didn't consider.
But there is also a serendipitous error.
Loop Until InStr(myKeyTerms, mySecondRange)
should actually be
Loop Until InStr(myKeyTerms, mySecondRange.Text)
BUT the default property fpr the range object is text therefore the two statements above are syntactivally the same (you don't need to use the default property name to get the value).
That leaves an issue as its not possible now to use range.text a the loop terminator is the range can be nothing.
To get around this we need to move the tests for ending the loop inside the do loop so we can do each test separately and then use a separate boolean variable as a flag to end the loop.
We also need to handle the case of mySecondRange = nothing to ensure that the outer do loop ends correctly, hence the addition of the if statements after the end of the innder loop.
Here is the revised code, it just replaces the sbSearchRowsForBold code given above.
Code:
Sub sbSearchRowsForBold()
' Consolidate into a single string so we can search using instring to checkif the found text is a Key Term
' If Selection.Find.Text = "Organization" Or Selection.Find.Text = "Date" Or Selection.Find.Text = "Description" Or Selection.Find.Text = "Aerospace, Space & Defence" Or Selection.Find.Text = "Automotive" Or Selection.Find.Text = "Manufacturing" Or Selection.Find.Text = "Life Sciences" Or Selection.Find.Text = "Information Communication Technologies / Digital" Or "Natural Resources / Energy" Or Selection.Find.Text = "Regional Stakeholders" Or Selection.Find.Text = "Other Policy Priorities" Then
' Some of the text entries include ',' so + is used as a seperator
Const myKeyTerms As String = _
"OrganizationDate+Description+Aerospace, Space & Defence+Automotive+Manufacturing+Life Sciences+Information Communication Technologies / Digital+Natural Resources / Energy+Regional Stakeholders+Other Policy Priorities"
Dim myTable As Table
Dim myFirstRange As Range
Dim mySecondRange As Range
Dim myRemoveRange As Range
Dim SecondRangeFlag As Boolean
For Each myTable In ActiveDocument.Tables
Set myFirstRange = Nothing
SecondRangeFlag = False
Do
If myFirstRange Is Nothing Then
Set myFirstRange = fnFindBold(mySearchRange:=myTable.Range.Rows(1).Range)
Else
Set myFirstRange = fnFindBold(mySearchRange:=myFirstRange.Next(unit:=wdRow))
End If
' two possible cases for myFirstrange
' 1. a found range
' 2. nothing - which means we have searched the whole table.
If Not myFirstRange Is Nothing Then
If InStr(myKeyTerms, myFirstRange.Text) = 0 Then
' Found bold text that is not a defined category (key term)
Set mySecondRange = myFirstRange.Duplicate
Do
Set mySecondRange = fnFindBold(mySecondRange.Next(unit:=wdRow))
If mySecondRange Is Nothing Then
SecondRangeFlag = True
Else
If InStr(myKeyTerms, mySecondRange.Text) > 0 Then
SecondRangeFlag = True
End If
End If
Loop Until SecondRangeFlag
'We have now found text that is a defined category key term
Set myRemoveRange = myFirstRange.Duplicate
If mySecondRange Is Nothing Then
myRemoveRange.End = myTable.Range.End
Set myFirstRange = Nothing
Else
myRemoveRange.End = mySecondRange.Previous(unit:=wdRow).End
Set myFirstRange = mySecondRange
End If
myRemoveRange.Select
myRemoveRange.Cut
' the destiny of the cut text is left to the requirements of the user
End If
End If
Loop Until myFirstRange Is Nothing
Next myTable
End Sub