Home » ワードマクロ・Word VBAの使い方 » Shape・図形 » Word VBAでTextFrame2・TextRange2を利用する

Word VBAでTextFrame2・TextRange2を利用する

対象:Word2010, Word 2013, Windows版Word 2016

MS Officeの形状の中のテキストの取得方法の確認(TextRangeオブジェクト)
という記事で、OfficeライブラリのTextRange2オブジェクトについて、

Excelの書式付きテキスト、PowerPointの書式付きテキストの操作に使用できます(Wordでも使用できそうですがアクセス方法がわかりません)。

と書かれていることに気づきました。

Microsoft OfficeのShapeオブジェクトにかなり詳しそうな方が、WordでOffice.TextRange2オブジェクトをどう取得すればいいのかわからないと、おっしゃっているのです。

[スポンサードリンク]

TextRangeとTextRange2の動きを確認するサンプルマクロ

おそらく、以下のようなプロシージャをテストされたはずです。

Sub 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オブジェクトにあります。

Sub TextFrameと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オブジェクトも取得できないということになります。

おそらく、このTextFrame2オブジェクトの状態をご覧になって、
VBA 似ているようで違うExcel・Word・PowerPointのシェイプをオブジェクトブラウザーで比較する
という記事では、
WordにはTextFrame2は用意されておらず、設定項目は全てTextFrameにまとまっている。

と書かれているのだろう、と想像しています。

TextFrame2オブジェクトを取得するサンプルマクロ

では、Word VBAで、TextFrame2オブジェクトを本当に利用できないのかというと、そんなことはありません。

2010以降のWordで、アクティブ文書に浮動オブジェクトの(文字列の折り返しが行内ではない)スマートアートを作成しておいてから、以下のプロシージャを実行すると、TextFrame2オブジェクトを取得できることが確認できます。
Sub 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)」となっているのが納得できないという場合は、以下のプロシージャもどうぞ。
Sub TextFrame2を取得する_2()
 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を利用する

「Shape・図形」の記事一覧

検索


Copyright © インストラクターのネタ帳 All Rights Reserved.

.