FormattedTextプロパティの怪
FormattedTextプロパティの怪
『Writing Word Macros』という本を買った。
FormattedTextプロパティ
Range
オブジェクトのところを読んでいたら、FormattedText
というプロパティについて書いてあった。
へえ。そんなものがあったのか。
で、『Word 2013 developer docs』(オフラインヘルプ)で調べてみた。
すると、
Returns or sets a Range object that includes the formatted text in the specified range or selection. Read/write.
こんなふうに書いてある。
「FormattedText
」という名前だが、Range
型らしい。
まあ、書式情報を含んでいないといけないわけだから、String
型のわけがないのだが。
実験
んで、ちょいと実験。
おなじみ、
このような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
で変数rng
にSelection
オブジェクトの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(笑)の「月面宙返り」の部分を
このように選択して、リスト1を実行。
なんと、コンパイルエラー……。
「不正」呼ばわりである。
冗談半分で、リスト1の(3)の部分を
Selection.FormattedText = rng
にして実行してみる。
すると、
えっ?! なんで???
やりたかったことが実現できたとはいえ、わけがわからん。
よくわからないこと
オブジェクト ブラウザーによると、
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
にして実行すると、
このようにわけのわからない結果になる。
また、そもそもはコーディング・ミスだったのだが、リスト1の(3)を
Selection.FormattedText = rng.FormattedText
としても、
このように正しい(?)結果になる。
また、リスト1の(3)を
Selection.FormattedText = rng.Text
にすると、
「型が一致しません」というコンパイルエラーになる。
左辺と右辺をあれこれ変えてみた結果をまとめたのが
これ。
わからぬ……。