見出し画像

Excel VBAユーザーのためのWord VBA 入門 「chapter 3. WordのRangeは文字列範囲を表す」

chapter 3では、Documentのもっとも重要な子オブジェクト(階層が下位のオブジェクト)である、Rangeを見ていきましょう。

Word VBAのRangeは、Word文書内の文字列範囲を表すオブジェクトです。

厳密には文字列ではない操作対象が含まれる場合もありますが、Word文書内のいずれかの文字列範囲を表すのが、Word VBAのRangeオブジェクトであるという基本を、まずは理解してください。




このnoteは『Excel VBAユーザーのためのWord VBA入門』の、chapter 3 です。「はじめに」と「chapter 1. Excel VBAとWord VBAの違い」をお読みいただいていない方は、先にこれらの無料noteをお読みください。有料の「chapter 2. Documentは文書を表す」は、最低でも無料部分をお読みいただくことをおすすめします。


3-1. Document下の構造はExcelと異なる

chapter 2で学習した、Documentsコレクション&Documentオブジェクトは、Excel VBAのWorkbooksコレクション&Workbookオブジェクトと、似た部分が少なくないと感じていることでしょう。

一方、このあと解説していくDocument下の階層構造は、Excel VBAとかなり異なります。
Excel VBAの知識を過度に一般化させてしまわないよう注意が必要です。

Worksheet的なオブジェクトがWordにはない

オブジェクトの階層構造に注目すると、Excel VBAのWorksheetに相当するオブジェクトがWord VBAには存在しません。

Excel VBAの場合、ブックを表すWorkbookオブジェクトの下位オブジェクトとして、ワークシートを表すWorksheetオブジェクトがありますが、Word VBAにそのようなオブジェクトは存在しないのです。
まずは、このことを知っておいてください。

● Wordのページは仮想的な平面空間

WordのページがExcelのワークシートに近い、と思う方がいるかもしれませんが、それは違います。
Wordでは改ページを挿入するか、文字列をたくさん入力して1ページに収まらなくなったときなどに、自動的にページが増えます。フォントサイズ・行間・余白などの設定を変更すれば、ページは簡単に増減します。
最近のWordには、空白ページを挿入するコマンドがありますが、実際には改ページを挿入しているに過ぎません。

作成した文書を紙へ出力するために、仮想的な平面空間としてページが存在しているのが、Wordの基本的な考え方です。
アウトラインモードや下書きモードにすれば、「改ページ」という表示は見えるものの、日本人がイメージするページという概念は、ない状態になってしまいます。

ページが仮想的な平面空間にすぎないという考え方がWord VBAにも反映されており、文字・単語・文・段落単位での処理に比べると、ページ単位の処理はかなり面倒です(ページ単位での処理はchapter 8で解説します)。


Word VBAのRangeはExcel VBAのRangeと無関係

Excel VBAの経験がある皆さんの場合、Word VBAのRangeオブジェクトの学習をはじめると、最初のうちは混乱するかもしれません。
名前が同じ「Range」であるために、Excel VBAでセル範囲を表すRangeオブジェクト(図3-1a)を、無意識のうちに想起してしまう可能性があるためです。

図3-1a

Excel VBAでセル範囲を表すRangeオブジェクトと、Word VBAで文字列範囲を表すRangeオブジェクト(図3-1b)とは、全く関係ありません。
Microsoftが「Range」と名前を付けたオブジェクトが、Excel VBAでもWord VBAでも偶然、重要なオブジェクトになっているだけです。

図3-1b

▲ オブジェクトブラウザーのメンバーペインには、Excel VBAのRangeオブジェクト(図3-1a)とは異なるプロパティ&メソッドが並んでいます。

英単語の「Range」は日本語にすると「範囲」です。このRangeが、Excel VBAではセル範囲を表すオブジェクトの名前として、Word VBAでは(基本的に)文字列範囲を表すオブジェクトの名前に使われているのです。


ParagraphはRangeの上位オブジェクトではない

Word文書を作成する場合、段落が非常に重要な概念です。
Word文書上で文字列は、必ず段落の中に存在します。

このためでしょうか、段落を表すParagraphオブジェクトが、Rangeの上位オブジェクトであるかのように記述している書籍も市販されていますが、違います。
ParagraphはRangeの上位オブジェクトではありません。

もしもParagraphがRangeの上位オブジェクトならば、Rangeを取得する際に、基本的にParagraphオブジェクトを経由しなければならないはずですが、そのようなことはありません。
ParagraphがRangeの上位オブジェクトであるかのようにイメージしてしまうと、Word VBAのオブジェクトモデルを正しく理解できなくなります。

Rangeの上位オブジェクトはchapter 2で学習したDocumentです。

但し、Paragraphオブジェクトを経由してRangeオブジェクトを取得することも可能です。これについては、chapter 6で解説します。


3-2. Document.RangeメソッドでRangeを取得する

DocumentオブジェクトのRangeメソッドを使って、本文の文字列範囲を表すRangeオブジェクトを取得するコードから見ていきましょう。

本文全体を表すRangeの取得

まず、Document.Rangeメソッドを使った以下のSubプロシージャを作成し、実行してください。

Sub Rangeを取得する()
    With ActiveDocument.Range
        .Select
        MsgBox .Text
    End With
End Sub

正常に実行できると、アクティブ文書の本文の文字列がすべて選択され、その文字列がメッセージボックスに表示されます。
アクティブ文書に大量の文字列が入力されている場合には、MsgBox関数の仕様に従い表示可能な文字列がメッセージボックスに表示されます。

SubプロシージャのWith文、

    With ActiveDocument.Range

の「ActiveDocument.Range」が、アクティブ文書の本文部分の文字列範囲を表すRangeオブジェクトを取得しているコードです。
「ActiveDocument」につづく「.Range」が、Word VBAでよく使われる、Rangeオブジェクトを取得するための、Documentオブジェクトに用意されているRangeメソッドです。
Document.Rangeメソッド(図3-2a)を、引数を指定せずに呼び出すと、Word文書の本文全体の文字列範囲を表すRangeオブジェクトを取得できます。

図3-2a

▲ オブジェクトブラウザーの詳細ペイン1行目に「Function Range」「As Range」と表示されていることから、RangeメソッドがRange型オブジェクトを返すことがわかります。 「([Start], [End])」表示から、引数Start・Endがいずれも省略可能なこともわかります。

With文内で使用している、

    With ActiveDocument.Range
        .Select
        MsgBox .Text

Range.Selectメソッドは「3-3. Rangeの特徴的なメソッド」で、Range.Textプロパティは「3-4. Rangeの特徴的なプロパティ」で解説します。
Word文書上の文字列をメッセージボックスに表示するだけならば「.Select」は不要ですが、ここではRangeオブジェクトをイメージしやすくするために、あえて選択を行っています。

コードと実行結果を見て、文字列範囲を表すRangeオブジェクトが、Selectメソッドで選択することができ、Textプロパティで文字列を取得できることを、まずはイメージしてください。

● 本文全体を取得する書き方は複数ある

Word文書の本文全体を表すRangeを取得するコードの書き方は、実は複数あります。その中で、これからWord VBAを学習する方に筆者がおすすめするのが、ここでご紹介しているDocument.Rangeメソッドです。
メソッド名と、取得できるオブジェクト名が同じRangeであり、他のコードと比べて応用しやすいコードだからです。

ここから先は

13,237字 / 29画像

¥ 580

よろしければ、サポートをお願いします!!