文書パーツを操作する

Word 2007 の文書パーツは、以前のバージョンの定型句と似ています。 ただし、文書パーツでは、ユーザーが文書をどのように使用するかをあらかじめ決めるために、文書を構造化することができます。 カスタム文書パーツを使用すると、ユーザーは書式設定されたドロップダウン リストを使用して、ドキュメント内の任意の場所にリッチ コンテンツを挿入できます。 文書パーツとコンテンツ コントロールを組み合わせて使用すれば、強力なソリューションをすばやく簡単に開発することができます。

文書パーツのオブジェクト モデルは、3 つの新しいオブジェクトと 4 つの新しいコレクションで構成されます。 これらを使って、特定の要件に適した構造を作成したり、さらに特定のソリューションに合わせて構造を変えることができます。 次の表は、新しいオブジェクト モデルとコレクションの一覧です。

名前 説明
BuildingBlock 特定の文書パーツ項目。
BuildingBlocks テンプレート内の文書パーツのうち、種類と分類が同じ文書パーツのコレクション。
BuildingBlockEntries テンプレート内のすべての文書パーツのコレクション。
BuildingBlockType 文書パーツの種類。
BuildingBlockTypes 文書パーツの種類のコレクション。
カテゴリ 文書パーツの分類。
Categories 文書パーツの分類のコレクション。

構成要素について

構成要素は、種類とカテゴリ別に編成されます。 構成要素の種類は、限られた数の WdBuildingBlockTypes 定数で構成されます。 これらの定数の数は限られていますが、その数は小さくはありません。 WdBuildingBlockTypes の定数は 35 種類あります。 これらの型は、文書パーツを定義および整理するのに役立ちます。また、追加の文書パーツの種類を作成することはできませんが、種類ごとに無制限の数のカテゴリを作成できます。

カテゴリは、カスタム文書パーツを整理するために定義できる文字列の数に制限なく構成されます。 構成要素はテンプレートに格納されます。 既定では、Word に含まれるテンプレートには、"全般" や "組み込み" などの文書パーツ カテゴリがあります。 ただし、これらのテンプレートに含まれるカテゴリだけに限定されるわけではありません。 カテゴリには、定義する任意の文字列を指定できます。 型とカテゴリについては、このトピックの後半で説明します。

Because you can organize building blocks into types and categories, building blocks can be incredibly flexible. For example, you can have a building block named "Title" that has a type of wdTypeBibliography and a category of "Book Titles" and another building block named "Title" that has a type of wdTypeBibliography and a category of "Movie Titles" and then you can have yet another building block named "Title" that has a type of wdTypeCustomHeaders and a category of "Book Titles" and so on. The incredible flexibility that building blocks provide help you to create custom solutions without writing code.

ただし、構成要素もプログラム可能です。 新しい文書パーツの作成、文書パーツの削除、および文書パーツの管理をプログラムで行うことができます。 BuildingBlockInsert イベントを使用して、ユーザーがドキュメントに新しい文書パーツを挿入するタイミングを監視することもできます。 さらに、文書パーツとコンテンツ コントロールを使用して、ユーザーがドキュメントに挿入できる文書パーツをさらに詳細に制御できます。 たとえば、文書パーツ コンテンツ コントロールを使用して、ユーザーに表示される文書パーツの種類をフィルター処理できます。つまり、文書内の特定の場所で許可されていない文書に文書パーツを挿入することはできません。 次のセクションには、文書パーツ オブジェクトを使用してプログラムで文書パーツを操作する方法を示す例がいくつかあります。

単純なタスク

以下のセクションでは、文書パーツ オブジェクトを使用して特定のタスクを実行する簡単な例を示します。 その他のコード例については、オブジェクトのトピックやさまざまなメンバーのトピックを参照してください。

カスタム文書パーツの作成

カスタム文書パーツの作成は、BuildingBlockEntries コレクションの Add メソッドを使用するのと同じくらい簡単です。 BuildingBlocks コレクションには Add メソッドを使用することもできます。ただし、指定した型またはカテゴリの構成要素が現在存在しない場合、このメソッドは実行時エラーを発生させる可能性があります。 オブジェクトの表で説明されているように、 BuildingBlocks コレクションは、特定の型とカテゴリの構成要素のコレクションです。 BuildingBlocksEntries コレクションは、テンプレートのすべての文書パーツで構成されます。 このため、新しい文書パーツをプログラムで追加するときには、BuildingBlockEntries コレクションの Add メソッドを使用する方法をお勧めします。

次のコード例では、現在の選択範囲を折りたたみ、範囲を作成してその範囲のためにテキストを指定してから、現在の文書に適用されているテンプレートの文書パーツ項目のコレクションに、その選択範囲をカスタム文書パーツとして追加しています。

Sub AddCustomBuildingBlock() 
 
 Dim objTemplate As Template 
 Dim objBB As BuildingBlock 
 Dim objRange As Range 
 
 ' Set the template to store the building block 
 Set objTemplate = ActiveDocument.AttachedTemplate 
 
 ' Collapse the range, set the range, and add the text 
 Selection.Collapse 
 Set objRange = Selection.Range 
 objRange.Text = "Building blocks for the technically challenged" 
 
 ' Add the building block to the template 
 Set objBB = objTemplate.BuildingBlockEntries.Add( _ 
 Name:="Title", _ 
 Type:=wdTypeCustomHeaders, _ 
 Category:="Book Titles", _ 
 Range:=objRange) 
 
End Sub

新しいカテゴリの追加

既に説明したように、分類は無制限に追加できます。 ただし、 Categories コレクションには Add メソッドがありません。 このため、新しい分類をコレクションに追加するには、新しい文書パーツを追加する必要があります。 たとえば、前述のサンプル コードでは、コードを実行するときに "Book Titles" 分類が存在していない場合には、この分類が Categories コレクションに自動的に追加されます。

既存の文書パーツへのアクセス

ある時点で、カスタム文書パーツか組み込み文書パーツの 1 つかに関係なく、持っているいずれかの構成要素にアクセスする必要があります。 BuildingBlockEntries コレクションを使うこともできますが、文書パーツは同じ名前を共有できるため、文書パーツの種類と分類を指定しないと、どの文書パーツが返されるかわかりません。 このため、既存の文書パーツにアクセスするときは、 BuildingBlocks コレクションを使用することをお勧めします。

次のコード例では、前述のサンプル コードで追加した文書パーツにアクセスしています。

Sub GetExistingBuildingBlock() 
 
 Dim objTemplate As Template 
 Dim objBB As BuildingBlock 
 
 ' Set the template where the building block is stored 
 Set objTemplate = ActiveDocument.AttachedTemplate 
 
 ' Access the building block through the type and category 
 Set objBB = objTemplate.BuildingBlockTypes(wdTypeCustomHeaders) _ 
 .Categories("Book Titles").BuildingBlocks("Title") 
 
End Sub

文書への文書パーツの挿入

文書パーツにアクセスしたら、 BuildingBlock オブジェクトの Insert メソッドを使用して文書に文書パーツを挿入します。 次のコード例では、前述のサンプル コードを拡張して、作業中の文書のカーソル位置に文書パーツを挿入する (または、テキストが選択されている場合はそれを置き換える) 行を挿入しています。

注:

リボンを使用して文書パーツを挿入すると、文書パーツの挿入場所など、文書パーツに関する特定の内容が自動的に決定されます。ただし、オブジェクト モデルを介して構成要素を挿入すると、この組み込みインテリジェンスは自動的に実行されません。 たとえば、リボンを使用してヘッダー文書パーツを挿入すると、Word は既存のヘッダーを自動的に置き換えることを決定します。 オブジェクト モデルを使用して同じヘッダー文書パーツを挿入する場合は、文書パーツ テキストを配置する場所を明示的に指定する必要があります。

Sub InsertExistingBuildingBlock() 
 
 Dim objTemplate As Template 
 Dim objBB As BuildingBlock 
 
 ' Set the template where the building block is stored 
 Set objTemplate = ActiveDocument.AttachedTemplate 
 
 ' Access the building block through the type and category 
 Set objBB = objTemplate.BuildingBlockTypes(wdTypeCustomHeaders) _ 
 .Categories("Book Titles").BuildingBlocks("Title") 
 
 ' Insert the building block into the document replacing any selected text 
 objBB.Insert Selection.Range 
 
End Sub

コンテンツ コントロールの構成要素の一覧をフィルター処理する

文書パーツとコンテンツ コントロールを組み合わせて使用すれば、ユーザーがアクセスできる文書パーツを絞り込むことができます。 この操作は、コンテンツ コントロールとイベントを使用して行います。 ユーザーがコンテンツ コントロールを入力すると、 Document オブジェクトの ContentControlOnEnter イベントが発生します。 このイベントには、アクティブなコンテンツ コントロールを表すパラメーターがあります。 これで、そのコンテンツ コントロールが文書パーツ コンテンツ コントロールかどうかを判断できます。 文書パーツ コンテンツ コントロールである場合は、 BuildingBlockType プロパティと BuildingBlockCategory プロパティを使用して種類と分類を識別し、その結果に基づいてコンテンツ コントロールで使用できる文書パーツを絞り込みます。 これにより、コンテンツ コントロール ヘッダーのドロップダウン リストにどの文書パーツを表示するかを指定します。

次のコード例では、文書内にコンテンツ コントロールが 1 つ以上あることを前提としています。 コンテンツ コントロールが文書パーツ コンテンツ コントロールである場合、コンテンツ コントロール ヘッダーの文書パーツ リストには、このトピックで既に説明した AddCustomBuildingBlock サブルーチンを使用して追加した文書パーツだけが表示されます。 コンテンツ コントロールの詳細については、「コンテンツ コントロールを操作する」を参照してください。

Private Sub Document_ContentControlOnEnter(ByVal ContentControl As ContentControl) 
 Dim objCC As ContentControl 
 
 Set objCC = ContentControl 
 
 If objCC.Type = wdContentControlBuildingBlockGallery Then 
 objCC.BuildingBlockType = wdTypeCustomHeaders 
 objCC.BuildingBlockCategory = "Book Titles" 
 End If 
End Sub

サポートとフィードバック

Office VBA またはこの説明書に関するご質問やフィードバックがありますか? サポートの受け方およびフィードバックをお寄せいただく方法のガイダンスについては、Office VBA のサポートおよびフィードバックを参照してください。