「【コード】文書中のテキストボックス内の文字列を別紙に書出す(その3)」の続きです。
この記事で紹介したWordマクロは、特定の条件で動きます。
ヘッダーにテキストボックスがあるとなぜか都合が悪いのです。ヘッダーに挿入されたものが文字列だけの場合には問題がないようなのですが。。。
たまたま以下のサンプルファイルを作ってテストをしてみたらおかしな結果になりました。どうも、ヘッダーやフッターの扱いがWordのVBAで例外的なことがありまして、バグになりやすいのです。
このサンプルファイルでは、以下のようにヘッダーに2つのテキストボックスがあります。
前回の記事のマクロを実行すると。。。。
Wordのバージョンによっても挙動が異なりました。Word 2010以降では「1. This is a pen. 」がなくなり、かわりに「8~11」の文章が挿入されています。
マクロの実行中に確認したところ、処理対象となるオブジェクトが正確に特定されていないようなのです。
そのようなわけで、別のWordマクロを作ってみました。
このマクロでできること
ヘッダーにテキストボックスがある場合でも、本文中のテキストボックス内の文字列を新規文書に抽出(エクスポート)します。
実行結果は以下の通りです。
実は、1~11までの順序がばらばらでそれが若干気になりますが。。。まあ、テキストを抽出するという目的は達成できたのでいいものとします(笑)。
マクロの解説
6行目のとおり、ストーリー内でテキストボックスを指定します。
このようにして処理対象オブジェクトをテキストボックスに指定できるのです。
この指定により、オートシェイプに挿入されたテキストも取得できますし、描画キャンバス内のテキストも取得できますし、グループ化されたテキストボックス内のテキストも取得できます。
シンプルなのですが非常に便利。
ただ、今回も本文だけを対象にしています。ヘッダーやフッターは前回の記事と同様に処理対象外としています。
あと、テキストボックスがない文書で実行するとエラーが発生します。
マクロ
Sub テキストボックスのテキスト抽出4() Dim myRange As Range Dim newDoc As Document Set myRange = ActiveDocument.StoryRanges(wdTextFrameStory) Set newDoc = Documents.Add Do newDoc.Range.InsertAfter myRange.Text Set myRange = myRange.NextStoryRange If myRange Is Nothing Then Exit Do Loop Set newDoc = Nothing Set myRange = Nothing End Sub