「MS Officeの形状の中のテキストの取得方法の確認(TextRangeオブジェクト)」
という記事で、OfficeライブラリのTextRange2オブジェクトについて、
Excelの書式付きテキスト、PowerPointの書式付きテキストの操作に使用できます(Wordでも使用できそうですがアクセス方法がわかりません)。と書かれていることに気づきました。
Microsoft OfficeのShapeオブジェクトにかなり詳しそうな方が、WordでOffice.TextRange2オブジェクトをどう取得すればいいのかわからないと、おっしゃっているのです。
TextRangeとTextRange2の動きを確認するサンプルマクロ
おそらく、以下のようなプロシージャをテストされたはずです。
Dim rng As Word.Range
Dim trng2 As Office.TextRange2 Set rng = _
ActiveDocument.Shapes(1).TextFrame.TextRange
Set trng2 = _
ActiveDocument.Shapes(1).TextFrame2.TextRange
End Sub
アクティブなWord文書に、テキストボックスを作成しておいて、上記のプロシージャを実行すると、
「指定された値は境界を超えています。」
という実行時エラーが発生します。
この状態から[デバッグ]ボタンをクリックして、ローカルウィンドウを確認すると、Word.Rangeで宣言したオブジェクト変数・rngには「ActiveDocument.Shapes(1).TextFrame.TextRange」というオブジェクト式で取得したRangeオブジェクトがセットされているのに対し、trng2はオブジェクト変数の初期値・Nothingのままになっています。
この現象をご覧になって
「Wordでも使用できそうですがアクセス方法がわかりません」
と書いてらっしゃるのだろうと想像しています。
TextFrameとTextFrame2の動きを確認するサンプルマクロ
問題は、TextRang2オブジェクトの上位オブジェクトであるTextFrame2オブジェクトにあります。
Dim tfr As Word.TextFrame
Dim tfr2 As Office.TextFrame2 Set tfr = _
ActiveDocument.Shapes(1).TextFrame
Set tfr2 = _
ActiveDocument.Shapes(1).TextFrame2
End Sub
アクティブ文書にテキストボックスが存在する状態で、上記のプロシージャを実行しても、やっぱり、
「指定された値は境界を超えています。」
実行時エラーが発生します。
Wordの場合、一般的なShapeからは、TextFrame2プロパティを使って、TextFrame2オブジェクトを取得できなさそう、ということです。
TextFrame2オブジェクトが取得できないので、その子オブジェクトであるはずのTextRange2オブジェクトも取得できないということになります。
「VBA 似ているようで違うExcel・Word・PowerPointのシェイプをオブジェクトブラウザーで比較する」
という記事では、
WordにはTextFrame2は用意されておらず、設定項目は全てTextFrameにまとまっている。
と書かれているのだろう、と想像しています。
TextFrame2オブジェクトを取得するサンプルマクロ
では、Word VBAで、TextFrame2オブジェクトを本当に利用できないのかというと、そんなことはありません。
2010以降のWordで、アクティブ文書に浮動オブジェクトの(文字列の折り返しが行内ではない)スマートアートを作成しておいてから、以下のプロシージャを実行すると、TextFrame2オブジェクトを取得できることが確認できます。Dim tfr2 As Office.TextFrame2
Set tfr2 = _
ActiveDocument.Shapes(1).SmartArt.AllNodes(1).TextFrame2
Stop
End Sub
スマートアートを行内オブジェクトとして挿入した場合は、上記のオブジェクト式の「.Shapes(1)」を「.InlineShapes(1)」としてください。
TextFrame2オブジェクトを取得する上位のオブジェクト式が「.AllNodes(1)」となっているのが納得できないという場合は、以下のプロシージャもどうぞ。Dim tfr2 As Office.TextFrame2
Set tfr2 = _
ActiveDocument.Shapes(1).SmartArt.AllNodes(1).Shapes(1).TextFrame2
Stop
End Sub
上記のような階層を辿ったオブジェクト式なら、TextFrame2オブジェクトのTextRangeプロパティで、TextRange2オブジェクトを取得できます。一応。
Home » ワードマクロ・Word VBAの使い方 » Shape・図形 » Word VBAでTextFrame2・TextRange2を利用する