【コード】文書中のテキストボックス内の文字列を別紙に書出す(その4)

【コード】文書中のテキストボックス内の文字列を別紙に書出す(その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

トップへ戻る