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オブジェクトを返す。それだけ。

で、こいつを使って、指定した文字列にルビを振るということをやってみる。

文字列を検索してルビを振る

次のようなドキュメント(笑)を用意して先頭にカーソルを置き、

f:id:akashi_keirin:20200227075306j:plain

次のコードでやってみる。

リスト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」に変更する。

それだけだ

フツーに実行すると一瞬で終わってしまうので、ステップ実行の様子をお目にかけよう。

f:id:akashi_keirin:20200227075316g:plain

この通り、期待通りの動きをしてくれていることがわかる。

すでにルビがある状態では?

では、これを再度実行してみる。

ドキュメント(笑)は、

f:id:akashi_keirin:20200227075308j:plain

この状態。もちろん、カーソルは先頭に戻してある。

リスト1を再度実行すると、

f:id:akashi_keirin:20200227075330g:plain

この体たらく。

実行後、

f:id:akashi_keirin:20200227075311j:plain

このように「強敵」部分が選択状態になっていることからすると、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

実行すると、(*)のところでイミディエイトに

f:id:akashi_keirin:20200227075314j:plain

と表示されることからもわかる。

おわりに

まったくわけがわからない。

一体何なのでしょう???