Find.Executeメソッドのハマりを回避する(Word)

Find.Executeメソッドのハマりを回避する(Word)

前回

akashi-keirin.hatenablog.com

お知らせしたように、Selection.Collapseメソッドが(仕方がないにせよ)カーソルが末尾にあるときに悲しい挙動をしてしまうせいで、Find.ExecuteメソッドをDo ~ Loopで回そうとすると、ハマってしまうことがある。(いつもいつもハマるわけでもないのが謎。かつてハマらなかったやつが急にハマり出したりする。原因は未解明。ハマると結構な大事になるので、注意が必要。)

で、回避策を考えた。

[Range].Textプロパティの値で判定する

これまで、私が経験したハマりのときの[Range].Textプロパティの値は、""(空文字)とvbCrだった。

この経験をもとに、次のようなメソッドを作成した。

リスト1
Private Function isValid( _
    ByVal targetRange As Range) As Boolean
  isValid = False
  Select Case targetRange.Text
    Case "": Exit Function    '……(1)'
    Case vbCrLf: Exit Function
    Case vbCr: Exit Function    '……(2)'
    Case vbLf: Exit Function
    Case vbNewLine: Exit Function
  End Select
  isValid = True
End Function

これまで経験したのは(1)と(2)のパターンだけだったのだが、念のため似たようなものを全部追加しておく。

前々回

akashi-keirin.hatenablog.com

紹介したgetNextHighLightメソッドの返り値(検索でヒットしたRangeオブジェクト)をこのisValidメソッドに渡せば、ハマりパターンになるときにFalseが返るので、ループから抜けたらよい、という考え方。

たとえば、

Dim tmp As Range
Do
  Set tmp = getNextHighLight(Selection.Range)
  If tmp Is Nothing Then Exit Do
  If Not isValid(tmp) Then Exit Do
  Call someCollection.Add(tmp)
Loop

みたいにすれば、検索でヒットしたハイライト部分(Rangeオブジェクト)を次々にCollectionに追加していくことができる。

末尾の改段落記号を取得してしまったときは、isValidメソッドがFalseを返すので、Exitしてくれる。つまり、ハマらずに済むということだ。

おわりに

ハイライト部分をCollectionに突っ込む、という考え方を生かして、ハイライト部分を取得するツール、取得したハイライト部分をオン/オフするツールを作って、クイック アクセス ツール バーに登録してみました。

f:id:akashi_keirin:20191231221941g:plain

これがその動作シーンです。

結構便利です。