WordのRangeオブジェクトの謎挙動
WordのRangeオブジェクトの謎挙動
完全にわけがわからなくなってしまった。
Find.Executeメソッドで特定の文字列の箇所をRangeオブジェクトとして取得する
次のようなメソッドを作成し、現在のカーソル位置の直近にある指定した文字列の場所をRange
オブジェクトとして取得する。
getNextTextRangeメソッド
Private Function getNextTextRange( _ ByVal tgtText As String) As Range Dim ret As Range Set ret = Nothing With Selection.Find Call .ClearFormatting Call .Replacement.ClearFormatting End With With Selection.Find .Text = tgtText .Replacement.Text = "" .Wrap = wdFindStop .Format = False .Highlight = False .MatchCase = False .MatchWholeWord = False .MatchByte = False .MatchAllWordForms = False .MatchSoundsLike = False .MatchWildcards = False .MatchFuzzy = False End With Call Selection.Find.Execute If Not Selection.Find.Found Then Exit Function Set ret = Selection.Range Set getNextTextRange = ret End Function
Find
オブジェクトのプロパティが大量にあるせいでタテ長になっているが、やっていることは簡単。引数tgtText
で指定した文字列を現在のカーソル位置から後方に向かって検索し、最初にヒットした箇所のRange
オブジェクトを返す。それだけ。
で、こいつを使って、指定した文字列にルビを振るということをやってみる。
文字列を検索してルビを振る
次のようなドキュメント(笑)を用意して先頭にカーソルを置き、
次のコードでやってみる。
リスト1
Private Sub testRangeObject() Dim wordRange As Range Set wordRange = getNextTextRange("強敵") '……(1)' Call wordRange.PhoneticGuide("とも") '……(2)' Call wordRange.PhoneticGuide("ち~んw") '……(3)' End Sub
(1)の
Set wordRange = getNextTextRange("強敵")
で、「強敵」の部分をRange
オブジェクトとして取得し、変数wordRange
に突っ込む。
んで、(2)の
Call wordRange.PhoneticGuide("とも")
で、[Range].PhoneticGuide
メソッドを用いて「強敵」部分に「とも」とルビを振る。ラオウ語法である。
そして、すかさず(3)の
Call wordRange.PhoneticGuide("ち~んw")
でルビを「ち~んw」に変更する。
フツーに実行すると一瞬で終わってしまうので、ステップ実行の様子をお目にかけよう。
この通り、期待通りの動きをしてくれていることがわかる。
すでにルビがある状態では?
では、これを再度実行してみる。
ドキュメント(笑)は、
この状態。もちろん、カーソルは先頭に戻してある。
リスト1を再度実行すると、
この体たらく。
実行後、
このように「強敵」部分が選択状態になっていることからすると、wordRange
にはちゃんとRange
オブジェクトが格納されている。
このことは、リスト1を次のように変更して、
リスト1改
Private Sub testRangeObject() Dim wordRange As Range Set wordRange = getNextTextRange("強敵") Debug.Print wordRange.Text '……(*)' Call wordRange.PhoneticGuide("とも") Call wordRange.PhoneticGuide("ち~んw") End Sub
実行すると、(*)
のところでイミディエイトに
と表示されることからもわかる。
おわりに
まったくわけがわからない。
一体何なのでしょう???