.NET 開発者の観点から捉えた Word オブジェクト モデル

Mary Chipman
MCW Technologies, LLC

April 2003
日本語版最終更新日 2003 年 8 月 7 日

適用対象 :
    MicrosoftR "Visual Studio Tools for Office"
    Microsoft Office Word 2003
    Microsoft Visual StudioR .NET 2003

要約 : Microsoft Visual Studio Tools for Office を使用して Microsoft Office Word 2003 のオブジェクトを利用する方法を説明します。ここでは、重要な Word オブジェクトとその使用例をいくつか紹介します。Word 2003 のアプリケーションとドキュメントの操作方法や、重要度の高いプロパティやメソッドの処理方法を習得できます。

WordObject.exe は Microsoft Download Center(英語) からダウンロードできます。

目次

はじめに
Word プロジェクトの概説
基礎 : ドキュメントとテンプレート
Word オブジェクト モデルの概観
Application オブジェクト
Document オブジェクト
Selection オブジェクト
Range オブジェクト
Bookmark オブジェクト
テキストの検索と置換
印刷
Word の表の作成
まとめ

はじめに

MicrosoftR Word は、現在、世界で最も普及しているソフトウェアの 1 つに数えられます。大多数のWord ユーザーはコードをまったく記述しなくても難なく作業をこなすことができますが、Word には豊富で強力なオブジェクト モデルが用意されており、これらを利用することにより優れたプログラム制御が可能となります。Microsoft "Visual Studio Tools for Office" を利用すると、開発者は Microsoft Visual BasicR .NET や Microsoft Visual C#R などの .NET 言語を使用して、Microsoft Office Word 2003 のオブジェクト モデルを構成するオブジェクトにアクセスすることができます。Word には豊富な機能群が用意されており、これらはすべてコードを介して利用できます。習得すべきオブジェクトは多数あるため、最初はやや複雑に感じられるかもしれません。Word のオブジェクトは階層構造に編成されているため、まずは階層の最上位にある ApplicationDocument という 2 つの主要クラスに着目し、そこからオブジェクト モデルに関する理解を深めていくことができます。Word での作業の大半を占めるのが Word アプリケーション自体の操作や Word ドキュメントに対する何らかの処理であることを考えると、これら 2 つのクラスから取りかかるのは理にかなっています。

Word オブジェクト モデルに関する理解が深まるにつれて、Word のユーザー インターフェイスとの類似性が見えてきます。これにより、Application オブジェクトがアプリケーション全体のラッパーとして機能することや、各 Document オブジェクトは 1 つの Word ドキュメントを表すこと、Paragraph オブジェクトは 1 つの段落に対応していることなどを容易に推測できるようになります。各オブジェクトには、オブジェクト モデルの操作やオブジェクト モデルへのアクセスに使用できるメソッドやプロパティが多数用意されています。通常、各オブジェクトのメンバの動作は名前から容易に推測できます。PrintOut メソッドはその例です。動作や正しい使用法の把握が困難な場合もありますが、基本を習得すると、Word のユーザー インターフェイスで実行できる操作は、コード上でもすべて簡単に実現できることがわかります。Word でプログラミングを行うと、反復作業の自動化や、Word に組み込まれている機能の拡張およびカスタマイズも可能になります。

このドキュメントでは、Word 2003 に用意されている多数のオブジェクトの利用方法を説明すると共に、各オブジェクトのプロパティ、メソッド、およびイベントをいくつか紹介します。Word のアプリケーションとドキュメントの操作方法や、重要度の高いメソッドやプロパティの使用方法を習得できます。

メモ   Visual Basic .NET 環境での Word やそのオブジェクトのプログラミングは、VBA でのプログラミング感覚に似ています。Visual Basic .NET はオプションのパラメータに対応しており、VBA と同様に遅延バインディングが可能です。これに対し、C# で Word オブジェクト モデルのプログラミングを行う場合には、固有の作業が発生します。C# ではオプションのパラメータ、パラメータ化されたプロパティ、および遅延バインディングがサポートされていないため、C# でプログラミングを行う場合には、Word のメソッドとプロパティの多くを特別に扱う必要があります。このドキュメントでは、Visual Basic .NET と C# でのプログラミングの違いを適宜説明していきます。

Word プロジェクトの概説

Visual Studio .NET で新しい Office プロジェクトを作成する場合は、Word ドキュメント プロジェクトまたは Word テンプレート プロジェクトのどちらを作成するかを選択することができます (図 1 を参照)。

Aa192495.wordobject001(ja-jp,office.11).gif


図 1. Visual Studio .NET では、Word ドキュメント プロジェクトまたは Word テンプレート プロジェクトのどちらも作成できます。

Visual Studio .NET では、ドキュメント プロジェクトとテンプレート プロジェクトのどちらの場合も、ThisDocument.vb または ThisDocument.cs という名前のコード ファイルが Word プロジェクト内に自動的に作成されます。新しく作成したプロジェクトで ThisDocument を開いてみると、OfficeCodeBehind という名前の public クラスが既に生成されていることがわかります。非表示になっている生成された初期化コード領域を展開すると、 OfficeCodeBehind クラスには Word.Document オブジェクトと Word.Application オブジェクトをラップする次のコードが記述されています。

ここでは、次の 2 つの変数が宣言されています。

  • ThisDocument : Word の Document オブジェクトを表す変数です。メソッド、プロパティ、イベントなど、Word に組み込まれている各 Document メンバへのアクセスに使用します。
  • ThisApplication : Word の Application オブジェクトを表す変数です。イベントなど、Application オブジェクトの各メンバへのアクセスに使用します。

事前に定義されたこれら 2 つの変数を使用すると、コード内のどちらの Word オブジェクトにも簡単にアクセスすることができます。Word.Document オブジェクトまたは Word.Application オブジェクトを個別に宣言する必要はなく、ThisDocumentThisApplication をそのまま使用できます。

以下の各項では、Document オブジェクトと Application オブジェクトの特定のメンバを例にとりながら、各オブジェクトについて詳しく説明します。Word のオブジェクト モデルは非常に多機能であり、そのすべてのメンバについてここで詳しく説明することはできませんが、オブジェクト モデルの特徴を把握して利用を開始するための情報は十分に盛り込まれています。また、Word のオンライン ヘルプを使用して詳細を調べる方法も併せて習得できます。

ヒント   この記事の例では、全体を通して Visual Basic .NET コードの CType メソッドおよび DirectCast メソッドを多用しています。これは、サンプル プロジェクトでは Option Strict 設定がオンになっており、Visual Basic .NET で厳格な型変換が必要とされるためです。Word のメソッドやプロパティの多くは、Object 型の値を返します。たとえば、_Startup プロシージャには application および document という名前の Object 型の変数が渡され、CType 関数によって各変数がそれぞれ Word.Application オブジェクトおよび Word.Document オブジェクトに明示的に変換されます。したがって、サンプルでは変換をできるだけ厳密にするために Option Strict をオンにし、それぞれの型変換を明示的に処理しています。これは C# による開発を意識した結果です。ただし、後述のとおり、オブジェクト指向の枠組みにうまく変換されない Word の機能がいくつか存在するため、Option Strict をオフにして作業した方が都合が良い場合もあります。通常は Option Strict をオンにして作業し、少数の例外については発生した時点で対処することをお勧めします。

基礎 : ドキュメントとテンプレート

Word のプログラミングを効果的に行うには、あらかじめ Word の動作を理解しておく必要があります。コードで実行する操作の大半は、ユーザー インターフェイスのメニューやツール バーに組み込まれている機能に対応しています。このような UI 要素の構造を定義する基本的なアーキテクチャもあります。最も重要な概念の 1 つは、テンプレートという考え方です。テンプレートの概念には、なじみのある方も多いでしょう。Word のテンプレートには、定型文やスタイルだけでなく、コード、ツール バー、キーボード ショートカット、定型句などを登録できます。新しい Word ドキュメントは、必ず特定のテンプレートに基づいて作成されます。テンプレートのファイル名拡張子は .dot であり、拡張子が .doc である Word ドキュメントとは区別されます。新しいドキュメントはテンプレートにリンクされ、すべてのテンプレート項目にアクセスできます。カスタム テンプレートを指定せずに新しいドキュメントを作成した場合、そのドキュメントには Word のインストール時にインストールされた Normal.dot が適用されます。

Normal.dot について

Normal.dot テンプレートの適用範囲はグローバルであり、作成するすべてのドキュメントに適用できます。必要な場合は、すべてのコードを Normal.dot に書き込んで、その標準テンプレートを自分の環境下にあるすべてのドキュメントのベースとすることもできます。ただし、ファイル サイズがきわめて大きくなるため、通常は特定のアプリケーションごとにカスタム テンプレートを作成する方法が適しています。既定の標準テンプレートに記述したコードには、カスタム テンプレートを使用して作成したドキュメントからもアクセスできます。必要であれば、1 つのドキュメントに標準テンプレートと複数のカスタム テンプレートを添付することも可能です。

テンプレートとコード

スタイルやコードの格納先はテンプレートに限定されているわけではありません。ドキュメントのベースになっているテンプレートの内容に影響を与えることなく、個々のドキュメントでコードをカスタマイズしたり記述したりすることもできます。作成したコードを Word で実行する際には、ソース (テンプレートまたはドキュメント) の絶対参照と、モジュール名およびプロシージャ名が使用されます。これは名前空間と同様に機能し、各プロシージャが独立した状態で保持されます。図 2 に示すツール バーの [ユーザー設定] ダイアログ ボックスは、この概念を表しています。各プロシージャは、プロジェクトの名前、モジュール、およびプロシージャ名で完全に限定されています。この場合、右側のペインで選択されている項目は、Normal.dot の Tile モジュールに格納されている TileVertical という名前のプロシージャを指しています。そのすぐ下に表示されている SaveDocument プロシージャは、プロジェクトの背後で動作するアクティブ ドキュメントのコードに格納されています。

Aa192495.wordobject002(ja-jp,office.11).gif


図 2. プロシージャをツール バーに割り当てる際は、絶対参照を使用します。

ヒント   Word では、テンプレートやドキュメントには必ず "最もローカルな" 規則が適用されます。Normal.dot、カスタム テンプレート、および現在のドキュメントの 3 つの場所のすべてにスタイル、マクロ、またはその他の項目が重複して存在する場合は、現在のドキュメントの規則が最初に使用され、続いてカスタム テンプレートの規則、Normal.dot の定義の順に使用されます。

スタイルと書式

Word では、次の 2 つの方法でドキュメントの書式を設定できます。

  • 直接の書式設定。テキストを選択して、フォント、太字、斜体、サイズなどの書式オプションを適用できます。
  • スタイルの適用。Word には組み込みスタイルが用意されており、独自に変更してドキュメントのカスタマイズに使用することができます。スタイルを段落や選択範囲に適用すると、複数の属性が同時に適用されます。スタイルはテンプレートやドキュメントに保存されます。

通常、スタイルは段落全体に適用されます。段落内の特定の文字、単語、または範囲に対して文字スタイルを定義することもできます。利用できるスタイルを調べるには、[書式] メニューの [スタイルと書式] をクリックして、図 3 に示す [スタイルと書式] ペインを表示します。この図では、[標準] のスタイルが選択されています。

Aa192495.wordobject003(ja-jp,office.11).gif


図 3. 既定のスタイルは [標準] です。

スタイルの変更

スタイル名をクリックすると、その部分がドロップダウン リスト ボックスに変わります。表示されるオプションの中から [変更] をクリックすると、 任意の組み込みスタイルを変更することができます。必要に応じて図 4 に示す [テンプレートに追加する] チェック ボックスをオンにすると、ドキュメントのベースになっているテンプレートにも変更内容を保存できます。 このチェック ボックスをオフのままにした場合、変更内容はドキュメントにのみ保存され、ドキュメントのベースになっているテンプレートには反映されません。

Aa192495.wordobject004(ja-jp,office.11).gif


図 4. スタイルの変更

Word を使用して作業する場合は、可能な限り多くのスタイルを使用すると便利です。スタイルを使用すると、直接の書式設定では実現が非常に難しい、複雑なドキュメントの書式制御も可能になります。スタイルの機能を理解することは、スタイルを活用してコードの効率を高めるうえで重要な意味を持ちます。

段落記号について

Word のユーザー インターフェイスを介してドキュメントを表示した場合、ドキュメントは単語、段落、セクションなどの要素に分けて表示されます。Word ドキュメントも、本来は膨大な文字の羅列にすぎません。これらの文字には、通常の文字や数字のように読むことを意図したものもあれば、空白、タブ、キャリッジ リターンのような文字もあります。これらの文字には、それぞれ果たすべき役割があります。

Word ドキュメントの段落記号は、段落間を区切る以外に、段落の書式に関するすべての情報を格納するという非常に重要な役割を担っています。段落記号も含めて段落をコピーすると、その段落の書式もすべて段落とともにコピーされます。段落記号を除いて段落をコピーし、その段落を別の場所に貼り付けた場合、元の段落の書式はすべて失われます。

Word ドキュメントの編集中にキーボードで Enter キーを押すと、直前の段落と同じ書式を持つ新しい段落が作成され、直前の段落で有効になっていた段落書式やスタイルがすべて新しい段落に反映されます。新しい段落には、別の書式を適用することもできます。これに対し、Shift キーを押しながら Enter キーを押した場合は、既存の段落にライン フィード文字が書き込まれるだけで、書式は保持されません。段落書式を適用すると、その書式は改行文字の前後にあるすべてのテキストに適用されます。

図 5 は、段落記号の表示オプションがオンになっている場合に、改行と段落記号がそれぞれどのように表示されるかを示しています。

Aa192495.wordobject005(ja-jp,office.11).gif


図 5. 改行には段落の書式情報は含まれませんが、段落記号には含まれます。

段落記号の表示

誤って段落記号を削除してしまうと、段落書式が失われる可能性があります。対策としては、[ツール] メニューの [オプション] をクリックして [表示] タブをクリックし、[編集記号の表示] セクションの [段落記号] チェック ボックスをオンにして、段落記号が常に表示されるようにしておくことをお勧めします (図 6 を参照)。

Aa192495.wordobject006(ja-jp,office.11).gif


図 6. [オプション] ダイアログ ボックスの [編集記号の表示] セクションで [段落記号] の表示をオンにします。

Word オブジェクト モデルの概観

Word オブジェクト モデルには重複が多数存在するため、一見するとわかりにくい印象を与えます。たとえば、Document オブジェクトと Selection オブジェクトはどちらも Application オブジェクトのメンバですが、Document オブジェクトは Selection オブジェクトのメンバでもあります。図 7 に示すように、Document オブジェクトと Selection オブジェクトのどちらにも Bookmarks オブジェクトと Range オブジェクトが含まれています。以下の各項では、最上位のオブジェクトとオブジェクト間の相互関係について簡単に説明します。

Aa192495.wordobject007(ja-jp,office.11).gif


図 7. Application オブジェクトには、Document、Selection、Bookmark、Range の各オブジェクトが含まれます。

Application オブジェクト

Application は Word アプリケーションを表すオブジェクトで、その他すべてのオブジェクトの親オブジェクトとして位置付けられます。そのメンバは通常、Word 全体に適用されます。Application オブジェクトのプロパティおよびメソッドを使用すると、Word 環境を制御できます。

Document オブジェクト

Document は、Word のプログラミングの中心となるオブジェクトです。既存のドキュメントを開くか、新しいドキュメントを作成する際には、新しい Document オブジェクトを作成します。作成したオブジェクトは、Word の Documents コレクションに追加されます。フォーカスがあるドキュメントはアクティブ ドキュメントと呼ばれ、Application オブジェクトの ActiveDocument プロパティで表されます。

Selection オブジェクト

Selection は、現在選択されている領域を表すオブジェクトです。Word のユーザー インターフェイスで、テキストを太字にするなどの操作を実行する場合は、テキストを選択してから書式を適用します。Selection オブジェクトは、ドキュメント内に常に存在します。何も選択されていない場合には、Selection オブジェクトは挿入箇所を示します。連続しない複数のテキスト ブロックで Selection オブジェクトを構成することもできます。

Range オブジェクト

Range はドキュメント内の連続した領域を表すオブジェクトで、最初と最後の文字の位置によって定義されます。Range オブジェクトは 1 つに限定されません。同一ドキュメント内に複数の Range オブジェクトを定義できます。Range オブジェクトには、次のような特徴があります。

  • 挿入箇所のみを表す場合もあれば、一定範囲のテキストやドキュメント全体を表す場合もあります。
  • 空白、タブ文字、段落記号などの印刷されない文字も含まれます。
  • 現在選択されている領域を表す場合もあれば、別の領域を表す場合もあります。
  • 動的なオブジェクトであり、生成元のコードが実行されている間のみ存在します。

範囲の末尾にテキストを挿入すると、Word は範囲を自動的に拡大して、挿入したテキストを範囲の一部に組み込みます。

Bookmark オブジェクト

Bookmark オブジェクトは、開始位置と終了位置の両方を含むドキュメント内の連続領域を表すという点で Range オブジェクトに似ています。ブックマークは、ドキュメント内の位置をマークしたり、ドキュメント内のテキストを格納するために使用します。Bookmark オブジェクトは、挿入箇所のみを表す場合もあれば、ドキュメント全体を表す場合もあります。1 つのドキュメント内に複数のブックマークを定義することもできます。Bookmark オブジェクトは、次の点で Range オブジェクトとは異なります。

  • Bookmark オブジェクトには名前を付けることができます。
  • ドキュメントと共に保存されるため、コードの実行を停止した場合やドキュメントを閉じた場合でも消滅しません。
  • 既定では非表示になっていますが、View オブジェクトの ShowBookmarks プロパティを True に設定すると表示できます (View オブジェクトは、Application オブジェクトと Document オブジェクトの両方に存在する Window オブジェクトと Pane オブジェクトのメンバです)。

応用例

SelectionRangeBookmark の各オブジェクトを使用するシナリオをいくつか次に示します。

  • ブックマークはテンプレートに定義すると便利です。たとえば、ビジネス レター テンプレートでデータベースから取得したデータの挿入位置にブックマークを設定すると、コードの実行時にテンプレートに基づいて新しいドキュメントを作成し、データベースからデータを取得して、指定したブックマークが示す正しい位置にテキストを挿入することができます。
  • Bookmark オブジェクト内のテキストを変更する必要がある場合は、Bookmark オブジェクトの Range プロパティを使用して Range オブジェクトを作成し、Range オブジェクトのいずれかのメソッドでテキストを変更できます。
  • Bookmark オブジェクトを使用すると、ドキュメント内に定型文を定義できます。定型文の内容は、Range オブジェクトや Selection オブジェクトを基にして指定します。こうしておくと、後に条件に応じて各種の Bookmark オブジェクトに移動することによって、該当する定型文を他のドキュメントにコピーして貼り付けることができます。

これらはほんの一例であり、前述のオブジェクトを利用して強力なカスタム アプリケーションを作成する方法は他にも多数存在します。

Application オブジェクト

Word の Application オブジェクトは、Word アプリケーションそのものを表します。コードは必ず Application オブジェクトの記述から始まります。Application オブジェクトからは、Application オブジェクト自体のプロパティやメソッドだけでなく、Word に組み込まれているその他のすべてのオブジェクトおよびコレクションにアクセスできます。

ThisApplication の使用

Word 内の作業の場合、Application オブジェクトは自動的に作成されます。Application プロパティを使用すると、Word の Application オブジェクトへの参照を返すことができます。Visual Studio .NET ソリューションを作成する場合は、OfficeCodeBehind クラス内に定義された ThisApplication 変数を使用できます。

このクラスの外部から Word を自動化する場合は、次のように Word の Application オブジェクト変数を作成してから、Word のインスタンスを作成する必要があります。

ヒント    Word.Application 変数を宣言すると、OfficeCodeBehind クラスにおいて ThisApplication と同じように機能します。ただし、ThisApplication は既に作成されているため、新しい Word.Application 変数を明示的に作成する手順は必要ありません。

Application オブジェクトの下位にあるオブジェクトやコレクションを参照する場合は、Application オブジェクトを明示的に参照する必要はありません。たとえば、組み込みの ThisDocument プロパティを使用すれば、Application オブジェクトを使用せずにアクティブ ドキュメントを参照できます。ThisDocument はアクティブ ドキュメントを参照するプロパティであるため、これを使用して Document オブジェクトのメンバを処理することができます。Document オブジェクトの詳細については後述します。

ヒント   アクティブな Document オブジェクトを参照する ThisApplication.ActiveDocument プロパティは、最も使用頻度の高いプロパティと考えられますが、通常は ThisApplication.ActiveDocument 構文の代わりに ThisDocument を使用することをお勧めします。ActiveDocument も使用できますが、コードで使用するには、Application オブジェクトを付加して完全に限定する必要があります。ThisDocument を使用しても結果は同じになるため、あらかじめ変数が作成されている ThisDocument を使用する方が効率的です。

Application のプロパティ

Application オブジェクトへの参照を定義すると、そのメソッドおよびプロパティを扱えるようになります。Application オブジェクトには、コード内で Word の制御に使用できるメソッドとプロパティが多数用意されています。Application オブジェクトのメンバの大多数は、個別のドキュメントの内容に対してではなく、全般的な設定つまり環境に対して適用されます。一部のプロパティの設定または取得は 1 行のコードで実行できますが、より複雑なコードで取得する必要のあるプロパティもあります。

  • ActiveWindow : フォーカスがあるウィンドウを表す Window オブジェクトを返します。このプロパティを使用すると、フォーカスがある任意のウィンドウを処理できます。以下に示すサンプル コードでは、現在のドキュメントに基づいて新しいウィンドウを作成し、次に Window オブジェクトの Arrange メソッドを使用して、2 つのウィンドウを並べて表示します。Arrange メソッドでは、WdArrangeStyle.wdTiled 列挙値を使用していることに注意してください。
    ヒント   C# で開発する場合、Arrange メソッドには、Word の多くのメソッドの場合と同様に "ref" キーワードで 1 つまたは複数の引数パラメータを渡す必要があります。このため、メソッドに渡す引数パラメータをあらかじめ変数に格納しておく必要があります。どのような場合でも、Object 変数を作成し、メソッドに渡す値をこの変数に割り当ててから、ref キーワードを使用して変数を渡すことになります。このドキュメントには、この手法の例が多数記載されています。
  • ActiveDocument : アクティブ ドキュメント (フォーカスがあるドキュメント) を表す Document オブジェクトを返します。
  • ActivePrinter : アクティブなプリンタの名前を返すか、または設定します。
  • ActiveWindow : フォーカスがあるウィンドウを返します。
  • AutoCorrect : 現在のオート コレクト オプション、項目、および例外を返します。このプロパティは読み取り専用です。
  • Caption : 指定のドキュメント ウィンドウまたはアプリケーション ウィンドウのキャプション テキストを返すか、または設定します。次のコードのように Caption プロパティを使用すると、ドキュメント ウィンドウまたはアプリケーションのタイトル バーに "My New Caption" と表示できます。
  • CapsLock : CapsLock がオンになっているかどうかを示すブール値を返します。次のプロシージャを実行すると、CapsLock の状態が表示されます。
  • DisplayAlerts : コードの実行時における警告の処理方法を、WdAlertLevel 列挙値を使用して指定できます。WdAlertlevel には、すべてのメッセージと警告を表示する wdAlertsAll (既定値)、メッセージ ボックスのみを表示する wdAlertsMessageBox、警告もメッセージ ボックスも表示しない wdAlertsNone の 3 つの値があります。DisplayAlerts を wdAlertsNone に設定すると、ユーザーに対してメッセージや警告を表示せずにコードを実行できます。コードの実行が完了したら、必ず DisplayAlerts の設定を wdAlertsAll に戻すようにしてください (通常は Finally ブロックでリセットします)。
  • DisplayStatusBar : ステータス バーが表示されているかどうかを示すブール値を返す、読み書き可能なプロパティです。ステータス バーが表示されている場合は True を返し、表示されていない場合は False を返します。次のプロシージャを実行すると、ステータス バーの表示/非表示が切り替わります。
  • FileSearch : 絶対パスまたは相対パスを使用してファイルを検索します。FileSearch は、指定した検索条件に適合するファイル名を FoundFiles コレクションとして返します。
    ヒント   Visual Basic .NET で開発する場合、この例では引数パラメータはすべて省略可能なため、パラメータを Execute メソッドに渡す必要はありません。一方、C# で開発する場合はすべての引数パラメータを渡す必要があります。この例のコードでは、既定値と一致する値を指定しています。参照型のパラメータの場合は、Type.Missing 値を渡すと、値をまったく渡さなかった場合と同様に処理されます。値型のパラメータの場合は、実際の値を指定する必要があります。値型パラメータの既定値は、Word VBA ヘルプ ファイルで確認できます。
  • Path : Application オブジェクトに指定すると、現在のアプリケーションのパスが返されます。
    ヒント   アクティブ ドキュメントのパスを返すには、ThisDocument.Path を使用します。
  • Options : Word のアプリケーション設定を表す Options オブジェクトを返します。これにより、アプリケーションにさまざまなオプションを設定できます。例外もありますが、設定できるオプションの多くは [ツール] メニューの [オプション] ダイアログ ボックスに表示されるオプションです。次のコードでは、まず BackgroundSave プロパティと Overtype プロパティがオンになります。ファイルの印刷時には、すべてのフィールドが自動的に更新され、隠し文字とフィールド コードも印刷されます。
  • Selection : 選択範囲 (または挿入箇所) を表す読み取り専用オブジェクトです。Selection オブジェクトの詳細については後述します。
  • UserName : ユーザー名を取得または設定します。次のプロシージャを実行すると、現在のユーザー名が表示され、UserName プロパティが "Dudley" に設定されて、新しい UserName が表示されます。このコードでは、その後、UserName を元に戻しています。
  • Visible : Word アプリケーション自体の表示のオン/オフを切り替える、読み書き可能なプロパティです。Visible プロパティが False のときは、開いている Word のウィンドウがすべて非表示になり、ユーザーには、Word が終了し、すべてのドキュメントが閉じているように見えます (実際にはバックグラウンドで動作しています)。このため、Visible プロパティをコード内で False に設定した場合は、プロシージャが終了する前に必ず True に設定するようにしてください。次のコードでは、Try/Catch 例外ハンドラの Finally ブロックでこの設定を行っています。

Application のメソッド

Application オブジェクトには、Word アプリケーションに関する操作を実行するときに役立つメソッドがいくつか存在します。Application オブジェクトのメソッドを活用するコードの記述は、プロパティの場合と同様です。アプリケーション自体に関する操作を実行するには、以下のメソッドを使用します。

  • CheckSpelling : 文字列にスペル ミスがないかどうかをチェックします。スペル ミスが見つかった場合は True を返し、見つからない場合は False を返します。このメソッドは、あるテキストに対してスペル チェックを実行し、スペル ミスが存在するかどうかという問いに対して "はい" か "いいえ" の形で答えを求めるだけの場合に便利です。このメソッドではスペル ミスの内容は表示されず、修正もできません。次のコードでは、"Speling erors here" という文字列のスペルをチェックして、MessageBox で False という結果を表示しています。
    ヒント   この例は、Visual Basic .NET を使用すると C# に比べてはるかに開発が容易になるケースを示すもう一つの例です。CheckSpelling メソッドには、必須の文字列パラメータ 1 つに続いて多数のオプション パラメータを指定できます。C# で開発する場合は、一連の値を参照によって渡す必要があります。この例では、Type.Missing という値を格納した複数の変数を一括して渡しています。CheckSpelling のようなメソッドを複数回呼び出す必要がある場合は、メソッドの呼び出しをラップする "ヘルパー" クラスを作成すると便利です。このクラスには、Word のメソッド呼び出しに最も役立つ引数パラメータのみを表示するメソッドを組み込むことができます。
  • Help : [ヘルプ] ダイアログ ボックスを表示します。WdHelpType 列挙値のメンバを指定して、以下のリストから特定のダイアログ ボックスを選択します。
    • WdHelp : Microsoft Word のメインの [ヘルプ] ダイアログ ボックスを表示します。
    • WdHelpAbout : [ヘルプ] メニューの [バージョン情報] をクリックして [Microsoft Word のバージョン情報] ダイアログ ボックスを表示します。
    • WdHelpSearch : メインの [ヘルプ] ダイアログ ボックスとアンサー ウィザードを表示します。

    次のコード行を実行すると、[Microsoft Word のバージョン情報] ダイアログ ボックスが表示されます。

  • Move : 必須の Left 引数と Top 引数に基づいてアプリケーションのメイン ウィンドウを移動します。引数はどちらも整数値です。
  • Resize : 必須の Width 引数と Height 引数 (ポイント単位) に基づいて、アプリケーションのメイン ウィンドウのサイズを変更します。次の例では、アプリケーションを画面の左上隅に移動して、サイズも変更しています。
  • Quit : Word を終了します。必要に応じて、WdSaveOptions 列挙値 (wdSaveChangeswdPromptToSaveChanges、および wdDoNotSaveChanges) から値を渡すことにより、開いているすべてのドキュメントを保存することができます。次のコードは、Word を終了する 3 つの異なる方法をすべて示しています。
    ヒント    Application.Quit メソッドは、C# では特別な処理が必要になるメソッドの 1 つです。この場合、メソッドに必要なパラメータは 3 つあり、それぞれ参照によって渡す必要があります。
  • SendFax : FAX 送付状ウィザードを起動します (図 8 を参照)。ユーザーはウィザードの指示に従って順に操作を進めることにより、FAX 送付状を作成することができます。

    Aa192495.wordobject008(ja-jp,office.11).gif


    図 8. FAX 送付状ウィザードは SendFax メソッドで起動できます。

Word の組み込みダイアログ ボックスの使用

Word を使用して作業する場合、ユーザーに入力を求めるためにダイアログ ボックスの表示が必要になることがあります。独自のダイアログ ボックスを作成することもできますが、Word の組み込みダイアログ ボックスを使用した手法をとることもできます。組み込みダイアログ ボックスは、Application オブジェクトの Dialogs コレクションで公開されており、その数は 200 を超えます。各ダイアログ ボックスは、WdWordDialog 列挙値の値として表現されます。コード内で Dialog オブジェクトを使用するには、次に示すように、このオブジェクトを Word.Dialog として宣言します。

目的の Word ダイアログを指定するには、使用可能なダイアログの配列から返された値のいずれかを変数に割り当てます。

Dialog 変数を作成すると、この変数のメソッドを使用できるようになります。Show メソッドを使用すると、ユーザーが Word のメニューから手動で選択した場合と同様にダイアログ ボックスが表示されます。次のプロシージャを実行すると、[新規作成] ダイアログ ボックスが表示されます。

ヒント    Show メソッドを使用すると、TimeOut パラメータを使用して、ダイアログ ボックスを自動的に閉じるまでの待機時間をミリ秒単位の数値で指定できます。Visual Basic .NET では、このパラメータを省略できます。C# では、参照により Type.Missing を渡し、既定値 (タイムアウトなし) を指定します。

Word ダイアログは、ドキュメントのスペル チェックにも活用できます。次のプロシージャを実行すると、wdDialogToolsSpellingAndGrammar 列挙値に基づき、アクティブ ドキュメントに対してスペル チェッカーが起動します。

Word.Dialog メソッド

Word のダイアログ ボックスでは、Show のほかに、DisplayUpdateExecute の 3 つのメソッドを使用できます。

  • Display : 指定した組み込みの Word ダイアログ ボックスを表示し、ユーザーの操作または指定時間の経過によって閉じられるまでその状態を維持します。ダイアログ ボックスの通常の処理は一切実行されません。タイムアウト値は必要に応じて指定できます。次のプロシージャのコードでは、Display メソッドでタイムアウト値を指定し、[ユーザー情報] ダイアログ ボックスを約 3 秒間表示しています。このダイアログは、ユーザーが消さなければ自動的に閉じられます。
ヒント   C# で開発している場合、リテラル パラメータを単純なパラメータとして渡したくなりますが、そのように記述したコードはコンパイルできません。C# では、Object 変数を作成してリテラル値を割り当て、この変数を参照によって渡す必要があります。

ユーザーがダイアログ ボックスを消すときにどのボタンをクリックしたかという情報が必要な場合は、Display メソッドの結果を Integer 変数として返すことにより、クリックされたボタンに応じてコードを分岐させることができます。たとえば、[ユーザー情報] ダイアログ ボックスでユーザー名を編集したユーザーが [OK] ボタンをクリックした場合は変更を保存し、[キャンセル] ボタンをクリックした場合は編集内容を破棄する必要があります。

戻り値の一覧を表 1 に示します。

表 1. コマンド ボタンの戻り値

クリックされたボタン
-2閉じるボタン
-1[OK] ボタン
0 (ゼロ)[キャンセル] ボタン
> 0 (ゼロ)コマンド ボタン。1 の場合は最初のボタン、2 の場合は 2 番目のボタン、以下同様。

このダイアログ ボックスで加えた変更の保存操作を明示的に実行しない限り、ユーザーがどのボタンをクリックしたかに関係なく、変更はすべて破棄されます。ダイアログ ボックスでの変更を明示的に適用するには、Execute メソッドを使用する必要があります。

  • Execute : 単に Display メソッドを呼び出しただけでは、ユーザーがダイアログ ボックス内の値を変更しても、その変更は適用されません。ユーザーが加えた変更を明示的に適用するには、Display メソッドの後に Execute メソッドを使用する必要があります。ユーザーによる変更を保存する Save メソッドとは異なり、ユーザーが [OK] をクリックした場合でも変更はすべて破棄されます。次のコードでは、Display メソッドを使用して [ユーザー情報] ダイアログ ボックスを呼び出し、Integer 変数の戻り値を確認しています。ユーザーが [OK] ボタンをクリックした場合 (戻り値が -1 の場合) は、Execute メソッドにより変更が適用されます。
    ヒント   [ユーザー情報] ダイアログ ボックスの [名前] の値を取得するには、ThisApplication.UserName プロパティを使用します。
  • Update : ダイアログ ボックスに常に正しい値が表示されるようにするには、Update メソッドを使用します。ダイアログ ボックスの内容は、そのダイアログ ボックスへの参照を取得した後でもコードで変更できるため、必要に応じてダイアログ ボックスを表示する前にその内容を更新する必要があります (Word のダイアログ ボックスを非表示モードで使用する場合はこのメソッドが必要になりますが、詳細については次の項を参照してください)。

ダイアログの値の変更

Word のダイアログ ボックスの設計上の理由から、フォームのコントロールの値に対応する各種ダイアログのプロパティはいずれも実行時にしか使用できません。つまり Word では、ダイアログ ボックスを読み込む際に各種のプロパティが作成され、実行時に該当するオブジェクトに追加されます。このため、(C#、および Visual Basic .NET で Option Strict を オンに設定した場合のように) 厳密に型指定された環境では、コンパイル可能なコードを記述することが難しくなっています。

たとえば、(WdWordDialog.wdDialogFilePageSetup 列挙値で表される) [ページ設定] ダイアログ ボックスには、PageWidthPageHeight など、ページ設定を処理するプロパティが多数用意されています。これらのプロパティにアクセスすることを意図して、次のようなコードを記述したとします。

残念ながら、Visual Basic .NET で Option StrictOn に設定している場合には、このコードはコンパイルできません。C# の場合も同様です。これは、Dialog オブジェクトの PageWidth プロパティと PageHeight プロパティが実行時まで定義されないためです。

これらのプロパティを扱う方法は 2 つあります。先頭に Option Strict Off と記述した Visual Basic ファイルを作成する方法と、何らかの方法で遅延バインディンクを実行する方法です (もちろん、System.Reflection 名前空間を使用する複雑な手順を踏んで、遅延バインディングを自分自身で実行することもできます。これは、Option Strict をオフにした場合に Visual Basic .NET がバックグラウンドで実行する処理です)。Microsoft.VisualBasic アセンブリの CallByName メソッドを使用すると、対話処理するプロパティの名前を文字列として指定できます。このとき、プロパティの値と実行する操作も合わせて指定できます。このメソッドは、Visual Basic .NET と C# のどちらで開発する場合も使用できます。当然ながら、C# でこの方法を用いるには Microsoft.VisualBasic アセンブリへの参照を追加する必要があります。

アセンブリへの参照を設定すると、次のようなコードを追加できます。

これは理想的な解決方法ではありません。このコードは理解も記述も容易ではなく、Visual Basic のメソッドを使用する必要がある点で C# による開発者にとっては厳しい解決方法です。しかし、これ以外の方法では利用できないプロパティのセットを扱う手段としては有用です。

サンプル プロジェクトには、[ページ設定] ダイアログ ボックスを使用して現在のドキュメントのページ設定を変更するプロシージャが組み込まれています。このコードでは、Dialog クラスの Execute メソッドを使用し、実際には一切ダイアログ ボックスを表示せずに処理を実行しています。これは問題のない適正な動作であり、この方法により、数多くのプロパティを複数のオブジェクトに分散させることなく 1 か所で設定することができます。

ヒント   Word では、単位の使い方が複雑になることがあります。Word の値の大多数はポイント (1/72") 単位ですが、3 インチを意味する "3"" のような文字列を渡すことによって、いつでも単位をオーバーライドできます。サンプルでは、必要な引用符の付加を処理する ConvertToInches メソッドを使用しています。注目すべき点は、PageWidth プロパティと PageHeight プロパティではユーザーが設定した既定の単位を使用するのに対し、この例の他のプロパティでは、ポイントか、値と単位インジケータを含む文字列を使用することです。したがって、既定値でインチを使用する国では、この例の最初の 2 つのプロパティについて ConvertToInches を呼び出す必要はありません。ただし、このメソッドを呼び出しても問題はありません。

組み込みダイアログ ボックスを使用するかどうかは、作業量に基づいて判断します。1 つのオブジェクトに設定するプロパティが少数の場合は、単にこのオブジェクトを処理した方が楽でしょう。対話処理のためユーザーにインターフェイスを表示する必要がある場合は、これに対応するダイアログ ボックスを使用するのが確実な方法です。その他の Word 組み込みダイアログ ボックスの使用法については、Word のヘルプ ファイルを参照してください。

ヒント   Word の Dialog オブジェクトを十分に活用するには、Word に組み込まれているヘルプ ファイルに加えてさらに詳しい情報を参照する必要があります。このヘルプ ファイルでは、Word に用意されている膨大なダイアログ ボックスにはほとんど触れていません。詳細情報を参照するには、Word 95 の WordBasic ヘルプ ファイルが必要です。このヘルプ ファイルは、www.microsoft.com にあります。「Word 95 WordBasic Help File」と入力して、該当するページを検索してください。

Document オブジェクト

Word でのプログラミング作業では、Document オブジェクトやそのコンテンツを必要とすることが多々あります。Word で特定のドキュメント (アクティブ ドキュメント) を操作する場合、Application オブジェクトの ActiveDocument プロパティを使用して参照できます。Word のすべての Document オブジェクトは Application オブジェクトの Documents コレクションのメンバでもあります。このコレクションには現在開いているすべてのドキュメントが属します。Document オブジェクトを使用して操作できるドキュメントは 1 つですが、Documents コレクションを使用した場合は開いているすべてのドキュメントを操作できます。ドキュメント操作は Application レベルと Document レベルのどちらでも実行できるため、Application クラスと Document クラスは多くのメンバを共有しています。

ドキュメントに関して実行できる一般的なタスクの例を挙げると、次のようになります。

  • ドキュメントの作成および開く操作
  • テキストの追加、検索、置換
  • 印刷

Document オブジェクトのコレクション

ドキュメントは文字を並べた単語から構成され、各単語は文を構成します。文は段落を構成し、さらに段落はセクションを構成します。各セクションには、それぞれヘッダーとフッターがあります。Document オブジェクトには、これらの構造に対応するコレクションがあります。

  • 文字
  • 単語
  • 段落
  • セクション
  • ヘッダー/フッター

ドキュメントの参照

Document オブジェクトは、インデックス値を使用して Documents コレクションのメンバとして参照できます。インデックス値は Documents コレクション内での Document オブジェクトの位置を示します。このコレクションは (Word 内のすべてのコレクションと同様に) 1 から始まります。次のコードは、Documents コレクション内にある最初の Document オブジェクトを参照するオブジェクト変数を設定しています。

ドキュメントは名前で参照することもできます。通常、特定のドキュメントを操作する場合は名前を使用したほうが賢明です。Documents コレクション内におけるドキュメントのインデックス値は、他のドキュメントを開いたり閉じたりするたびに別の番号に変更される可能性があるため、この値を使用してドキュメントを参照することはほとんどありません。次のコードは、"MyDoc.doc" という名前のドキュメントを指定するオブジェクト変数を設定しています。

アクティブ ドキュメント (フォーカスのあるドキュメント) を参照する場合は、Application オブジェクトの ActiveDocument プロパティを使用できます。既に Visual Studio .NET プロジェクトにこのプロパティを作成してあり、フォーカスのあるドキュメントを参照する必要がある場合は、ThisDocument 参照を使用すると、より効率的にコードを作成できます。次のコードは、アクティブ ドキュメントの名前を取得します。

ドキュメントを開く、閉じる、新規作成する

Word プロジェクトで ThisDocument オブジェクトの参照を使用すると、Document オブジェクトのすべてのメンバにアクセスできるようになり、このオブジェクトのメソッドとプロパティをアクティブ ドキュメントに適用して操作できます。 Document オブジェクトを操作する最初のステップは、既存の Word ドキュメントを開いたり新規ドキュメントを作成したりすることです。

Word ドキュメントの新規作成

新しい Word ドキュメントを作成する場合は、Application オブジェクトの、開いている Word ドキュメントの Documents コレクションに新規ドキュメントを追加します。したがって、Add メソッドで新しい Word ドキュメントを作成することになります。この操作は、ツール バーにある [新規作成] ボタンをクリックするのと同じです。

ヒント    Documents.Add メソッドには、必要に応じて最大 4 つのパラメータを指定できます。各パラメータは、テンプレート名、新しいテンプレート名、ドキュメントの種類、新規ドキュメントの表示/非表示を示します。C# の場合、これらの省略可能なパラメータの既定値を利用するには、それぞれのパラメータの参照として Type.Missing を渡す必要があります。

Add メソッドには、必要に応じて引数 Template を指定でき、この引数によって Normal.dot 以外のテンプレートに基づく新しいドキュメントを作成できます。この場合、そのテンプレートの存在する絶対パスとファイル名を指定する必要があります。

このコードは、[ファイル] メニューの [新規作成] をクリックし、[新規作成] ツール バーからテンプレートを選択した場合と同じ結果になります。 Template 引数を指定するコードを記述すると、すべてのドキュメントが、指定したテンプレートを使用して作成されます。専用の新規ファイル作成ルーチンをコーディングしておくことは、長期的に見た場合、適切なテンプレートを選ぶ必要がある場面で混乱するかもしれないユーザーにとって便利です。

既存のドキュメントを開く

既存のドキュメントを開くには、Open メソッドを使用します。基本的な構文は非常に簡単です。Open メソッドを使用して、絶対パスとファイル名を指定します。他にも、パスワードや、ドキュメントを読み取り専用で開くかどうかなどを指定できる省略可能な引数があります。これらの引数は、コード ウィンドウで IntelliSense を使用すると表示されます。次のコードでは、複数ある省略可能なパラメータの中から 1 つのパラメータのみを指定してドキュメントを開いています。当然ながら、C# コードの場合は、FileName パラメータに実際の値を指定するだけであってもすべてのパラメータを渡す必要があります。

ドキュメントの保存

ドキュメントを保存したり閉じたりする方法は、いくつかあります。これらは行いたい処理内容によって使い分けます。ドキュメントを保存する場合は Save メソッド、閉じる場合は Close メソッドというように、2 つのメソッドを使い分けます。これらのメソッドは、使用する方法によって結果が異なります。メソッドを Document オブジェクトに適用した場合は、そのドキュメントのみが処理対象になります。Documents コレクションに適用した場合は、すべてのドキュメントが処理対象になります。

  • すべてのドキュメントの保存 : Save メソッドを Documents オブジェクトに適用すると、開いているすべてのドキュメントに変更内容が保存されます。このメソッドは、変更内容の保存をユーザーに確認するのか、またはユーザーを介することなく保存操作を実行するのかによって 2 とおりの使用方法があります。単に Documents コレクションに対して Save メソッドを呼び出した場合は、すべてのファイルの保存を確認するメッセージがユーザーに対して表示されます。
  • 次のコードでは、NoPrompt パラメータを True に設定し、開いているすべてのドキュメントをユーザーを介さずに保存しています。
    ヒント   NoPrompt の既定値は False です。したがって、Visual Basic .NET の場合は NoPrompt の値を指定しない状態で、C# の場合は Type.Missing を指定した状態でそれぞれ Save を呼び出すと、確認メッセージが表示されます。
  • 単一ドキュメントの保存 : Save メソッドを使用して、指定した Document オブジェクトに変更内容を保存します。次のコードは、アクティブ ドキュメントを保存する 2 つの方法を示しています。
  • 保存対象のドキュメントがアクティブ ドキュメントであるかどうかを判別できない場合は、ドキュメントを名前で参照できます。このコードでは、名前を指定したドキュメントに対して Save メソッドを使用しています。
    ヒント   Visual Basic .NET を利用して開発する場合は、Visual Basic の標準的な構文 (Item プロパティの呼び出しやこの呼び出しの省略、インデックスまたは名前の指定) を使用してさまざまなコレクションから項目を取得できますが、C# の場合はこのようなことがほとんどできません。その代わり、C# で開発する場合は一般的に、ここに記述した例のように隠しメソッド get_Item を呼び出し、参照によってインデックスや名前を渡す必要があります。C# による開発者は、(前に Dialogs 配列で示したように) 配列の要素に直接アクセスできます。ただし、コレクションの場合は get_Item メソッドを使用する必要があります。
  • ドキュメントのインデックス番号を使用する構文を利用することもできますが、この方法は、次の 2 つの理由から信頼性が劣ります。第一に、インデックス番号が変わる可能性があるため、参照先のドキュメントを確定できません。第二に、参照ドキュメントが一度も保存されていない場合に保存ダイアログ ボックスが表示されます。次のコードでは、Documents コレクション内の最初のドキュメントを保存しています。
  • SaveAs : SaveAs メソッドを使用すると、ドキュメントに別のファイル名を付けて保存できます。この場合、新しいファイル名を指定する必要がありますが、その他の引数は省略できます。次のプロジージャでは、パスとファイル名をハードコーディングしてドキュメントを保存しています。指定した名前のファイルが既にそのフォルダに存在する場合は、確認することなく上書きされます (SaveAs メソッドには、必要に応じてパラメータをいくつか指定できます。C# の場合は、すべてのパラメータを記述する必要があります)。

ドキュメントを閉じる

Close メソッドは、ドキュメントを閉じる場合だけでなく、保存する場合にも使用できます。ドキュメントは、個別に閉じることも、一度にすべてを閉じることもできます。

  • すべてのドキュメントを閉じる : Close メソッドは、Documents コレクションに対して適用すると Save メソッドに類似した機能を果たします。このメソッドを引数なしで呼び出すと、保存されていないすべてのドキュメントについて、変更内容の保存を促すメッセージが表示されます。

    Save メソッドと同様に、Close メソッドには省略可能な引数 SaveChanges を指定でき、この引数には WdSaveOptions 列挙値である wdDoNotSaveChangeswdPromptToSaveChangeswdSaveChanges の 3 つを指定できます。次のコードは、開いているドキュメントをすべて閉じます。1 つは確認なしで保存し、1 つは変更内容を破棄します。

    メモ    Application.Quit メソッドを呼び出すと、Word が終了します。開いていたドキュメントをすべて閉じても Word は終了しません。開いていたドキュメントをすべて閉じても Word は依然動作しているため、別途、終了処理を実行する必要があります。
  • 単一ドキュメントを閉じる : 次のコードは、変更内容を保存せずにアクティブ ドキュメントを閉じる方法と、MyNewDocument の変更内容を自動的に保存して閉じる方法を示しています。

Domuments コレクション内でのループ

Documents コレクション全体において反復処理を行う必要が生じることはほとんどなく、通常はドキュメントごとに操作を行うことになります。ただし、状況によっては、開いているすべてのドキュメントをそれぞれ参照し、条件に応じた操作を実行する必要が出てくることもあります。Documents コレクション内の Word ドキュメントは名前、またはコレクション内でのインデックスで参照できます。また、Visual Basic .NET の場合は For Each ループ、C# の場合は foreach ループを使用して、複数のドキュメントにわたって反復処理を行うことができます。ループ内では、選択したファイルに対して条件に応じた操作を実行できます。次のコード例は、開いているすべてのドキュメントを参照し、ドキュメントが保存されていない場合は保存します。

このサンプル プロシージャでは、次のアクションが実行されます。

  • 開いているドキュメントのコレクション内をループする。
  • 各ドキュメントの Saved プロパティを確認し、保存されていなければ保存する。
  • 保存した各ドキュメントの名前を収集する。
  • 保存した各ドキュメントの名前を MessageBox で表示するか、文字列の長さに基づいて、保存対象となるドキュメントがなかったことを示すメッセージを表示する。

Selection オブジェクト

Selection オブジェクトは、Word ドキュメント内で現在選択されている領域を示します。Word のユーザー インターフェイスで、テキストを太字にするなどの操作を実行する場合は、テキストを選択してから書式を適用します。コードにおいても同様に、Selection オブジェクトで一定の領域を選択してから操作を実行します。Selection オブジェクトを使用すると、ドキュメント内のテキストについて選択、書式設定、操作、および印刷を行うことができます。

Selection オブジェクトは、ドキュメント内に常に存在しています。何も選択されていない場合、このオブジェクトは挿入箇所を示します。したがって、Selection オブジェクトに何らかの処理を実行するには、このオブジェクトが何を表しているかを認識しておくことが重要です。

メモ    Selection オブジェクトと Range オブジェクトは、多数のメンバを共有しています。この 2 つの違いは、Selection オブジェクトがユーザー インターフェイスに表示されているものを参照するのに対して、Range オブジェクトは表示されないことです (ただし、このオブジェクトの Select メソッドを呼び出すことで表示は可能です)。
ヒント    Selection オブジェクトを使用する場合は、ユーザーの選択を変更してしまうことに注意してください。ユーザーの選択を変更せずにドキュメントの一部を操作する必要がある場合は、特定の範囲、段落、文 などを使用します。

Type プロパティの使用

選択内容にはさまざまな種類があるため、何かが選択されている場合は、何が選択されているかを把握することが重要です。たとえば、表内の列を操作する場合、ランタイム エラーの発生を回避するため、確実に対象列が選択されているようにする必要があります。これは、Selection オブジェクトの Type プロパティを使用することで容易に実現できます。Type プロパティには次の WdSelectionType 列挙値が含まれており、これらの値をコーディングで使用して、何が選択されているかを判別できます。

  • wdSelectionBlock
  • wdSelectionColumn
  • wdSelectionFrame
  • wdSelectionInlineShape
  • wdSelectionIP
  • wdSelectionNormal
  • wdNoSelection
  • wdSelectionRow
  • wdSelectionShape

ほとんどの列挙値の目的は名前からわかりますが、一部の値については少々不明瞭です。たとえば、wdSelectionIP は挿入箇所を示します。wdInlineShape はイメージまたは画像を示します。wdSelectionNormal という値は、選択されているテキスト、またはテキストと他の選択オブジェクトの組み合わせを示します。

次のプロシージャのコードでは、選択内容の種類を判別するために Selection の Type プロパティを利用しています。テストを行うには、サンプル ドキュメントにテキストを入力して選択し、デモ用フォームを実行します。このコードは、現在の Selection オブジェクトの Type プロパティを判別する以外には何も行いません。単に Case 構造を使用して値を文字列変数に格納し、MessageBox で表示します。

移動およびテキストの選択

選択内容の判別に加え、Selection オブジェクトにある次のメソッドを使用してドキュメント内を移動し、別の範囲を選択することができます。これらのメソッドは、キーボードでのキー操作に類似しています。

Home キーおよび End キーのメソッド

これらのメソッドを使用して、選択範囲を変更することもできます。

HomeKey ([Unit], [Extend]): キーボードの Home キーを押した場合と同様に動作します。

EndKey ([Unit], [Extend]): キーボードの End キーを押した場合と同様に動作します。

次の wdUnits 列挙値のいずれかを Unit 引数に指定します。この引数によって移動範囲が決定します。

  • WdLine : 行の先頭または末尾に移動します。この値は既定値です。
  • WdStory : ドキュメントの先頭または末尾に移動します。
  • WdColumn : 列の先頭または末尾に移動します。表でのみ有効です。
  • WdRow : 行の先頭または末尾に移動します。表でのみ有効です。

次の WdMovementType 列挙値のいずれかを Extend 引数に指定します。この引数によって、Selection オブジェクトが、拡大された範囲と挿入箇所のどちらになるか決定します。

  • WdMove : 選択範囲を移動します。最終的に、Selection オブジェクトは挿入箇所を示します。wdLine を使用すると、挿入箇所が行の先頭または末尾に移動します。wdStory を使用すると、挿入箇所がドキュメントの先頭または末尾に移動します。
  • WdExtend : 選択範囲を拡大します。最終的に、Selection オブジェクトには、挿入箇所から終点までの範囲が含まれます。開始位置と挿入箇所が同一でない場合は、使用するメソッドによって動作が異なります。たとえば、行が選択されている状態で、HomeKey メソッドを wdStorywdExtend の列挙値を指定して呼び出すと、その行は新しい選択範囲から除外されます。また、EndKey メソッドを wdStorywdExtend の列挙値を指定して呼び出すと、その行は選択範囲に含まれます。この動作は、キーボード ショートカットの Ctrl + Shift + HomeCtrl + Shift + End の動作にそれぞれ対応しています。

次のコードでは、HomeKey メソッドを wdStory および WdMovementTypewdMove の列挙値を指定して使用し、挿入箇所をドキュメントの先頭に移動します。その後、EndKey メソッドを wdExtend 列挙値を指定して使用し、選択範囲をドキュメントの末尾まで拡張します。

方向キーのメソッド

選択範囲は、次のメソッドを使用して移動することもできます。各メソッドでは、指定した方向に移動する単位数を表す Count 引数を使用します。これらのメソッドは、キーボード上の方向キーを使用した場合の動作に対応します。

  • MoveLeft ([Unit], [Count], [Extend])
  • MoveRight ([Unit], [Count], [Extend])
  • MoveUp ([Unit], [Count], [Extend])
  • MoveDown ([Unit], [Count], [Extend])

Extend 引数には、前に示したのと同様に列挙値 wdMove および wdExtend を指定します。MoveLeft メソッドと MoveRight メソッドの Unit 引数に利用できる WdUnits の列挙値は複数あります。

  • wdCharacter : 文字単位で移動します。この値は既定値です。
  • wdWord : 単語単位で移動します。
  • wdCell : セル単位で移動します。表でのみ有効です。
  • wdSentence : 文単位で移動します。

次のコードでは、挿入箇所を左に 3 文字分移動し、挿入箇所から右に 3 単語分選択します。

MoveUp メソッドおよび MoveDown メソッドには、次の WdUnits の列挙値を指定します。

  • wdLine : 行単位で移動します。この値は既定値です。
  • wdParagraph : 段落単位で移動します。
  • wdWindow : ウィンドウ単位で移動します。
  • wdScreen : 画面単位で移動します。

次のコードでは、挿入箇所を上に 1 行分移動し、そこから 3 段落分選択します。選択範囲が実際にどこまで及ぶかは、挿入箇所の場所や、操作を開始した時点でテキスト範囲が選択されていたかどうかによって異なります。

Move メソッド

Move メソッドを使用すると、指定された範囲や選択が縮小され、縮小されたオブジェクトが指定した単位数分だけ移動します。次のコードでは、元の Selection オブジェクトを縮小し、3 単語分だけ移動しています。この結果、3 番目の単語の先頭に挿入箇所が移動します。単語自体が移動するわけではありません。

テキストの挿入

テキストをドキュメントに挿入する最も簡単な方法は、Selection オブジェクトの TypeText メソッドを使用することです。TypeText の動作は、ユーザーのオプション設定によって異なります。次のプロシージャのコードでは、Selection オブジェクト変数を宣言し、上書きオプションが有効になっていた場合は無効にします。上書きオプションがアクティブになっていると、挿入箇所以降のテキストがすべて上書きされます。

次のコードでは、現在の選択内容が挿入箇所であるかどうかの確認テストを行います。挿入箇所であった場合は TypeText を使用して文を挿入し、TypeParagraph メソッドを使用して段落記号を挿入します。

ElseIf/else if ブロック内のコードでは、選択範囲が通常の選択範囲であるかどうかを確認します。通常の選択範囲であった場合は、別の If ブロックで ReplaceSelection オプションが有効かどうかを確認します。オプションが有効であった場合は、Selection の Collapse メソッドを使用して選択範囲を縮小し、選択したテキスト ブロックの先頭に挿入箇所を移動します。さらに、テキストと段落記号を挿入します。

選択範囲が挿入箇所または選択したテキスト ブロックでない場合は、何も実行されません。

Selection オブジェクトの TypeBackspace メソッドを使用することもできます。このメソッドは、キーボードの BackSpace キーと同様の機能を果たします。ただし、テキストの挿入と操作に関しては、Range オブジェクトのほうが制御機能が充実しています。

Range オブジェクト

Range はドキュメント内の連続した領域を表すオブジェクトで、最初と最後の文字の位置で定義して作成します。Range オブジェクトは 1 つに限定されません。同一ドキュメント内に複数の Range オブジェクトを定義できます。指定範囲の始点と終点を同じ場所に定義すると、その範囲は挿入箇所になります。また、ドキュメントの最初の文字から最後の文字までを指定して、ドキュメント全体を網羅した範囲を定義できます。範囲には、空白、タブ、段落記号など、印刷されない文字もすべて含まれます。

メモ   作成した範囲は、記述したコードが動作している間のみ機能します。

Range オブジェクトは、多数のメンバを Selection オブジェクトと共有しています。この 2 つの主な違いは、Selection オブジェクトが常にユーザー インターフェイスで選択範囲への参照を返すのに対して、Range オブジェクトはユーザー インターフェイスに範囲を表示することなくテキストを処理できることです。

Selection オブジェクトではなく Range オブジェクトを使用する主な利点は次のとおりです。

  • 一般的に言って、特定のタスクを実行する場合を比較すると、Range オブジェクトの方がコードの行数が少なくなります。
  • Range オブジェクトを使用すると、アクティブ ドキュメント内で強調表示の移動や変更を行うときの Word 関連のオーバーヘッドが発生しません。
  • 後で説明しますが、Range オブジェクトは Selection オブジェクトよりも多くの機能を備えています。

範囲の定義と選択

Document オブジェクトの Range メソッドを使用して開始値と終了値を指定することによって、ドキュメント内に範囲を定義できます。次のコードでは、アクティブ ドキュメントの最初の 7 文字 (印刷されない文字を含む) を包含する Range オブジェクトを新しく作成します。さらに、Range オブジェクトの Select メソッドを使用して、指定範囲を強調表示します。この行のコードを省略した場合、Range オブジェクトは Word のユーザー インターフェイスで選択状態になることはありませんが、プログラムで処理することはできます。

図 9 に実行結果を示します。実行結果には段落記号と空白が含まれます。

Aa192495.wordobject009(ja-jp,office.11).gif


図 9. Range オブジェクトには印刷されない文字が含まれます。

文字数のカウント

ドキュメント内の最初の文字の位置は 0 です。これは挿入箇所を示しています。最後の文字の位置は、ドキュメント内の文字数と同じです。ドキュメント内の文字数は、Characters コレクションの Count プロパティを使用して確認できます。次のコードでは、ドキュメント全体を選択し MessageBox で文字数を表示します。

ヒント   Visual Basic .NET では、パラメータを指定しないで Range メソッドを呼び出すと範囲全体を返します。したがって、ドキュメントの内容全体を処理する場合は、開始値と終了値を指定する必要はありません。C# の場合は、すべての省略可能なパラメータに対して必ず値を渡す必要があるため、当然この機能は適用できません。C# では、すべての省略可能なパラメータについて Type.Missing を渡すことで既定値を使用できます。

範囲の設定

文字数に関係なくドキュメント全体を選択する場合は、Document オブジェクトの Select メソッドを Range プロパティに対して使用することができます。

必要に応じて、Document オブジェクトの Content プロパティを使用し、ドキュメントからヘッダー、フッターなどを除いた本文のみを包含する範囲を定義できます。

他のオブジェクトのメソッドとプロパティを使用して、範囲を決定することもできます。次のプロシージャのコードは、次に示すアクションを実行してアクティブ ドキュメントの 2 番目の文を選択します。

  • Range 変数を作成する。
  • ドキュメント内に少なくとも 2 つの文が存在することを確認する。
  • Range メソッドの Start 引数を 2 番目の文の先頭に設定する。
  • Range メソッドの End 引数を 2 番目の文の末尾に設定する。
  • 範囲を選択する。
メモ    Range プロパティに渡すパラメータは System.Object として宣言されているため、これらの値を明示的に変換するようにコーディングする必要があります。Visual Basic .NET を利用していて Option Strict が オフに設定されている場合は、この操作を行う必要はありません。C# を利用している場合は、これまで説明したように、これらの値を参照で渡す必要があります。
ヒント   C# で開発する場合、Documents コレクションの要素は隠しメソッド get_Item を使用して個別に取得する必要がありましたが、ParagraphsSentences、およびその他のプロパティは配列を返します。したがって、C# による開発者は、これらの配列に対して他の配列と同様にインデックスを付けることができます。

2 番目の文を選択することが目的である場合は、Sentence オブジェクトに直接範囲を設定することで実現でき、コードの行数も節約できます。次のコードは、前に示したプロシージャと同様に機能します。

範囲の拡張

Range オブジェクトを定義すると、MoveStart メソッドおよび MoveEnd メソッドを使用して、現在の指定範囲を拡張できるようになります。MoveStart メソッドおよび MoveEnd メソッドにはそれぞれ、Unit と Count という 2 つの引数を指定します。Unit 引数には、次の WdUnits の列挙値のいずれかを指定します。

  • wdCharacter
  • wdWord
  • wdSentence
  • wdParagraph
  • wdSection
  • wdStory
  • wdCell
  • wdColumn
  • wdRow
  • wdTable

Count 引数は、移動する単位数を指定します。次のコードでは、ドキュメント内の最初の 7 文字で構成される範囲を定義しています。さらに、Range オブジェクトの MoveStart を使用して、指定範囲の開始位置を 7 文字分移動します。指定範囲の末尾も 7 文字であるため、結果的にこの範囲は挿入箇所になります。MoveEnd メソッドを使用して、終了位置を 7 文字分移動します。

図 10 は、コードの進行状況を示しています。1 行目は最初の指定範囲、2 行目は MoveStart メソッドによって開始位置が 7 文字分移動した後 (指定範囲は I バーで示す挿入箇所に変化)、3 行目は MoveEnd ステートメントによって範囲の終了位置が 7 文字分移動した後に選択されている文字をそれぞれ示します。

Aa192495.wordobject010(ja-jp,office.11).gif


図 10. MoveStart メソッドおよび MoveEnd メソッドを使用した範囲サイズの変更

範囲内の最初と最後の文字の取得

次のコードに示すように、Range オブジェクトの Start プロパティと End プロパティを取得すると、範囲の最初と最後にある文字位置を取得できます。

SetRange を使用した範囲のリセット

SetRange を使用して既存の範囲のサイズを変更することもできます。次のコードでは、ドキュメント内の最初の 7 文字で始まる範囲を初期の範囲として設定します。さらに、SetRange を使用して、範囲の開始位置を 2 番目の文に、終了位置を 5 番目の文末にそれぞれ変更しています。

テキストの書式設定

Range オブジェクトを使用してテキストの書式を設定することもできます。コード内で実行する必要があるステップは次のとおりです。

  • 書式を設定する範囲を定義する。
  • 書式設定を適用する。
  • 必要に応じて、書式を設定した範囲を選択して表示する。

次のサンプル プロシージャでは、ドキュメントの最初の段落を選択し、フォント サイズ、フォント名、配置を変更します。さらに、範囲を選択して MessageBox を表示し、一時停止してから次のコード セクションに実行を移して、Document オブジェクトの Undo メソッドを 3 回呼び出します。その次のコード ブロックでは、標準インデント スタイルを適用して MessageBox を表示し、コードの実行を一時停止します。その後、Undo メソッドを 1 回呼び出して MessageBox を表示します。

ヒント    Range.Style プロパティは Variant 型が指定されることを想定しているため、C# による開発者は、スタイルを設定するために Range クラスの隠しメソッドである set_Style を呼び出す必要があります。範囲に対してスタイルを適用するには、set_Style メソッドにスタイル名と Style オブジェクトのいずれかを参照によって渡します。VBA で読み取り/書き込みのプロパティが Variant 型で定義されている場合、C# による開発者は、set_Styleget_Style など、適切な隠しアクセサ メソッドを呼び出す必要があります。Visual Basic .NET の場合は、プロパティの値を直接設定したり取得したりすることができます。

テキストの挿入

Range オブジェクトの Text プロパティを使用して、ドキュメント内でテキストを挿入したり置き換えたりすることができます。次のコードでは、ドキュメントの先頭を挿入箇所とする範囲を指定し、" New Text " (空白に注意) というテキストを挿入箇所に挿入します。さらに、このコードでは、挿入したテキストが含まれている Range を選択します。図 11 に、コードの実行結果を示します。

Aa192495.wordobject011(ja-jp,office.11).gif


図 11. 挿入箇所への新しいテキストの挿入

範囲内のテキストの置換

設定した範囲が挿入箇所ではなく選択範囲である場合は、範囲内のすべてのテキストが挿入テキストに置換されます。次のコードでは、ドキュメント内の最初の 12 文字で構成される Range オブジェクトを作成します。その後、この文字は別の文字列に置換されます。

Aa192495.wordobject012(ja-jp,office.11).gif


図 12. 新しいテキストへの既存テキストの置換

指定範囲または選択範囲の縮小

Range オブジェクトまたは Selection オブジェクトを操作する場合、選択範囲を以前の挿入箇所に変更して、既存のテキストが上書きされないようにする必要があります。Range オブジェクトおよび Selection オブジェクトには Collapse メソッドがあり、このメソッドは 2 種類の WdCollapseDirection 列挙値を使用できます。

  • WdCollapseStart : 選択範囲を先頭まで縮小します。列挙値を指定しない場合は、この値が既定値になります。
  • WdCollapseEnd : 選択範囲を先頭まで縮小します。

次のプロシージャでは、ドキュメント内の最初の段落で構成される Range オブジェクトを作成します。さらに、wdCollapseStart 列挙値を使用して範囲を縮小します。その後、新しいテキストを挿入して範囲を選択します。図 13 に、結果を示します。

Aa192495.wordobject013(ja-jp,office.11).gif


図 13. 段落範囲の縮小後に挿入したテキストは、段落の先頭に挿入されます。

wdCollapseEnd の値を使用すると、新しいテキストは後続の段落の先頭に挿入されます。

Aa192495.wordobject014(ja-jp,office.11).gif


図 14. 段落の末尾まで縮小すると、テキストは次の段落に挿入されます。

新しい文が段落記号の前に挿入されることを想像したユーザーもいるかもしれませんが、元の範囲内に段落記号があるため、そのように動作することはありません。次の項で、テキストを安全に挿入するための段落記号の操作方法を説明します。

テキストの挿入と段落記号の処理

Range オブジェクトを段落単位で作成すると、印刷されない文字もすべて含まれることになります。次のプロシージャ例では、2 個の文字列変数を宣言し、アクティブ ドキュメントの最初と 2 番目の段落の内容を取得します。

次のコードでは、最初と 2 番目の段落で利用するために 2 つの Range 変数を作成して Text プロパティを割り当て、2 つの段落間でテキストを入れ替えています。さらに、各範囲を順に選択し、選択の合間に MessageBox ステートメントで一時停止して結果を表示します。図 15 に、入れ替え後のドキュメントを示します。ここでは、rng1 が選択されています。

Aa192495.wordobject015(ja-jp,office.11).gif


図 15. 最初と 2 番目の段落が入れ替わり、rng1 が選択されています。

次のコード セクションでは、MoveEnd メソッドを使用して rng1 を調整し、rng1 に段落記号が含まれないようにします。さらに、Range オブジェクトの Text プロパティに新しい文字列を割り当てて、最初の段落にある残りのテキストを置換します。

次のコード セクションは、段落記号も含め rng2 内のテキストを置換します。

さらに、rng1 を選択して一時停止し、MessageBox で結果を表示します。rng2 について同様の処理を行います。rng1 は段落記号を含まないように再定義されているため、元の段落書式は維持されます。rng2 の段落記号は新しい文で上書きされたため、段落としての機能はなくなります。図 16 に、rng2 が強調表示されている状態を示します。rng2 は当初の 3 番目の段落に結合され、独立した段落ではなくなっています。

Aa192495.wordobject016(ja-jp,office.11).gif


図 16. rng2 に挿入された新しい内容によって、段落記号が上書きされました。

両方の範囲に含まれていた元の内容は String 変数として保存されているため、2 つの段落を元の順番に並べた状態にドキュメントを復元することは、それほど困難ではありません。次のコードは、MoveEnd メソッドを使用して段落記号を 1 文字分移動し、rng1 に段落記号が含まれるように再調整しています。

次に、rng2 全体を削除します。これで 3 番目の段落が元の位置に戻ります。

rng1 に元の段落テキストを復元します。

最後のコード セクションでは、Range オブジェクトの InsertAfter メソッドを使用して元の 2 番目の段落の内容を rng1 の後ろに挿入し、rng1 を選択します。

図 17 に、3 つの段落を示します。ここでは、rng1 が選択されています。このとき、rng1 は挿入したテキストを含むように拡張されているため、2 番目の段落も rng1 に含まれていることに注意してください。

}

Aa192495.wordobject017(ja-jp,office.11).gif


図 17. InsertAfter メソッドによって Range オブジェクトが拡張され、挿入テキストがオブジェクトに含められます。

Bookmark オブジェクト

Bookmark オブジェクトは、ドキュメント内の連続した領域を示している点で Range オブジェクトおよび Selection オブジェクトに類似しており、開始位置と終了位置を定義します。ブックマークは、ドキュメント内の位置をマークしたり、ドキュメント内のテキストを格納するために使用します。Bookmark オブジェクトは、挿入箇所を表す場合もあれば、ドキュメント全体を表す場合もあります。1 つのドキュメント内に複数のブックマークを定義することもできます。Bookmark は、ドキュメント内の位置に名前を付けたものと考えられ、ドキュメント自体に保存されます。

ブックマークの作成

Bookmarks コレクションは Document オブジェクト、Range オブジェクト、および Selection オブジェクトのメンバとして使用できます。次のサンプル プロシージャは、ドキュメント内にブックマークを作成し、そのブックマークをテキストの挿入に使用する方法を示しています。このコードでは、次のアクションが実行されます。

  • Range 変数と 2 つの Bookmark 変数を宣言し、ShowBookmarks プロパティを True に設定します。このプロパティを設定すると、挿入箇所として設定されている Bookmark は灰色の I バーで表示され、テキストの範囲として設定されている Bookmark はブックマーク テキストを灰色の角かっこで囲んだ状態で表示されます。
  • ドキュメントの先頭を最初の挿入箇所とする Range オブジェクトを定義します。
  • Range オブジェクトを構成要素とする bookMk1 という名前の Bookmark を追加し、MessageBox を表示してコードの実行を中断します。この時点では、Bookmark は段落の先頭の左側に薄い I バーとして表示されます (図 18 を参照)。

    Aa192495.wordobject018(ja-jp,office.11).gif


    図 18. 挿入箇所として定義されている Bookmark は I バーで表示されます。

  • Range オブジェクトの InsertBefore メソッドを使用して Bookmark の前にテキストを挿入し、MessageBox を表示してコードの実行を一時停止します。図 19 に、Bookmark と挿入されたテキストを示します。テキストが Bookmark の後に挿入され、実際にはテキストがブックマークに含まれていることに注意してください。

    Aa192495.wordobject019(ja-jp,office.11).gif


    図 19. 挿入したテキストがブックマークに含められます。

  • Range オブジェクトの InsertAfter メソッドを使用して Bookmark の後ろにテキストを挿入します。挿入されたテキストが、Bookmark の前に挿入されたテキストの直後に表示されていることに注意してください (図 20 を参照)。

    Aa192495.wordobject020(ja-jp,office.11).gif


    図 20. ブックマークの後ろへのテキストの挿入

  • Range オブジェクトをドキュメントの 2 番目の段落を指すようにリセットし、2 番目の段落に bookMk2 という Bookmark オブジェクトを新しく作成します。コードの実行を一時停止して MessageBox を表示すると、2 番目の段落を角かっこで囲んだ状態の Bookmark を確認することができます (図 21 を参照)。

    Aa192495.wordobject021(ja-jp,office.11).gif


    図 21. 特定範囲のテキストを囲む Bookmark は一組の角かっこで表されます。

  • InsertBefore を使用して Bookmark の前にテキストを挿入します。図 22 は、挿入されたテキストが Bookmark に含まれている状態を示しています。

    Aa192495.wordobject022(ja-jp,office.11).gif


    図 22. Bookmark が特定範囲のテキストである場合は、InsertBefore メソッドでテキストを Bookmark に挿入します。

  • InsertAfter を使用して Bookmark の後ろにテキストを挿入します。テキストが Bookmark の外側に挿入され、Bookmark には含まれていないことに注意してください。図 23 は、Bookmark の Select メソッドを実行した後のドキュメントを示しています。

    Aa192495.wordobject023(ja-jp,office.11).gif


    図 23. Bookmark の後ろに挿入されたテキストは Bookmark に含まれません。

Bookmarks コレクション

The Bookmarks コレクションにはドキュメント内のすべてのブックマークが属します。さらに、ブックマークは、ヘッダーやフッターなど、ドキュメント内の他のセクションにも配置できます。各 Bookmark オブジェクトを参照すると、そのプロパティを取得できます。次のプロシージャは、Bookmarks コレクション内で反復処理を行い、MessageBox.Show メソッドを使用してドキュメント内にある各 Bookmark の名前とその Range.Text プロパティを表示します。

ブックマークのテキスト プロパティの更新

ブックマークのテキストの更新は簡単に行えます。ブックマークの Range.Text プロパティに値を割り当てれば更新できます。ただし、この操作を実行すると、ブックマーク全体が削除されます。プレースホルダのブックマークにテキストを挿入し、後でテキストを取得できるようにすることは容易に実現できることではありません。1 つの選択肢として、ブックマークを挿入テキストで置換してブックマークを削除する方法が挙げられます。その後、挿入したテキストを囲んでいるブックマークを再作成します。次のプロジージャはこの手法を適用しています。結果は 図 24 に示します。

}


Aa192495.wordobject024(ja-jp,office.11).gif


図 24. 元の Bookmark が新しいテキストに置換されます。

Bookmark の内容を更新する簡単な方法として、テキストの変更後に Range プロパティをリセットする方法が挙げられます。次のプロシージャでは、ブックマークの名前を格納する BookmarkName 引数と、Text プロパティを置換する文字列を格納する NewText 引数を使用しています。さらに、このコードでは Range オブジェクトを宣言し、そのオブジェクトを Bookmark の Range プロパティに設定します。Range プロパティの Text プロパティを置換すると Bookmark 内のテキストも置換され、この Bookmark は Bookmarks コレクションに再度追加されます。

このプロジージャは、Bookmark の名前と新しいテキストを渡して呼び出すことができます。

テキストの検索と置換

Word のユーザー インターフェイスでドキュメントを編集する場合、[編集] メニューの [検索] と[置換] を使用する場面が多いと考えられます。表示されるダイアログ ボックスを使用して、探すテキストの検索条件を指定できます。[置換] は [検索] を拡張したもので、検索したテキストを置換することができます。

Find オブジェクトは Selection オブジェクトと Range オブジェクトの両方のメンバであり、どちらもテキストの検索に使用できます。

Selection オブジェクトを使用したテキストの検索

Selection オブジェクトをテキストの検索に使用する場合、指定したすべての検索条件は現在選択されているテキストにのみ適用されます。ただし、Selection が挿入箇所である場合は、ドキュメント全体で検索が行われます。検索条件に一致する項目が見つかると、選択範囲が変更され、見つかった項目が自動的に強調表示されます。次のプロジージャは、文字列 "dolor" を検索し、最初に見つかった文字列を強調表示して警告を表示します (図 25 を参照)。


Aa192495.wordobject025(ja-jp,office.11).gif


図 25. Selection オブジェクトを使用して検索すると、見つかったテキストが自動的に選択されます。

ヒント   検索条件は次第に増加します。つまり、検索条件は前回の検索条件に追加されます。検索を行う前に、必ず ClearFormatting メソッドを使用して前回の検索の書式設定を削除することを習慣付ける必要があります。

検索オプションの設定

検索オプションを設定するには、2 つの方法があります。Find オブジェクトの個々のプロパティを設定する方法と Execute メソッドの引数を使用する方法です。次のプロシージャで、両方の形式を説明します。まず最初のコード ブロックで Find オブジェクトのプロパティを設定し、2 番目のコード ブロックで Execute メソッドの引数を使用します。これらの各コード ブロックは、使用している構文が異なるだけで同じ検索を実行します。通常 Execute メソッドで必要とされる多くのパラメータは使用することがあまりなく、また多数の値を Find オブジェクトのプロパティに指定できるため、C# で開発する場合は Find.Execute メソッドの複雑さを覆い隠す "ラッパー" メソッドを作成する最高のチャンスとなります。この操作は Visual Basic で開発する場合は必要ありませんが、次の例では C# による開発者にとって役立つ手法を示しています。

Range オブジェクトを使用したテキストの検索

Range オブジェクトを使用してテキストを検索すると、ユーザー インターフェイスに何も表示しないで検索することができます。Find メソッドは、結果を示すブール値を返します。 このメソッドでは、テキストが見つかった場合に検索条件に合わせて Range オブジェクトの再定義も行います。したがって、Find メソッドによって条件に一致したものが見つかると、その位置に Range オブジェクトの範囲が移動します。

次のプロシージャでは、ドキュメント内の 2 番目の段落で構成される Range オブジェクトを定義します。さらに、Find メソッドを使用して、既存の書式オプションをすべて解除し文字列 "faucibus" を検索します。このコードでは、MessageBox.Show メソッドを使用して検索結果を表示し、Range を選択して指定範囲が見えるようにします。検索に失敗した場合は 2 番目の段落が選択され、成功した場合は検索条件が選択されて表示されます (図 26 を参照)。C# 形式の例では、前に説明したラッパー メソッド ExecuteFind を使用しています。


Aa192495.wordobject026(ja-jp,office.11).gif


図 26. Range メソッドによる検索に成功すると、指定範囲が検索条件を含むように再定義されます。

Found 項目によるループ

Find メソッドには Found プロパティがあり、このプロパティは検索対象の項目が見つかるたびに True を返します。このプロパティは、サンプル プロシージャに示すようにコード内で利用することができます。このコードは、Range オブジェクトを使用してアクティブ ドキュメントで "lorem" という文字列をすべて検索し、見つかった各文字列のフォント色と太字プロパティを変更します。この場合、ループ内で Found プロパティを使用し、文字列が見つかるたびにカウンタを増加させます。さらに、文字列が見つかった回数を MessageBox で表示します。C# 形式の例では、前に説明した ExecuteFind メソッドを使用しています。

ヒント   範囲 rndDoc が、検索開始時にはドキュメントの内容全体を参照していたにもかかわらず、検索後は検索で一致したテキストを参照するという動作は不自然に感じられるかもしれません。これは Range 変数の Find メソッドを呼び出したときの仕様です。Word では必ず Range 変数を更新し見つかったテキストを参照します。元の範囲への参照を維持する場合は、元の情報を保存しておく別の変数を用意する必要があります。ここで示したプロシージャの場合は、元の範囲がドキュメント全体であり、範囲の参照を簡単に取得し直すことができるため、変数に情報を保存しておく必要はありません。

テキストの置換

コードを使用してテキストの検索と置換を行うにはいくつかの方法があります。標準的な手法としては、Find オブジェクトを使用し、ドキュメント全体に渡ってループを行い特定のテキスト、書式、またはスタイルを検索します。見つかった項目を置換する場合は、Find オブジェクトの Replacement プロパティを使用します。Find オブジェクトおよび Replacement オブジェクトの両方に ClearFormatting メソッドが用意されています。検索と置換操作を実行する場合は、両方のオブジェクトの ClearFormatting メソッドを使用する必要があります。このメソッドを検索処理の Find を利用する部分でのみ使用した場合は、テキストが予期しないオプションで置換される可能性があります。

さらに、見つかった各項目を置換するには Execute メソッドを使用します。Execute メソッドには、3 つの値を持つ WdReplace の列挙値を指定できます。

  • wdReplaceAll : 見つかったすべての項目を置換します。
  • wdReplaceNone : 見つかった項目を置換しません。
  • wdReplaceOne : 最初に見つかった項目を置換します。

次のプロシージャのコードでは、選択範囲内で検索された文字列 "Lorum" をすべて"Forum" に置換します。 C# 形式の例では、前に説明した ExecuteFind にならってヘルパー メソッド ExecuteReplace を使用しています。

検索後におけるユーザーの選択範囲の復元

ドキュメント内でテキストの検索および置換を行う場合、検索完了後にユーザーがあらかじめ設定していた選択範囲に戻す必要がある場合があります。サンプル プロシージャのコードでは、2 つの Range オブジェクトを利用しています。一方のオブジェクトには現在の選択範囲を保存し、もう一方には検索範囲として使用するドキュメント全体を設定します。その後、検索および置換操作を実行し、ユーザーが設定していた元の選択範囲を復元します。C# 形式の例では、前に示したヘルパー メソッド ExecuteReplace を使用しています。

印刷

Word には、印刷に関する豊富な機能群が組み込まれています。印刷エンジンは簡単に操作でき、ドキュメントの全体や選択部分を印刷できます。

印刷プレビューを使用した作業

アクティブ ドキュメントの PrintPreview プロパティを True に設定すると、ドキュメントを印刷プレビュー モードで表示できます。

Application オブジェクトの PrintPreview プロパティを切り替えると、現在のドキュメントを印刷プレビュー モードで表示できます。ドキュメントが既にプレビュー モードになっている場合は通常の表示に戻り、通常の表示であった場合は印刷プレビュー モードで表示されます。

PrintOut メソッド

PrintOut メソッドを使用すると、ドキュメント (またはドキュメントの一部) をプリンタに送信できます。このメソッドは、Application オブジェクトまたは Document オブジェクトから呼び出すことができます。次のコードでは、すべてのオプションを既定値に設定した状態でアクティブ ドキュメントを印刷します。

PrintOut メソッドには複数の省略可能な引数を指定でき、これらの引数によってドキュメントの印刷方法を微調整できます。この引数は、表 2 にまとめてあります。

表2. 一般的に使用する PrintOut の引数

引数説明
BackgroundTrue に設定すると、Word によるドキュメントの印刷中に処理を行うことができます。
AppendOutputFileName 引数と共に使用します。True に設定すると、OutputFileName 引数で指定した名前のファイルに、指定したドキュメントが付加されます。False に設定すると、OutputFileName の内容が上書きされます。
Rangeページの範囲です。WdPrintOutRange の列挙値のいずれかを指定できます。列挙値には wdPrintAllDocumentwdPrintCurrentPagewdPrintFromTowdPrintRangeOfPageswdPrintSelection があります。
OutputFileName PrintToFile が True の場合、この引数は出力ファイルのパスと名前を指定します。
From RangewdPrintFromTo に設定されている場合は、開始ページ番号になります。
To RangewdPrintFromTo に設定されている場合は、終了ページ番号になります。
Item印刷する項目です。WdPrintOutItem の列挙値のいずれかを指定できます。列挙値にはwdPrintAutoTextEntrieswdPrintCommentswdPrintDocumentContentwdPrintKeyAssignmentswdPrintPropertieswdPrintStyles があります。
Copies印刷する部数です。
Pages印刷対象となるページ番号またはページ範囲です。コンマで区切ります。たとえば、"2, 6-10" と指定すると 2 ページと 6 ~ 10 ページが印刷されます。
PageType印刷するページの種類です。WdPrintOutRange の定数のいずれかを指定できます。定数にはwdPrintAllPageswdPrintEvenPagesOnlywdPrintOddPagesOnly があります。
PrintToFileTrue に設定すると、プリンタ命令がファイルに送られます。必ず OutputFileName でファイル名を指定してください。
Collateドキュメントを複数部印刷するときに使用します。True に設定すると、ドキュメントのすべてのページが印刷されてから次の 1 部が印刷されます。
FileName Application オブジェクトでのみ使用できます。印刷するドキュメントのパスとファイル名です。この引数を省略すると、Word によってアクティブ ドキュメントが印刷されます。
ManualDuplexPrintTrue に設定すると、両面印刷キットのないプリンタで両面ドキュメントを印刷できます。

次のプロシージャは、アクティブ ドキュメントの最初のページを印刷します。

Word の表の作成

Tables コレクションは Document オブジェクト、Selection オブジェクト、Range オブジェクトのメンバです。したがって、これらのどのオブジェクトにおいても表を作成できます。特定の範囲に表を追加する場合は、Add メソッドを使用します。次のコードでは、3 行 4 列で構成される表をアクティブ ドキュメントの先頭に追加します。

Table オブジェクトを使用した作業

表を作成すると、その表は自動的に Document オブジェクトの Tables コレクションに追加され、次のコードで示すように項目番号を使用して表を参照できるようになります。

Table オブジェクトには Range プロパティも用意されており、このプロパティで書式属性を直接設定できます。Style プロパティを使用すると、次のコードに示すように、組み込みのスタイルを表に適用できます。

Cells コレクション

各 Table は Cell のコレクションで構成されており、各 Cell オブジェクトはそれぞれ表内の 1 つのセルを示しています。各セルは、表内での位置によって参照します。次のコードでは、表の 1 行目の 1 列目にあるセルを参照し、テキストを追加して書式を適用します。

行と列

表内のセルは行と列で構成されています。Add メソッドを使用すると、新しい行を表に追加できます。

通常、新しい表を作成するときに列数を定義しますが、作成後に Add メソッドを使用して列を追加することもできます。次のコードでは、既存の表に新しい列を追加 (既存の最初の列の前に新しい列を挿入) し、DistributeWidth メソッドを使用してすべての列を同じ幅に揃えます。

応用例

次の例では、アクティブ ドキュメントの最後に Word の表を作成し、ドキュメントのプロパティを使用して値を入力しています。

まとめ

Word には、豊富なオブジェクト モデルが用意されています。このオブジェクト モデルによって、マネージ コードから Word およびドキュメントの作成をプログラムに基づいて制御できます。ここでは、利用できる機能のごく一部を紹介しました。詳細については、Word の VBA のオンライン ヘルプ ファイルを参照してください。ここで得た情報を活かせば、ドキュメントの作成や運用に関連するほとんどのタスクを処理することができます。


表示: