Word 2007 テンプレートをプログラムで作成する
Erika Ehrli
Tristan Davis
Microsoft Corporation
May 2006
日本語版最終更新日 2006 年 7 月 13 日
適用対象:
2007 Microsoft Office スイート
Microsoft Office Word 2007
要約: Microsoft Office Word 2007 の文書テンプレートをプログラムで作成する方法について、新しいコンテンツ コントロール、文書構成部品、XML マッピングの使い方も含めて、詳しく説明します。また、Word 2007 オブジェクト モデルの最も新しいメンバの一部について確認します。
目次
はじめに
ビジネス シナリオ : ストック オプション テンプレート
コンテンツ コントロールについて
XML マッピングとは
Word 2007 オブジェクト モデルにおける新しいオブジェクトとコレクション
カスタム XML パーツとの対話
まとめ
その他の参考資料
謝辞
はじめに
テンプレート設計者は、Microsoft Office Word 2007 を大歓迎することでしょう。Word 2007 には、テンプレート開発者を対象とした次のような重要な新機能が導入されています。
- 文書からの XML データの分離
- コンテンツ コントロール
- XML マッピング
これらの新しい機能を組み合わせることによって、プログラムの拡張と新しいユーザー インターフェイス (UI) を介して、非常に簡単にテンプレートを作成することができます。Word 2007 では、カスタム XML データを文書から分離することによって、データと表示の完全な分離が実現します。コンテンツ コントロールは、エンド ユーザーによる偶発的な変更から保護されたより安全なコンテンツ ブロック (ドロップダウン メニューなど) を作成する簡単な方法を提供します。コンテンツ コントロールを追加してから、XML マッピングを使用してカスタム XML データから文書にデータをマップすることができます。ここでは、実際のシナリオを使用して、これらの機能の使い方について説明します。シナリオを通して、コンテンツ コントロールと XML マッピングの詳細を理解し、独自の Word 2007 テンプレートの作成に着手することができます。
ビジネス シナリオ : ストック オプション テンプレート
以降のセクションでは、Word 2007 で提供されるテンプレート作成機能を理解するためのビジネス シナリオを紹介します。この目的は、Microsoft Office Word 2003 を使用してストック オプション テンプレートを作成し、Word 2007 で提供される新しい機能を使用してどのくらい開発エクスペリエンスが向上したかを強調するために、実行されたアプローチの明確な手順を示すことです。一連のセクションを通して、シナリオの中で取り上げた Word 2007 の新機能のそれぞれの操作方法について詳しく説明します。
架空の金融会社である Contoso で、最初のページに以下のコンテンツを含む Word テンプレートが必要だとします。
- 特定の株に関する次のようなデータを表示する表
- 終値
- 52 週高値
- 52 週安値
- 出来高
- 1 日の出来高
- 50 日移動平均
- 200 日移動平均
- 変動率
- 次のような基礎データを表示する表
- 負債資本比率
- 粗利益
- 売上純利益率
- 株数
- 時価総額
- 1 株あたり利益
2 ページ目には通常の文章が含まれます。
最初のページの表は、次のように表示されます。
画像 1. 特定の株に関するデータを表示する表
Word 2003 のアプローチ : 表の使用
Word 2003 で表を使用する場合は、2 つの表内の各セルを XML 要素で囲む必要があります。この操作を行ったことがあれば、各要素の最初と最後を表すピンク色のタグをご存知でしょう。必要に応じて、各 XML 要素内のデータを更新することができます。これは有効なアプローチですが、データが誤って変更される可能性があります。XML を理解していないエンド ユーザーが、XML 要素のピンク色の開始タグか終了タグのどれかを誤って削除する可能性があります。表での変更を制限する解決策が思い当たりますが、Word 2003 では容易なことではありません。これを解決するには、複数のテンプレート設計者が、表のために最初のページ セクションを作成し、その全体を制限することによって、エンド ユーザーが一切変更できないようにします。その後で、エンド ユーザーが変更可能なテキストを含む 2 番目のページ セクションを作成します。この方法は、セクションと表全体の制限を使用して、ユーザーがすべてのセルを変更できないようにしなければならないため、理想的な解決策とは言えません。
Word 2007 のアプローチ : コンテンツ コントロールの使用
Word 2007 では、このシナリオに対する解決策をより堅牢かつ簡潔にする "コンテンツ コントロール" と呼ばれる新機能が提供されます。テンプレート設計者が文書内でフォームのような編集ができるドロップダウン メニュー、コンボ ボックス、リッチ テキスト、テキスト、日付選択、画像などの複数のコンテンツ コントロールがあります。文書に挿入されたコンテンツ コントロールは、UI の境界とタイトル (いずれも印刷はされません) によって識別されます。これによって、コンテンツ要素が目立つことで操作しやすくなりますが、従来の Word のコントロールとは違って、不要な要素がページ上に表示されません。
このシナリオでは、各セル内のデータはテキストのコンテンツ コントロール内に保存されます。コントロールが挿入されると、文書内では次のように表示されます。
画像 2. Word 文書内のコンテンツ コントロール
最上部のタイトル タグに注目してください。デザイン モードにあるときは、逆三角形がタイトル タグに表示されます。逆三角形をクリックすると、コントロールのプロパティを変更することができます。
コンテンツ コントロールのロック
コンテンツ コントロールを作成したら、そのコンテンツをロックすることによって、[コンテンツ コントロールのプロパティ] ダイアログ ボックスを使用したプロパティの変更やコントロールそれ自体の削除を防止することができます。詳細については、「コンテンツ コントロールのロック」を参照してください。
[コンテンツ コントロールの削除不可] と [コンテンツの編集不可] のどちらかまたは両方をオンにすることができます。それぞれをプログラムで有効にすることもできます。
コンテンツ コントロールの入れ子化
コンテンツ コントロールを別のコンテンツ コントロールに埋め込むことができます。コントロールを入れ子にすることによって、テンプレートの操作が容易になります。入れ子にされたコンテンツ コントロールのグループから、カスタム文書構成部品を作成することもできます。
文書構成部品は、表紙、ヘッダー、フッター、契約書内の固有の条項などのあらかじめ定義されたコンテンツ要素です。構成部品によって、プロ風の Word 文書が簡単に作成できます。カスタム構成部品を作成することもできます。たとえば、表内の各セルにコンテンツ コントロールを挿入して、その表全体をより大きな独自の文書構成部品にグループ化し、そのカスタム文書構成部品を文書内の別の場所に挿入することができます。
XML マッピングの使用
新しい Microsoft Office Open XML ファイル形式 では、カスタム XML データが "文書パーツ" に保存されます。文書パーツによって、ファイルのコンテンツ全体のセクションの定義が容易になります。この新しいファイル形式は、カスタム XML データ パーツを含むさまざまな文書パーツで構成されます。XML 要素に関連付けられたすべての文書コンテンツが、カスタム XML データ パーツ内のデータにマップされます。文書の書式設定とレイアウトから XML を分離することによって、プログラムからのデータ アクセスが容易になり、文書の堅牢性が向上します。
XML マッピングは、文書と XML ファイル間のリンクを作成するための Word 2007 の機能です。これによって、文書の書式設定とカスタム XML データ間のデータと表示の完全な分離が実現します。
XML マッピングを使用すれば、文書に貼り付けられたカスタム XML パーツ内の要素をマップすることができます。このストック オプション テンプレート シナリオでは、表内のほとんどのセルをカスタム XML にマップすることができます。たとえば、表内の "Last Price" セルにあるコンテンツ コントロールに注目してください。"Last Price" コンテンツ コントロールをカスタム XML パーツの要素内のデータにマップするには、次の手順を実行します。
CustomXMLPart オブジェクトを文書に貼り付けます。この場合のカスタム XML パーツは、株の終値データを含む要素が保存されている XML ファイルです。Document オブジェクトの CustomXMLParts コレクション上で Add メソッドを呼び出すことによって、この処理をプログラムで実行することができます。
手動またはプログラムで、株の終値を含む要素をコンテンツ コントロールにマップします。これは次の手順で実行します。
- XPath を使用して、CustomXMLParts オブジェクト内の要素を特定することができます。
- 要素を特定することによって、XPath で指定された要素内のデータがコンテンツ コントロールにマップされます。このマッピングによって、XML 要素 (この場合は文字列とする) 内のデータがコンテンツ コントロールの UI に表示されます。
- この要素内のデータが変更されると、その変更がコントロール内のデータに反映されます。
- 同様に、エンド ユーザーがコントロール内のテキストを編集すると、そのテキストがマップされている XML 要素内のデータも更新されます。ただし、エンド ユーザーにテキストの変更を許可しない場合は、編集や削除に対してコンテンツ コントロールをロックすることができます。
3. 文書が開かれたときに必ず終値が反映されるように、カスタム XML パーツ内のデータを自動的に更新する短いアドイン プログラムを作成します。
**注: **このコードは、Word 2007 スキーマではなく、文書にアタッチされたカスタム スキーマに対して機能します。
この手順はイベントを使用して完成します。このシナリオでは、文書の Open イベントが、対象の会社の株の終値を取得するアドインをトリガーします。この終値は、"last price" コントロール コンテンツがマップされたカスタム XML データ内の要素に挿入されます。アドインで、52 週高値、52 週安値、移動平均などの数値を計算することもできます。このすべてが、文書が開かれたときに自動的に実行されます。テンプレートのユーザーは、何もしなくても、常に最新のデータを見ることができます。
カスタム XML データの変更
リッチなテンプレートを作成するにはカスタム XML データの使用が不可欠なため、カスタム XML がどのように保存され、カスタム XML をどのように操作するかについて簡単に説明しておく必要があります。Word 2003 テクノロジと WordprocessingML で、Word 文書にカスタム XML データを含める機能が導入されました。これによって、XML に対する変更がコンテンツにも反映されるように、文書内のコンテンツ要素をカスタム XML に関連付けることが可能になり、テンプレート開発者の可能性が広がりました。この機能の導入は大成功だったと言えます。Word 2007 では、この機能に対していくつかの強化が行われています。
Word 2003 のカスタム XML は、文書全体を記述する XML の内部に埋め込まれます。エンド ユーザーが Word 2003 で文書を XML として保存すると、文書を記述するために必要なすべての情報を含む、WordprocessingML スキーマに準拠した XML ファイルが生成されます。カスタム XML を導入した場合、Word 2003 はそれを同じ WordprocessingML 文書の内部に埋め込みます。これは、カスタム XML が誤って無効化されたときに文書全体が破壊される可能性があるため、カスタム XML データをプログラムで操作する場合はある程度のリスクが伴うことを意味します。
Word 2007 では、新しい Microsoft Office Word XML Formats を使用します。この Word XML Format は、文書の主要素を本体から分離します。新しいファイル形式では、ヘッダー、フッター、文末脚注、画像、表などのコンテンツが別の XML ファイルに保存されます。この新しいファイル形式は、リレーションシップ ファイルと共にマップされた、ZIP コンテナ内部にある XML ファイルの集まりです。カスタム XML を Word 2007 文書に貼り付けると、Word 2007 はそれを ZIP コンテナ内部の個別の XML ファイルに保存します。これによって、ファイルに対してデータの変更、削除、または追加ができるため、プログラムによるカスタム XML の特定と操作が容易になります。
新しい Microsoft WinFX System.IO.Packaging クラスを使用すれば、プログラムで Word XML Format にアクセスすることができます。PackagePart クラスは、文書内のカスタム XML パーツなどの個々のパーツを操作するために使用します。
エラーが発生してカスタム XML データが無効になったとしても、文書の他の部分には影響がありません。そのため、文書は正常に開くことができます。文書を開くと、問題が発生したことを示すダイアログ ボックスが表示され、エンド ユーザーに破損箇所が報告されます。カスタム XML データを修正する必要がありますが、文書内の他のデータは修正する必要がありません。
コンテンツ コントロールについて
既にシナリオで説明したように、Word 2007 テンプレートは、コンテンツ コントロールによって、よりリッチに、より堅牢にすることができます。このセクションでは、コンテンツ コントロールの動作についてさらに詳しく説明します。コンテンツ コントロールを使用して、次のようなことが実現できます。
- **テンプレート内の構造化領域を指定する。**各構造化領域には、読み書きができるように固有の ID が付けられています。構造化領域 (つまり、コンテンツ コントロール) の例として、コンボ ボックス、画像、テキスト ブロック、日付選択などが挙げられます。
- **コンテンツ コントロールの動作を決定する。**各コンテンツ コントロールが文書内の各領域を構成しているため、テンプレート作成者は領域ごとに動作を指定することができます。たとえば、テンプレートのある領域をカレンダーにする場合は、文書のその領域に日付選択 コンテンツ コントロールを挿入すれば、自動的にコンテンツのそのブロックの動作が決定します。同様に、テンプレートのある部分に画像を表示する場合は、その領域に画像コンテンツ コントロールを作成します。このように、あらかじめ定義されたブロックの種類を使用して、簡単にテンプレートを作成することができます。
- **コンテンツ コントロールの内容を制限する。**エンド ユーザーが誤って削除または変更できないように、コンテンツ コントロールを個別に制限することができます。たとえば、エンド ユーザーが読むことはできても変更することができない著作権情報をテンプレートに含める場合に有効です。エンド ユーザーが誤って一部を削除しないように、テンプレートの内容をロックすることもできます。これによって、以前のバージョンよりもテンプレートの堅牢性が向上します。
- **文書と共に保存されるカスタム XML パーツ内のデータにコンテンツ コントロールの内容をマップする。**たとえば、株価の表を含むコンテンツ コントロールを挿入する場合は、現在の株価を含む表のセルを XML ファイル内のノードにマップすることができます。株価が変化したときに、最新の株価が自動的に表内に表示されるように、アドイン プログラムを使用して、各セルにマップされた XML ファイルを更新することができます。
コンテンツ コントロールは、UI を通してとても簡単に作成することができます (ただし、プログラムで作成することもできます)。UI を通してコンテンツ コントロールを作成するには、コンテンツ コントロールに変換するテキストを選択し、リボン UI の [開発] タブで、必要なコンテンツ コントロールの種類を選択します。
次の画像は、テンプレートを作成するときのテキスト コンテンツ コントロールの挿入方法を示しています。
画像 3. テンプレートでテキスト コンテンツ コントロールを作成する
文書に追加可能なコンテンツ コントロールは 7 種類あります。wdContentControlType という名前の新しい列挙で、各コントロールを記述します。
表 1. コンテンツ コントロールの種類とそれぞれの wdContentControlType 列挙
コンテンツ コントロールの種類 | 説明 | wdContentControlType 列挙値 |
---|---|---|
日付の選択 | 日付時刻の選択です。 | wdContentControlDate |
文書構成部品 | エンド ユーザーは、指定された "文書構成部品" の種類から選択することができます。テキストのリッチ テキスト ブロックを使用します。 | wdContentControlBuildingBlockGallery |
ドロップダウン | ドロップダウン リストです。 | wdContentControlDropDownList |
コンボ ボックス | コンボ ボックスです。 | wdContentControlComboBox |
画像 | 画像です。 | wdContentControlBlockPicture |
リッチ テキスト | リッチ テキストのブロックです。 | wdContentControlRichText |
テキスト | プレーン テキストのブロックです。 | wdContentControlText |
Word オブジェクト モデルには、コンテンツ コントロールに関連する 2 つの新しいコレクション (ContentControls と ContentControlEntries) と 3 つの新しいオブジェクト (ContentControl、ContentControlEntry、および XMLMapping) があります。それぞれの詳細については後のセクションで説明します。
テンプレート作成者は、コンテンツ コントロールのロック機能を使用すれば、エンド ユーザーによる偶発的な削除や変更を気にせずにコンテンツ コントロールを作成することができます。従来は、この機能を実現することが困難でした。Word 2007 でコンテンツ コントロールを使用すれば、あらかじめ定義されたコンテンツの一部を削除や変更できないように簡単にロックすることができます。テンプレートのある部分はユーザーの入力を受け入れ、他の部分は読み取り専用としてロックすることもできます。リボン UI の [開発] タブにあるダイアログ ボックスを使用してコンテンツ コントロールをロックします。既定で、このダイアログ ボックスは無効になっているため、経験の浅いユーザーはコンテンツ コントロールのロックを簡単には解除できません。Word 2007 オブジェクト モデルを使用して、コンテンツ コントロールをプログラムでロックすることもできます。
コンテンツ コントロールのもう 1 つの強力な特徴は、XML ファイル内のデータにマップできることです。コンテンツ コントロールを XML データにマップすることによって、フォームへの入力の手間を省くことができます。たとえば、ドロップダウン コンテンツ コントロール内のオプションを XML ファイル内のノードにマップすることができます。これを実行すると、UI のドロップダウン内の各エントリが、XML ファイルのスキーマ定義によって決定され、ドロップダウンの現在選択されている項目が、マップされたノードに保存されます。
新しい Word XML Format は、新たな可能性を広げるもう 1 つの変更点です。この Word XML Format では、XML データが文書から完全に分離された個別のデータ ストアに保存されます。この形式は、Word 2003 の WordprocessingML ファイル形式からの変更です。この分離によって、プログラムで XML データを自動的に更新することが容易になります。柔軟性の向上した Word 2007 の XML 記憶域を使用すれば、各エントリを XML ファイルにマッピングすることによって、ドロップダウン コンテンツ コントロール内の項目をプログラムで変更することができます。変更しようとするエントリにマップされたノードを変更すれば、その変更がドロップダウンに反映されます。
ここでは、コンテンツ コントロールの追加方法と操作方法を紹介します。Word 2007 オブジェクト モデルの新しいオブジェクトとコレクションに関する情報も提供します。プログラムおよび UI によるコンテンツ コントロールの操作方法を示し、コンテンツ コントロール特有のすべてのコレクションとオブジェクト (新しいオブジェクトと、新しいメンバを持つ現行のオブジェクトの両方を含む) に関するオブジェクト モデル参照について説明します。
コンテンツ コントロールの変更方法または追加方法に関する例を以下に示します。これらの操作を実行するには、Word 2007 で新しく導入された [開発] タブを有効にする必要があります。
[開発] タブを表示するには
Microsoft Office ボタンをクリックして、[Word のオプション] をクリックします。
[Word のオプション] ダイアログ ボックスで、[個人設定] をクリックします。
画像 4 に示すように、[[開発] タブをリボンに表示する] チェック ボックスをオンにします。
[OK] をクリックします。
画像 4. リボン UI の [開発] タブ
**注: **開発モードにあるときに、リボン UI に [開発] タブが表示されます。
コンテンツ コントロール オブジェクトとコレクション
コンテンツ コントロールに関連する 2 つの新しいコレクションと 3 つの新しいオブジェクトがあります。
ContentControls
ContentControl オブジェクトのコレクション。Document、Range、Selection の各オブジェクトに ContentControls コレクションがあります。
ContentControl
文書内の 1 つのコンテンツ コントロールを表すオブジェクト。wdContentControlType 列挙内の 7 種類のコンテンツ コントロールの中から選択することができます。
ContentControlListEntries
種類が wdContentControlDropDownList または wdContentControlComboBox の ContentControl オブジェクト上の ContentControlListEntry オブジェクトのコレクション。各 ContentControlListEntry は、ドロップダウンまたはコンボ ボックス内のエントリです。このコレクションは、他の種類のコンテンツ コントロールでは使用できません。ドロップダウンとコンボ ボックスのいずれでもないコンテンツ コントロールの ContentControlListEntries 上でメソッドまたはプロパティを呼び出すと、Word にエラーが表示されます。
ContentControlListEntry
ドロップダウンまたはコンボ ボックスのコンテンツ コントロールに含まれる単一エントリ用のオブジェクト。ContentControlListEntry オブジェクトは、他の種類のコンテンツ コントロールでは使用できません。ドロップダウンとコンボ ボックスのいずれでもないコンテンツ コントロールの ContentControlListEntry 上でメソッドまたはプロパティを呼び出すと、Word にエラーが表示されます。
XMLMapping
コンテンツ コントロールにマップされたデータを表すオブジェクト。XMLMapping は、ContentControl オブジェクトのメンバです。XMLMapping オブジェクトを使用して、データをコンテンツ コントロールにマップすることができます。
次の画像は、ContentControl オブジェクトを表す Word 2007 オブジェクト モデルの一部を示しています。
画像 5. ContentControl オブジェクトを表す Word 2007 オブジェクト モデルの一部
コンテンツ コントロールの種類
日付選択
日付選択コンテンツ コントロールを使用すれば、エンド ユーザーが日付選択コントロールから日付を選択することができます。日付選択は、エンド ユーザーがポインタをコンテンツ コントロール上に移動するか、コンテンツ コントロールをクリックすると表示されます。UI を通して、または、プログラムを使用して、選択される日付の形式を指定することができます。
文書構成部品
文書構成部品は、Word 2007 で新しく導入されたものです。文書構成部品は、表紙、ヘッダー、フッターなどのあらかじめ設計されたコンテンツの要素です。文書構成部品によって、エンド ユーザーは、文書に挿入する文書構成部品をあらかじめ定義された一覧の中から選択することができます。
文書構成部品は、XML ファイル内のデータにマップできないことに注意してください。ただし、データにマップ可能なコンテンツ コントロールを文書構成部品に保存することはできます。
たとえば、テンプレート内の株価の一覧を自動的に更新する場合は、株価のテキスト コンテンツ コントロールを含むセルで構成された表として文書構成部品を作成することができます。各テキスト コンテンツ コントロールが、現在の株価を保存するカスタム XML パーツ内のノードにマップされます。この場合は、文書構成部品をデータにマップするのではなく、その中のテキスト コンテンツ コントロールをマップします。文書構成部品を作成したら、エンド ユーザーが誤って削除または変更できないように、文書構成部品全体をロックすることができます。
ドロップダウン
ドロップダウン コンテンツ コントロールを使用すれば、エンド ユーザーがドロップダウン メニュー内のオプションの一覧から選択することができます。各エントリ内のデータをカスタム XML パーツ内のノードにマップすることができます。プログラム的には、ドロップダウン コンテンツ コントロールとコンボ ボックス コンテンツ コントロールは、ContentControlListEntries コレクションを持っている点で他のコンテンツ コントロールとは異なります。ContentControlListEntries コレクションには、ユーザーがコンテンツ コントロールから選択可能なエントリが保存されます。
コンボ ボックス
コンボ ボックス コンテンツ コントロールは、ドロップダウン コンテンツ コントロールと同様に機能します。唯一の違いは、通常のコンボ ボックスのように、領域を使用してテキストを直接編集できる点です。
画像
画像コンテンツ コントロールを使用すれば、エンド ユーザーが画像を文書に挿入することができます。エンド ユーザーがこのコンテンツ コントロールをクリックすると、挿入する画像を選択するためのコントロールが表示されます。
**注: **XML ノードを画像コンテンツ コントロールにマップすると、画像がベース 64 バイナリ形式で保存されます。
リッチ テキスト
リッチ テキスト コンテンツ コントロールは、リッチ テキストのブロックです。リッチ テキスト コンテンツ コントロールは、カスタム XML パーツ内のデータにマップできないことが特徴です。
テキスト
テキスト コンテンツ コントロールは、プレーン テキストのブロックです。リッチ テキスト コンテンツ コントロールとは違って、テキスト コンテンツ コントロールの内容をカスタム XML パーツ内のデータにマップすることができます。
テキスト コンテンツ コントロールの内容が編集できる状態にして、このコンテンツ コントロールを XML ノード内のデータにマップした場合は、ユーザーが文書を通して XML データを直接編集することができます。たとえば、"hello" という単語が保存されたノードにマップされたテキスト コンテンツ コントロールによって、その単語が文書に表示されます。ユーザーがこのコンテンツ コントロールを編集して、"hello" を削除し、"good bye" に置き換えた場合は、XML ノードが更新されて、"good bye" という文字列が保存されます。
コンテンツ コントロールの追加
UI を通して、または、プログラムを使用して、任意の種類のコンテンツ コントロールを文書に追加することができます。
UI を使用してコンテンツ コントロールを追加するには
- コンテンツ コントロールに変換するテキストを選択します。
テキストを選択せずに、カーソルをコンテンツ コントロールを挿入する場所に移動することもできます。 - [開発] タブの [コントロール] セクションで、挿入するコンテンツ コントロールを選択します (画像 3 参照)。
プログラムによるコンテンツ コントロールの追加
プログラムでコンテンツ コントロールを追加するには、ContentControls コレクション上で Add メソッドを呼び出します。Range オブジェクト、Selection オブジェクト、または Document オブジェクト上の ContentControls コレクションで Add メソッドを呼び出すことができます。次のコード行を Microsoft Visual Basic for Applications (VBA) イミディエイト ウィンドウに追加して、文書内の現在選択されている項目上に画像コンテンツ コントロールを作成します。
Selection.ContentControls.Add(wdContentControlPicture)
このコードによって、画像コンテンツ コントロールが作成されます。その他の種類のコンテンツ コントロールを追加するには、wdContentControlType パラメータを wdContentControlDate、wdContentControlDocumentPartGallery、wdContentControlDropDownList、wdContentControlComboBox、wdContentControlRichText、または wdContentControlText に変更します。
ContentControls コレクションは、Range オブジェクトと Selection オブジェクトに属します。
コンテンツ コントロールのロック
コンテンツ コントロールをロックして、削除または内容の変更を防止することができます。コンテンツ コントロールをロックすることによって、たとえば、エンド ユーザーが削除または変更できない、XML ファイルからのデータで構成されたドロップダウンを作成することができます。ユーザーは、このドロップダウン内の任意の項目を選択することはできますが、リストそれ自体を変更することはできません。この新しい機能を使用すれば、テンプレート設計者は、たとえば、削除や変更ができない著作権情報を含むリッチ テキストのコンテンツ コントロールを簡単に作成することができます。Word 2003 で文書の一部を保護する場合は、スタイルを保護してから、そのスタイルをロックするテキストすべてに適用する必要があります。コンテンツ コントロールを使用すれば、これが簡単にできます。Word 2007 では、コンボ ボックス、ドロップダウン、テキスト、画像などを使用してリッチな文書を作成し、エンド ユーザーが誤って文書を破壊しないように、その要素の一部またはすべてを保護することができます。
UI を通して、または、プログラムを使用して、コンテンツ コントロールをロックすることができます。
UI を使用してコンテンツ コントロールをロックするには
- コンテンツ コントロールを選択します。
- [開発] タブの [コントロール] セクションで、[プロパティ] を選択します。
- [コンテンツ コントロールのプロパティ] ダイアログ ボックスで、[コンテンツ コントロールの削除不可] と [コンテンツの編集不可] のどちらかまたは両方をオンにします。
プログラムによるコンテンツ コントロールのロック
プログラムでコンテンツ コントロールをロックするには、対応するオブジェクトの LockContentControl プロパティと LockContents プロパティのどちらかを True に設定します。次のコード行を VBA のイミディエイト ウィンドウに追加すると、コンボ ボックス コンテンツ コントロールが空の文書に追加され、削除と内容変更の両方に対してロックされます。
activedocument.ContentControls.Add(wdContentControlComboBox)
activedocument.ContentControls(1).LockContentControl = True
activedocument.ContentControls(1).LockContents = True
LockContentControl は、[コンテンツ コントロールのプロパティ] ダイアログ ボックスの [コンテンツ コントロールの削除不可] チェック ボックスに対応します。LockContents は、同じダイアログ ボックスの [コンテンツの編集不可] チェック ボックスに対応します。
コンテンツ コントロールへのタイトルの追加
コンテンツ コントロールにカスタマイズ可能なラベル、つまり、タイトルを付加することもできます。タイトルを付加するかどうかは任意です。タイトルを付加することによって、文書ページ上でコンテンツ コントロールを識別することができます。
**注: ** Tag プロパティを使用すれば、プログラムで同じ機能を実現することができます。
コンテンツ コントロールのタイトルには、次の 2 つの目的があります。
- UI では、タイトルがコンテンツ コントロール上部のタブに表示されます。たとえば、ユーザーの住所の追加を支援するコンテンツ コントロールを含むテンプレートで、ユーザーが国または地域を選択することができるドロップダウン コンテンツ コントロールを挿入するとします。ユーザーを支援するために、このコンテンツ コントロールに「国または地域」というタイトルを付加することができます。
- プログラムで、コンテンツ コントロールを識別するタイトルを使用することもできます。ContentControls コレクション内のインデックスを使用して、または、タイトルを使用して、ContentControl オブジェクトを検索することができます。コンテンツ コントロールのタイトルがわかっている場合は、インデックスを使用してコレクションの中を検索する必要はありません。
UI でコンテンツ コントロールにタイトルを追加するには
- コンテンツ コントロールを選択します。
- [開発] タブの [コントロール] セクションで、[プロパティ] を選択します。
- [全般] タブの [タイトル] フィールドに、コンテンツ コントロールのタイトルを入力します。
プログラムによるコンテンツ コントロールへのタイトルの追加
次のサンプル コードは、テキスト コンテンツ コントロールを作成し、VBA イミディエイト ウィンドウを使用してタイトルを付加する方法を示しています。
Dim strTitle As String
strTitle = "MyTitle"
Dim oCC As Word.ContentControl
Set oCC = Application.Selection.ContentControls.Add(wdContentControlText)
oCC.Title = strTitle
コンテンツ コントロールにタイトルが付いていれば、Item メソッドでそのタイトルを使用してコントロールを参照することができます。たとえば、"MyTitle" というタイトルのコンテンツ コントロールを削除するには、次のコードを VBA イミディエイト ウィンドウに追加します。
ActiveDocument.ContentControls.Item("MyTitle").Delete
コンテンツ コントロールのプレースホルダ テキストの変更
役に立つ説明文をコンテンツ コントロールに付加することができます。このテキストは、"プレースホルダ テキスト" と呼ばれます。プレースホルダ テキストは、コンテンツ コントロールの内容が空のときに、その上に表示されます。たとえば、リッチ テキスト コンテンツ コントロールに、"ここにコメントを入力してください。" というプレースホルダ テキストを付加することができます。ユーザーがこのコンテンツ コントロールに入力を始めると、プレースホルダ テキストが消えます。ユーザーがコンテンツ コントロールからすべての内容を削除すると、プレースホルダ テキストが再び現れます。コンテンツ コントロールが XML データにマップされており、イベントで強制的にデータが更新され、その内容が空になった場合も、プレースホルダ テキストが再び現れます。
プレースホルダ テキストを書式設定することができます。この書式設定は、コンテンツ コントロールの内容の書式設定とは別です。たとえば、プレースホルダ テキストを書式設定して、ユーザーが見やすいように、フォントのサイズを大きくしたり、太字にすることができます。または、コンテンツ コントロールの内容のスタイルを、文書の他の部分のスタイルに合わせることもできます。
プログラムによるプレースホルダ テキストの変更
コンテンツ コントロールのプレースホルダ テキストをプログラムで変更するには、コンテンツ コントロールの SetPlaceholderText メソッドを呼び出します。SetPlaceholderText には、AutoTextEntry、Range、String の 3 つのパラメータを指定することができます。簡単にするために、この例では、"ここに入力してください。" を含む String リテラルを指定します。
ActiveDocument.ContentControls(1).SetPlaceholderText ,,"ここに入力してください。"
次のように ShowPlaceholderText プロパティを使用して、プレースホルダ テキストの表示/非表示を設定することができます。
ActiveDocument.ContentControls(1).ShowPlaceholderText = True
プレースホルダ テキストを取得する必要がある場合は、ContentControl オブジェクトの PlaceholderText プロパティを使用して、AutoTextEntry として取得することができます。
XML マッピングとは
XML マッピングは、Word 2007 で新しく導入されたものです。"XML マッピング" とは、文書と XML ファイル間のリンクの作成を可能にする機能です。これによって、文書の書式設定とカスタム XML データ間のデータと表示の完全な分離が実現します。XML マッピングの正式な定義は、コンテンツ コントロールの内容を、文書と共に保存されているデータ ストア内の XML 要素にリンクするコンテンツ コントロール上のプロパティです。この定義では、文書パーツが、圧縮された Word 2007 XML 文書内部の個々の XML ファイルに保存される Word XML Format に言及しています。固有のディレクトリに保存される圧縮された文書の中身は、コンテンツ コントロールにマップされたデータを含む XML ファイルです。
これは、XML マッピングが、文書の内容から分離された XML データに対して作用することを意味します。このデータの書式設定からの分離によって、Word 2003 よりも堅牢な文書を作成することができます。XML データが破損しても、文書自体には影響がありません。また、文書の書式設定を変更しても、XML データの構造には影響がありません。これは、文書内でテキストを移動しているうちに誤ってスキーマを無効にする可能性のある Word 2003 と比べて、格段の進歩です。
破損した XML にマップされたコンテンツ コントロールは正しく機能しない可能性がありますが、文書の他の部分には何の影響もありません。XML データのスキーマに対する確認ができなくなっても、文書を開くことはできます。また、この分離によって、コンテンツ コントロールにマップした XML データを変更、更新、または削除することができる上、文書の書式設定を気にすることなくコンテンツ コントロールの内容を変更することができるため、新たな可能性が広がります。
XML マッピングの内容
XML マッピング、コンテンツ コントロール、および新しいファイル形式は関連しています。以降のセクションでは、XML マッピングを中心に説明します。
カスタム XML パーツ
Microsoft Office の 2007 リリースでは、すべての XML マッピングが、文書の XML データ ストア内部の一意の XML に関連付けられます。データ ストアは、オープン ファイル内に保存されているすべてのカスタム XML パーツへのアクセスを提供します。データ ストアに保存された任意のカスタム XML パーツ内部の任意のノードを参照することができます。
名前空間s
すべての XML マッピングが名前空間を参照します。XML マッピングは、関連付けられたカスタム XML パーツのルート名前空間を参照します。
XPath 表現
XML マッピングを作成するために、コンテンツ コントロールをマップするカスタム XML データ パーツ内のノードに対して XPath 表現を使用することができます。XPath を指定すると、Word は既定でその最も簡略化されたバージョンを保持することに注意してください。たとえば、//s:docTitle[@initialized='true'] を指定した場合、Word は既定で \document\docHeader(1)\docTitle(4) を解決して保存します。フラグを使用すれば、パフォーマンスに悪影響を及ぼす可能性はあるが、元の XPath を保持できるように、この既定の動作に対する例外を作成することができます。
Word 2007 での XML マッピングの追加
データをコンテンツ コントロールにマップするには、次の 2 つのことを実行する必要があります。
- マップする情報を含む文書にデータ ストアを追加する。
- 追加したデータ ストア内のノードを参照するコンテンツ コントロール上で XML マッピングを設定する。
Word 2007 オブジェクト モデル内の文書に追加されたデータ ストアは、CustomXMLParts という名前の Document オブジェクトの新しいコレクションに保存されます。CustomXMLParts コレクションには、CustomXMLPart オブジェクトが保存されます。このコレクションは、文書で使用可能なすべてのデータ ストア項目を指します。CustomXMLPart オブジェクトは、データ ストア内の 1 つのカスタム XML パーツを表します。
カスタム XML パーツを読み込むには、最初に、Add メソッドを呼び出して、新しいデータ ストアを Document オブジェクトに追加する必要があります。Add メソッドは、新しい空のデータ ストアを文書に追加します。データ ストアは空のため、まだ使用することができません。次に、XML ファイルへの有効なパスをパラメータに指定して Load メソッドを呼び出し、XML ファイルからカスタム XML パーツをデータ ストアまたは CustomXMLPart オブジェクトに読み込む必要があります。
既定で、文書上に少なくとも 1 つのデータ ストアが存在することに注意してください。たとえば、新しい空の文書上の VBA イミディエイト ウィンドウに次のコードを追加すると、0 ではなく 1 の値が返されます。
? ActiveDocument.CustomXMLParts.Count
1
既定のカスタム XML パーツには、文書の標準文書プロパティが含まれています。このプロパティは削除することができません。カスタム XML パーツ上の読み取り専用の XML プロパティを呼び出すことによって、そのカスタム XML パーツを確認することができます。CustomXMLPart (データ ストア) の XML プロパティを呼び出した場合は、そのデータ ストア内の XML を含む文字列が返されます。たとえば、次のように、VBA イミディエイト ウィンドウを使用して、空の文書上の XML プロパティを呼び出します。
? ActiveDocument.CustomXMLParts(1).XML
次のような XML が表示されます。
<?xml version="1.0" standalone="yes"?>
<CoreProperties xmlns="https://schemas.microsoft.com/package/2005/06/metadata/core-properties">
<Title></Title>
<Subject></Subject>
<Creator>Microsoft Employee</Creator>
<Keywords></Keywords>
<Description></Description>
<LastModifiedBy></LastModifiedBy>
<Category/>
<Identifier/>
<ContentType/>
<ContentStatus/>
<Language/>
<Version/>
<Revision xmlns="https://schemas.microsoft.com/package/2005/06/
metadata/core-properties">1</Revision>
<DateCreated xmlns="https://schemas.microsoft.com/package/2005/06/metadata/core-properties">
2005-06-29T20:13:00Z</DateCreated>
</CoreProperties>
名前空間にインデックスを付ければ、すべての CustomXMLParts コレクション上の特定の項目にアクセスすることもできます。たとえば、次のようなコードを使用します。
? ActiveDocument.CustomXMLParts("https://schemas.microsoft.com/
package/2005/06/metadata/core-properties").XML
次のサンプル コードは、有効なデータ ストア項目として、XML ファイルを文書に貼り付ける方法を示しています。CustomXMLParts オブジェクトへのインデックスを渡して、最初に追加したデータ ストアを特定する場合は、インデックスとして 2 を使用する必要があることを覚えておいてください (例 : oCustomXMLPart(2).Load)。これは、2007 リリースでは、1 のインデックスによって、標準プロパティを含む既定のストアが返されるためです。別の方法として、名前空間ごとに CustomXMLParts オブジェクトにインデックスを付加できることに注意してください。
Dim oCustomXMLPart As Office.CustomXMLPart
Dim strXMLPartName As String
strXMLPartName = "c:\myDataStoreFiles\myXMLDataStore.xml"
' 最初に、新しいカスタム XML パーツを文書に追加する
Set oCustomXMLPart = ActiveDocument.CustomXMLParts.Add
' 次に、XML ファイルをカスタム XML パーツに読み込む
oCustomXMLPart.Load (strXMLPartName)
データ ストアを文書に追加 (およびデータ ストア ポイントを有効な XML ファイルに追加) したら、そのノードの 1 つをコンテンツ コントロールにマップすることができます。これを実行するには、SetMapping メソッドを使用して、ContentControl オブジェクトへの有効な XPath を含む String を渡します。本の著者のファースト ネームを含むデータ ストア ノードを参照する XPath を使用してこれを実行する場合は、次のようなコードになります。
' XML マッピングを追加して
' 本に関する情報を読み込んだ
' 最初に、XPath を作成する
Dim strXPath As String
strXPath = "/s:book/s:AuthorFirstName"
' 次に、操作するコンテンツ コントロールのインスタンスを作成する
Dim oContentControl As Word.ContentControl
Set oContentControl = Application.Selection.ContentControls.Add _
(wdContentcontrolComboBox)
' 最後に、XPath を使用してデータをマップする
oContentControl.XMLMapping.SetMapping strXPath
XPath リンクとデータ
コンテンツ コントロールとデータ ストア内のデータのリンクは変化しません。つまり、XPath リンクは静的です。これは、データをコンテンツ コントロールにマップすると、そのコンテンツ コントロールの XML マッピングを明示的に削除または変更するまで、コンテンツ コントロールの内容が XPath で返されるノードの内容にリンクされたままになることを意味します。
ノードのデータが変更されると、その変更がコンテンツ コントロールに自動的に反映されます。たとえば、次のようなテキスト コンテンツ コントロール (種類が wdContentcontrolText のコンテンツ コントロール) を含む文書を想定します。この例では、下線付きのテキストがコンテンツ コントロールであると仮定します。実際の文書では、コンテンツ コントロールに必ず下線が付いているわけではありません。
"This is the text in my document. I would like a pear."
ここで、コンテンツ コントロールを、次のようなカスタム XML パーツの fruitType ノードにマップします。
<tree>
<fruit>
<fruitType>pear</fruitType>
<fruitType>banana</fruitType>
</fruit>
</tree>
コンテンツ コントロールを <fruitType> ノードにマップすると、そのノード内の変更がコンテンツ コントロールに反映されます。<fruit> の最初の子ノードとして新しい <fruitType> を追加することによって、データ ストアを変更するアドインを作成した場合は、コンテンツ コントロールが新しいデータに更新されます。更新されたカスタム XML パーツは次のようになります。
<tree>
<fruit>
<fruitType>peach</fruitType>
<fruitType>pear</fruitType>
<fruitType>banana</fruitType>
</fruit>
</tree>
その結果、文書内のテキストは次のようになります。
"This is the text in my document. I would like a peach."
コンテンツ コントロールが更新されていることに注目してください。別のシナリオでは、<fruit> ノードが、ドロップダウン コンテンツ コントロールにマップされたデータとします。このケースでは、文書にアタッチされたスキーマを使用して、次の 3 つの選択肢を <fruitType> 要素としてこの順に指定します。
"Orange"
"Apple"
"Banana"
つまり、これらはドロップダウンから選択可能なオプションであり、スキーマ内に列挙した順に表示されます。このケースでは、文字列 "Banana," を含む 3 番目のノードをカスタム XML パーツに追加することによって、追加前にドロップダウンで選択されていた項目が "Banana," に変更されます。
ぶら下がり参照とは
コンテンツ コントロールを、リンクされたカスタム XML パーツ内のノードにマップすることができない場合 (たとえば、XPath が無効な場合) は、XML マッピングがぶら下がり参照になっていると言います。コンテンツ コントロールにぶら下がり参照が含まれていることを示す UI はありません。ぶら下がり参照の存在を確認する唯一の方法は、オブジェクト モデルを通して確認する方法です。
ぶら下がり参照が発生しても、文書内のコンテンツ コントロールの外観は変化しません。
ぶら下がり参照には 2 種類あります。
ぶら下がり XPath 参照
カスタム XML パーツに対してノードを置き換える、または、削除すると、1 つまたは複数の XML マッピングがぶら下がり参照になる可能性があります。この現象は、マップされたノードの削除によって、データに対する XML マッピングの XPath が解決されなくなったときに発生します。カスタム XML パーツを変更することによって、スキーマでリーフ ノードにするために指定したマップ済みのノードに子ノードを追加することもできます。リーフ ノードを追加することによって、マップ済みのノードが、リーフ ノードから親ノードに変わります。
このようなケースでは、XML マッピングで使用された XPath は変化せずに、カスタム XML パーツだけが変化します。XPath が変化しない場合は、使用できないデータを指していることになります。この状態が、ぶら下がり XPath 参照です。
カスタム XML パーツが更新されるたびに、Word 文書がすべてのぶら下がり参照が解決されたかどうか確認します。つまり、すべてのぶら下がり参照がカスタム XML パーツ内の有効なノードを指しているかどうか確認します。もしそうであれば、Word は直ちにデータの変更を反映するためにコンテンツ コントロールを更新します。
たとえば、次のようなテキスト コンテンツ コントロール (種類が wdContentcontrolText のコンテンツ コントロール) を含む文書を想定します。この例では、下線付きのテキストがコンテンツ コントロールであると仮定します。実際の文書では、コンテンツ コントロールに必ず下線が付いているわけではありません。
"This is the text in my document. I would like a banana."
このコンテンツ コントロールをカスタム XML パーツ内のノードにマップするための XPath は "\tree\fruit\fruitType(3)" のようになります。
このコードは、3 番目の <fruitType> ノード内のデータを使用するようにコンテンツ コントロールに指示します。使用されるカスタム XML パーツは次のようになります。
<tree>
<fruit>
<fruitType>peach</fruitType>
<fruitType>pear</fruitType>
<fruitType>banana</fruitType>
</fruit>
</tree>
ここで、カスタム XML パーツが変更され、文字列 "banana" を含むノードが削除されたとします。
<tree> <fruit> <fruitType>peach</fruitType> <fruitType>pear</fruitType> </fruit> </tree>
これによって、ぶら下がり XPath 参照が発生します。ただし、文書では、コンテンツ コントロールは変化せず、文字列 "banana" が表示されたままになります。
"This is the text in my document. I would like a banana."
<fruit> の下の 3 番目のノードを削除することによって XPath が無効になっても、"Banana" は表示されたままになります。
次に、新しい <fruitType> ノードをリストの先頭に追加して、"pear" ノードが <fruit> の下の 3 番目のノードになるようにします。
<tree>
<fruit>
<fruitType>plum</fruitType>
<fruitType>peach</fruitType>
<fruitType>pear</fruitType>
</fruit>
</tree>
これによって、この変更を反映するために直ちにコンテンツ コントロールが更新されます。コンテンツ コントロール内の XPath は 3 番目の <fruitType> ノードへのリンクを指しているため、コンテンツ コントロールには、新しい 3 番目のノードの "pear" に含まれるデータが表示されます。
"This is the text in my document. I would like a pear."
ぶら下がりカスタム XML パーツ参照
文書に対して、カスタム XML パーツ全体を削除または置き換えた場合は、そのカスタム XML パーツを参照するすべての XML マッピングが直ちにぶら下がりカスタム XML パーツ参照になります。これが起きると、Word は、コンテンツ コントロール内のぶら下がりカスタム XML パーツ参照ごとに最後の有効な XPath を保持します。
一連のリンクにぶら下がりカスタム XML パーツ参照が含まれている場合は、文書がそのリンクを最初のカスタム XML パーツにもう一度貼り付けようとします。コードでは、最初のカスタム XML パーツが、ActiveDocument.CustomXMLParts(1) として記述されています。最初のカスタム XML パーツ内のノードに対する壊れたリンクのすべてが解決された場合は、壊れたマッピングのすべてがそのカスタム XML パーツを参照するように直ちに更新されます。最初のカスタム XML パーツに対するどのリンクも解決されなかった場合は、文書が 2 番目のカスタム XML パーツ内で壊れたリンクを解決しようとします。これが成功しなかった場合は、3 番目のカスタム XML パーツ内で壊れたリンクを解決しようとします。リンクが解決されるか、すべてのカスタム XML パーツが試されるまで、この作業が繰り返されます。どのリンクも解決されなかった場合は、壊れたリンクのそれぞれが、ぶら下がり XPath 参照になり、最後の有効な XPath を保持します。
マッピングを変更した場合のぶら下がり参照
コンテンツ コントロール上のマッピング プロパティを変更すると、マッピングが一時的にぶら下がり参照の状態になります。これは、予想された動作です。コンテンツ コントロールのマッピングが変更されたときに発生する動作順序は次のようになります。
- 元のノードへのリンクが壊れて、ぶら下がり XPath 参照状態になります。
- コンテンツ コントロールが新しいノードにリンクされます。
- 新しいノードからの内容が、コンテンツ コントロールに反映されます。
この動作はバックグラウンドで行われます。ただし、バックグランドで何が起きているかを知ることによって、XML マッピングの動作を理解することができます。
Word 2007 オブジェクト モデルにおける新しいオブジェクトとコレクション
XML マッピングに関連する Word 2007 オブジェクト モデルの新しい項目について説明します。
**注: **これらの新しいオブジェクトとコレクションは、Microsoft Office Excel 2007 オブジェクト モデルと Microsoft Office PowerPoint 2007 オブジェクト モデルにもありますが、いずれも XML マッピングを使用します。
CustomXMLNamespaceManager
このオブジェクトには、名前空間とプレフィックス間のマッピングが保存されます。
CustomXMLSchemaCollection
このコレクションは、データ ストア内のカスタム XML パーツであるスキーマ、または、データ ストア内のカスタム XML パーツにアタッチされたスキーマを表します。
CustomXMLSchema
このオブジェクトは、CustomXMLSchemaCollection 内のスキーマを表します。
CustomXMLParts
このコレクションは、CustomXMLPart オブジェクトのセットを表します。文書のデータ ストアと呼ばれることもあります。
CustomXMLPart
このオブジェクトは、データ ストア内の 1 つのカスタム XML パーツを表します。
CustomXMLNodes
このコレクションは、作成中の文書内の CustomXMLNode オブジェクトのセットを表します。
CustomXMLNode
このオブジェクトは、XML ノードを表します。CustomXMLNode は、新しい msoXMLDataNodeType 列挙内で次の 7 種類のいずれかになります。
- msoXMLNodeAttribute
- msoXMLNodeCData
- msoXMLNodeComment
- msoXMLNodeDocument
- msoXMLNodeElement
- msoXMLNodeProcessingInstruction
- msoXMLNodeText
カスタム XML パーツとの対話
インターフェイスの本来の役割は、ユーザーが文書に関連付けられたカスタム XML パーツを取得したり操作できるようにすることです。CustomXMLParts コレクションと CustomXMLPart オブジェクトを通した 2 つのインターフェイスを使用して、以下の作業を実行することができます。
カスタム XML パーツの取得、作成、および削除
- XML ストア項目を作成する。
これは、文書の CustomXMLParts コレクション内の CustomXMLPart オブジェクトを作成することと同じです。これを実行するには、CustomXMLParts コレクションの Add メソッドを呼び出します。Add メソッドは、文書上で新しい CustomXMLPart またはデータ ストアを作成します。 - ストア項目、つまり、CustomXMLPart オブジェクトのセットを列挙する。
CustomXMLParts コレクションの Item メソッドを使用して、文書上のデータ ストアのコレクションを列挙することができます。この Item メソッドには、必要なストアのインデックスを示す Long パラメータ、または、必要なデータ ストアのルート名前空間を示す String パラメータを指定することができます。複数の CustomXMLPart オブジェクトがこのルート名前空間と一致した場合、Word はインデックス順で最初に一致したオブジェクトを返すことに注意してください。 - 既存のストア項目のインターフェイスを取得する。
CustomXMLParts コレクションを列挙する Item メソッドを使用して、これを実行することができます。その他に 2 つのメソッドを使用することもできます。それぞれが、CustomXMLPart オブジェクトを返します。これらは、必要なストアの ID を含む String パラメータを取得する SelectByID メソッドと、必要なストアのルート名前空間を含む String パラメータを取得する SelectByNamespace メソッドです。
カスタム XML パーツの操作
カスタム XML パーツに追加する。
カスタム XML パーツを表す CustomXMLPart オブジェクトには、ノードを追加することができる AddNode メソッドがあります。AddNode は、XML ノードをカスタム XML パーツに追加します。AddNode メソッドを呼び出すときは、親ノードを含む CustomDataXMLNode パラメータが必要であり、新しいノードがそのノードの子ノードになります。その他のパラメータを以下に示します。- 追加するノードの名前を含む String
- 追加するノードの NamespaceURI を含む String
- 追加したノードの次の兄弟ノードにするノードを指定する CustomXMLNode
- 追加するノードの種類を指定する MsoCustomXMLNodeType
- ノードの値を含む String (テキスト ノードに対してのみ有効)
msoXMLDataNodeType 列挙値を AddNode メソッドに渡すことによって、追加するノードの種類を指定します。
カスタム XML パーツを置き換える。
カスタム XML パーツ内のノードを表す CustomXMLNode オブジェクトには、ReplaceChildNode と ReplaceChildSubtree の 2 つのメソッドがあります。最初のメソッドは単一のノードを置き換え、2 番目のメソッドはノードとその子ノードを置き換えます。両方のメソッドに対して、パラメータとして、削除するノードと置き換えるノードを指定する必要があります。カスタム XML パーツを削除する。
削除する CustomXMLPart オブジェクトの Delete メソッドを呼び出すことによって、カスタム XML パーツ全体を削除することができます。削除する CustomDataXMLNode オブジェクトの Delete メソッドを呼び出すことによって、単一のノードを削除することもできます。カスタム XML パーツ内部の値を取得または設定する。
カスタム XML パーツの単一ノードまたはサブツリー全体から値を取得することができます。CustomDataXMLNode オブジェクトには、ノード内のテキストの取得と設定が可能な NodeValue という名前の書き込み可能なプロパティがあります。このプロパティは、テキストを含むノードに対してしか機能しないことに注意してください。テキスト ノードには、msoXMLNodeText、msoXMLNodeComment、msoXMLNodeProcessingInstruction、および msoXMLNodeAttribute の種類があります。サブツリーの値を取得するには、CustomDataXMLNodes コレクションを返す CustomXMLNode オブジェクトの読み取り専用の GetNodes プロパティを使用して、コレクションを通して NodeValue の呼び出しを繰り返します。カスタム XML パーツ上のイベントを検出する。
クライアントは、ノードと、必要に応じてその子ノードすべての変化を検出して対応することができます。アドインは、次のイベントに対応することができます。
CustomXMLParts コレクション上 :- **StreamAfterAdd。**新しいストアが文書に追加された後で、クライアントが対応することができます。
- **StreamBeforeDelete。**ストアが文書から削除される前に、クライアントが対応することができます。
- **StreamAfterLoad。**ストア項目が XML と共に読み込まれた後で、クライアントが対応することができます。
CustomXMLPart オブジェクト上 :
- **NodeAfterInsert。**新しいノードがストアに追加された後で、クライアントが対応することができます。追加されたノードにサブツリーがある場合は、最上位のノードに対して、一度だけイベントが発生します。
- **NodeAfterDelete。**ノードが削除された後で、クライアントが対応することができます。削除されたノードにサブツリーがある場合は、最上位のノードに対して、一度だけイベントが発生します。
- **NodeAfterReplace。**XML ノードがストア内で置き換えられた後で、クライアントが対応することができます。
文書を通してマップされたデータの変更
文書を通してコンテンツ コントロールに直接マップされた XML ノード内のデータを更新することができます。これを実証するために、"test.xml" というタイトルの次の XML ファイルが C ドライブのルートに配置されているものとします。
<?xml version="1.0" standalone="no"?>
<root xmlns="urn:test">
<a>NodeA</a>
<b>NodeB</b>
</root>
次に、ユーザーが空の文書に 2 つのテキスト コンテンツ コントロールを挿入したとします。この時点で、コンテンツ コントロールをデータにマップしたり、カスタム XML パーツを文書に追加する必要はありません。
ここで、XML ファイルの C:\test.xml をカスタム XML パーツとして追加します。次の 2 行のコードの最初の行は、空のカスタム XML パーツを作成して、使用中の文書に追加します。2 行目は、新しく作成されたカスタム XML パーツに XML ファイルを読み込みます。文書のプロパティを含む既定の XML パーツが存在するために、最初のカスタム XML パーツは必ずインデックスが 2 になることを覚えておいてください。
activedocument.CustomXMLParts.Add
activedocument.CustomXMLParts(2).Load("c:\test.xml")
次に、適切なノードへの XPath を使用中の文書の ContentControls コレクション内のコンテンツ コントロールに渡すことによって、1 つのテキスト コンテンツ コントロールを <a> ノードに、もう 1 つのテキスト コンテンツ コントロールを <b> ノードにマップします。
activedocument.ContentControls(1).XMLMapping.SetMapping "s:test/s:a"
activedocument.ContentControls(2).XMLMapping.SetMapping "s:test/s:b"
この 2 行を実行すると、それぞれのテキスト コントロールに、マップされたノードのテキストまたはデータが表示されます。したがって、文書では、最初のテキスト コンテンツ コントロールに "NodeA" が表示され、2 番目のテキスト コンテンツ コントロールに "NodeB" が表示されます。
いずれのテキスト ブロックも内容変更に対してロックされていないものとします。ここで、ユーザーが文書内の最初のノードのテキストを "Hello." に変更したとします。これによって、XML パーツの <a> ノード内のデータが直ちに "Hello." に変更されます。これを確認するには、次のコード行を VBA イミディエイト ウィンドウに入力して実行します。
? activedocument.CustomXMLParts(2).SelectSingleNode("s:test/s:a").NodeValue
<a xmlns="urn:test">Hello</a>
予想どおり、データとして "Hello" という単語を含む <a> ノードが返されます。
これで、データがマップされたコンテンツ コントロールと、それがマップされたカスタム XML パーツとの緊密なリンクを確認することができます。マップされたノードに含まれるデータは、アドインを使用してプログラム的に、または、文書内で直接、変更することができます。この例では、コンテンツ コントロールの内容をロックする必要はありませんが、コンテンツ コントロールは削除に対してロックできることに注意してください。
XML マッピングとイベント
XML ファイルの C:\test.xml と 2 つのテキスト コンテンツ コントロールを使用する前のシナリオと同じシナリオを想定します。XML ファイルの内容を以下に示します。
<?xml version="1.0" standalone="no"?>
<root xmlns="urn:test">
<a>NodeA</a>
<b>NodeB</b>
</root>
XML マッピングを使用して実現することが可能な強力な機能の 1 つは、ユーザーがマップされたテキスト コンテンツ コントロールの 1 つを更新すると、別のテキスト コンテンツ コントロールが直ちに更新される機能です。この手順はイベントを使用して完成します。最初に、イベントを伴うメソッドを作成して実行します。
Dim WithEvents oStream As CustomXMLPart
Sub Demo()
Set oStream = ThisDocument. CustomXMLParts(2)
End Sub
Demo サブルーチンを実行して、イベントをリッスンするように oStream オブジェクトをセットアップします。
前のシナリオでは、<a> ノードにマップされたデータと <b> ノードにマップされた別のデータの 2 つのテキスト コンテンツ コントロールが文書に含まれていたことを思い出してください。<a> ノードが変更されたときに、<b> ノードが自動的に何かを実行するようにイベントをセットアップします。次の oStream_NodeAfterReplace サブルーチンがこれを実現します。
Private Sub oStream_NodeAfterReplace(ByVal OldNode As
Office.CustomXMLNode, ByVal NewNode As _
Office.CustomXMLNode, ByVal InUndoRedo As Boolean)
' ParentNode の BaseName を調べることによって、
' 変更後のノードである NewNode が "a" ノードかどうかをチェックする
If NewNode.ParentNode.BaseName = "a" Then
oStream.DocumentElement.LastChild.Text = "You changed a!"
End If
End Sub
このルーチンは、ユーザーが <a>.要素にマップされた最初のテキスト コンテンツ コントロール内のテキストを変更した後で、トリガされます。<a> ノードが変更されると、カスタム XML パーツ内の最後の子ノードのテキストが更新されます。ストリームには 2 つのノードしか含まれていないため、最後のノードが <b> ノードになります。<b> ノードのテキストが更新されると、更新されたテキストである "You changed a!" が自動的に 2 番目のテキスト コンテンツ コントロールに表示されます。
この例は非常に単純ですが、イベント、XML マッピング、およびコンテンツ コントロールを使用して何ができるかを示しています。これと同様のコードを使用して、1 つのテキスト コンテンツ コントロールが変化したときに、文書内の任意のテキストを更新することができます。文書の書式設定を前提にしていない点と文書の書式設定を変更していない点に注目してください。その代わり、文書にアタッチされたスキーマに対して作用します。
XML マッピングと Word XML Format
新しい Word XML Format では、各カスタム パーツが、ファイル名とそのリレーションシップ情報を含む文書コンテナ内で個別の XML パーツを保持します。Word 2007 では、XML パーツが、dataStore という名前のフォルダ内のファイルのコンテナのルートに保存されます。
_rels フォルダに保存されるリレーションシップ ファイルには、Word XML 文書内部の 1 つの XML パーツから他のすべての XML パーツへのリレーションシップのすべてが記述されています。カスタム XML パーツには、次の 2 種類のリレーションシップがあります。
- XML 用のリレーションシップ タイプは次のとおりです。https://schemas.openxmlformats.org/ /2006/relationships/customXml
- XML プロパティ用のリレーションシップ タイプは次のとおりです。https://schemas.openxmlformats.org/ /2006/relationships/customXmlProps
各リレーションシップと共に ID が保存されるため、データ ストア内で一意的に識別することができます。
実際のカスタム XML パーツは、_rels フォルダと同じレベルの個別のファイルに保存されます。カスタム XML パーツのファイル形式は次のようになります。
<o:dataStoreItem>
<o:dataStoreItem o:itemID="<ID for the custom XML part>"/>
<o:schemaRefs>
<o:schemaRef o:uri="<target namespace for schema>"/>
</o:schemaRefs>
</o:dataStoreItem>
まとめ
Word では頻繁にテンプレートが作成されます。テンプレートは、Office Online Web サイトの 1 つのセクションを占有するほど広く知られています。興味がある方は、テンプレートを参照してください。Word の開発者と設計者は、Word コミュニティに耳を傾けた結果、テンプレート設計者がより堅牢でリッチなテンプレートを作成できる Word 2007 の新機能で答えました。コンテンツ コントロールによって、テンプレート設計者は、あらかじめデザインされた要素 (ドロップダウン メニュー、テキスト ブロック、日付選択、画像など) 内のフォームのようなコンテンツを簡単に文書に追加することができます。これらのコンテンツ コントロールをロックして、エンド ユーザーが誤って変更することを防ぐこともできます。
また、Word 2007 では、文書でカスタム XML を操作する方法が強化されており、データを簡単にコンテンツ コントロールにマップすることができます。Word では、プログラムで簡単にデータと書式設定の両方を変更できるように、文書の表示から XML データが分離されます。オブジェクト モデル内の新しいイベントを使用すれば、文書に貼り付けられたカスタム XML 内の要素にマップされたコンテンツ コントロールを使用してデータを更新する、高速でシンプルなアドインを作成することができます。
この新しい機能によって、テンプレート設計者が文書を作成するスピードが大幅に向上します。それだけでなく、テンプレートの使いやすさと堅牢性が向上します。カスタム XML データにマップすることによって、さまざまな情報を含むコンテンツ コントロールを読み込むことができます。
その他の参考資料
Word 2007 における開発者のための機能強化の詳細については、以下の資料を参照してください。
- Microsoft(R) Windows(R) Software Development Kit (SDK) for Beta 2 of Windows Vista and WinFX Runtime Components (英語)
- Ecma International のダウンロード : Office Open XML 文書交換仕様 (英語)
- ブログ : Brian Jones : Open XML 形式 (英語)
- Channel 9 ビデオ : Office 12 ? Word から PDF へのファイル変換 (英語)
- Channel 9 ビデオ :Open XML ファイル形式 (英語)
- Channel 9 ビデオ : Brian Jones - 新しい Office ファイル形式がアナウンスされました (英語)
謝辞
Mark Iverson の協力に感謝します。