FormattedTextプロパティの怪

FormattedTextプロパティの怪

f:id:akashi_keirin:20200328155256j:plain

Writing Word Macros』という本を買った。

FormattedTextプロパティ

Rangeオブジェクトのところを読んでいたら、FormattedTextというプロパティについて書いてあった。

へえ。そんなものがあったのか。

で、『Word 2013 developer docs』(オフラインヘルプ)で調べてみた。

すると、

f:id:akashi_keirin:20200328154520j:plain

Returns or sets a Range object that includes the formatted text in the specified range or selection. Read/write.

こんなふうに書いてある。

FormattedText」という名前だが、Range型らしい。

まあ、書式情報を含んでいないといけないわけだから、String型のわけがないのだが。

実験

んで、ちょいと実験。

おなじみ、

f:id:akashi_keirin:20200328154522j:plain

このようなDocument(笑)を準備。

この中で、ゴシック体になっている「月面宙返り」の部分を、このDocument(笑)のケツに挿入するコードを書いてみる。

リスト1
Private Sub testFormattedTextProperty()
  Dim rng As Range
  Set rng = Selection.FormattedText  '……(1)'
  With ActiveDocument
    Call .Range(.Range.End - 1, .Range.End - 1).Select  '……(2)'
    Set Selection.FormattedText = rng  '……(3)'
  End With
End Sub

(1)の

Set rng = Selection.FormattedText

で変数rngSelectionオブジェクトのFormattedTextプロパティの返り値(Range型)を突っ込む。

あとは

With ActiveDocument
  Call .Range(.Range.End - 1, .Range.End - 1).Select  '……(2)'
  Set Selection.FormattedText = rng  '……(3)'
End With

の(2)でDocument(笑)の末尾位置を選択し([Range].Endプロパティは、末尾の改段落記号まで含めた数値を返すので、1を引いておかないとカーソル移動ができず、エラーになるので注意。)、(3)でそのFormattedTextプロパティに(1)で取得したRangeオブジェクト(rng)をセットする。

これで盤石である。時は来た。それだけだ!

先のDocument(笑)の「月面宙返り」の部分を

f:id:akashi_keirin:20200328154525j:plain

このように選択して、リスト1を実行。

f:id:akashi_keirin:20200328154529j:plain

な・・・・なんだってーーー!?

なんと、コンパイルエラー……。

「不正」呼ばわりである。

冗談半分で、リスト1の(3)の部分を

Selection.FormattedText = rng

にして実行してみる。

すると、

f:id:akashi_keirin:20200328154533j:plain

えっ?! なんで???

やりたかったことが実現できたとはいえ、わけがわからん。

よくわからないこと

オブジェクト ブラウザーによると、

f:id:akashi_keirin:20200328154535j:plain

Word.Rangeオブジェクトの既定メンバはTextプロパティである。

ということは、

Selection.FormattedText = rng

というのは

Selection.FormattedText.Text = rng.Text

ということにならないのだろうか。

FormattedTextプロパティがRange型であり、「Read/write」である以上、

Set Selection.FormattedText = rng

でないとおかしいように思うのだが……。

おわりに

ちなみに、たとえばリスト1の(3)のところを

Selection.FormattedText.Text = rng

にして実行すると、

f:id:akashi_keirin:20200328154539j:plain

このようにわけのわからない結果になる。

また、そもそもはコーディング・ミスだったのだが、リスト1の(3)を

Selection.FormattedText = rng.FormattedText

としても、

f:id:akashi_keirin:20200328154542j:plain

このように正しい(?)結果になる。

また、リスト1の(3)を

Selection.FormattedText = rng.Text

にすると、

f:id:akashi_keirin:20200328154545j:plain

「型が一致しません」というコンパイルエラーになる。

左辺と右辺をあれこれ変えてみた結果をまとめたのが

f:id:akashi_keirin:20200328154549j:plain

これ。

わからぬ……。