Find.Executeメソッドのハマりを回避する(Word)
前回
お知らせしたように、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)のパターンだけだったのだが、念のため似たようなものを全部追加しておく。
前々回
紹介した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
に突っ込む、という考え方を生かして、ハイライト部分を取得するツール、取得したハイライト部分をオン/オフするツールを作って、クイック アクセス ツール バーに登録してみました。
これがその動作シーンです。
結構便利です。