Word VBAで、Shape-TextFrame-TextRangeといったオブジェクトモデル経由で、テキストボックスの文字列を取得するマクロをご紹介しています。
これとは全く異なるオブジェクトモデルでも、テキストボックスの文字列を取得できます。
StoryRanges経由でテキストボックスの文字列を取得するサンプルマクロ
テキストボックスの存在するWord文書がアクティブな状態で以下のWordマクロを実行すると、テキストボックス内の文字列がイミディエイトウィンドウに出力されます。
Dim rng As Range
Set rng = ActiveDocument.StoryRanges(wdTextFrameStory)
Dim txt As String
Do Until rng Is Nothing
txt = rng.Text
Debug.Print Left(txt, Len(txt) - 1)
Set rng = rng.NextStoryRange
Loop
End Sub
拙著『Excel VBAユーザーのためのWord VBA入門(1)』で基本を解説している、Rangeオブジェクトの高度な使い方したマクロと言えます。
サンプルマクロで行っている処理
上記のWordマクロでは、以下の処理を行っています。
Document.StoryRanges(wdTextFrameStory)
Document.StoryRangesプロパティで取得できる、StoryRangesコレクションの既定メンバーであるItemメソッドの引数に
WdStoryType列挙型に定義されている定数wdTextFrameStory(直値:5)を指定すると、
1つ目のTextFrameストーリーを表すRange(1つ目のテキストボックス内の文字列範囲を表すRange)オブジェクトが取得できます。
その取得したRangeオブジェクトを変数rngに代入しておきます。
Set rng = ActiveDocument.StoryRanges(wdTextFrameStory)
Do Until~LoopとRange.NextStoryRange
StoryRanges(wdTextFrameStory)で取得できるRangeオブジェクトは、Range.NextStoryRangeプロパティを使って、
次のTextFrameストーリーを表すRangeが取得できます。
ですから、以下の構造のDo Until~Loopで、
Dim rng As Range Do Until rng Is Nothing ' 何らかの処理 Set rng = rng.NextStoryRange Loop
最後のTextFrameストーリに含まれるRangeまで次々に取得できます。
この方法を使って、上記マクロではテキストボックス内の文字列をイミディエイトウィンドウに出力しています。
段落記号の削除
イミディエイトウィンドウへの出力を行う際に、Rangeの末尾に存在する段落記号を削除して出力するために、Do Until~Loop内で以下の処理を入れています。
txt = rng.Text Debug.Print Left(txt, Len(txt) - 1)
Rangeオブジェクトに段落記号などの編集記号が含まれることについては、『Excel VBAユーザーのためのWord VBA入門(1)』の[3-2. Document.RangeメソッドでRangeを取得する]でも解説しています。
もしも、イミディエイトウィンドウへの出力時に空白行が入って問題なければ、上記マクロの、
Dim txt As String Do Until rng Is Nothing txt = rng.Text Debug.Print Left(txt, Len(txt) - 1) Set rng = rng.NextStoryRange Loop
の部分は、
Do Until rng Is Nothing Debug.Print rng.Text Set rng = rng.NextStoryRange Loop
のようにシンプルにしてOKです。
最終更新日時:2024-03-05 10:19
- Newer:xlCellTypeConstantsで該当するセルが見つかりませんエラーになる
- Older:VBAで結合セルをClearContentsしてもエラーにならないように-Range.MergeArea
Home » ワードマクロ・Word VBAの使い方 » Word.Rangeオブジェクト » StoryRanges経由でテキストボックスの文字列を取得するWordマクロ