Microsoft Visual Studio Tools for the Microsoft Office system (version 3.0)
実行時の Office ドキュメントへのコントロールの追加

更新 : 2008 年 7 月

対象

このトピックの情報は、指定された Visual Studio Tools for Office プロジェクトおよび Microsoft Office のバージョンにのみ適用されます。

ドキュメント レベルのプロジェクト

  • Excel 2003

  • Excel 2007

  • Word 2003

  • Word 2007

アプリケーション レベルのプロジェクト

  • Excel 2007

  • Word 2007

詳細については、「アプリケーションおよびプロジェクトの種類別の使用可能な機能」を参照してください。

Microsoft Office Word 文書および Microsoft Office Excel ブックでは、実行時にコントロールを追加するだけでなく、削除することもできます。実行時にドキュメントに追加するコントロールをダイナミック コントロールといいます。Visual Studio 2008 Service Pack 1 (SP1) より、アプリケーション レベルのアドインを使用して、ダイナミック コントロールを文書およびブックに追加できるようになりました。

ここでは、次の情報について説明します。

コントロール コレクションによる実行時のコントロールの管理

実行時にコントロールを追加、取得、または削除するには、Microsoft.Office.Tools.Excel..::.ControlCollection クラスおよび Microsoft.Office.Tools.Word..::.ControlCollection クラスのヘルパー メソッドを使用します。

コントロール コレクションにアクセスする方法は、開発しているプロジェクトの種類によって異なります。

コントロールの追加

Microsoft.Office.Tools.Excel..::.ControlCollection クラスおよび Microsoft.Office.Tools.Word..::.ControlCollection クラスには、ホスト コントロールおよび一般的な Windows フォーム コントロールを文書やワークシートに追加するために使用できるヘルパー メソッドが含まれています。各メソッドの名前は Add<control class> という形式です。control class は追加するコントロールの名前のクラス名です。たとえば、NamedRange コントロールを文書に追加するには、AddNamedRange メソッドを使用します。ヘルパー メソッドの一覧については、「ホスト コントロールのヘルパー メソッド」および「Windows フォーム コントロールのヘルパー メソッド」を参照してください。

Excel のドキュメント レベルのプロジェクトの Sheet1NamedRange を追加するコード例を次に示します。

Visual Basic
Dim range1 As Excel.Range = Globals.Sheet1.Range("A1", "D5")
Dim namedRange1 As Microsoft.Office.Tools.Excel.NamedRange = _
    Globals.Sheet1.Controls.AddNamedRange(range1, "ChartSource")
C#
Excel.Range range1 = Globals.Sheet1.Range["A1", "D5"];
Microsoft.Office.Tools.Excel.NamedRange namedRange1 =
    Globals.Sheet1.Controls.AddNamedRange(range1, "ChartSource");

コントロールのアクセスおよび削除

Microsoft.Office.Tools.Excel..::.Worksheet または Microsoft.Office.Tools.Word..::.DocumentControls プロパティを使用して、デザイン時に追加したコントロールを含むドキュメント内のすべてのコントロールを反復処理できます。デザイン時に追加するコントロールをスタティック コントロールといいます。

コントロールの Delete メソッドを呼び出すか、または各 Controls コレクションの Remove メソッドを呼び出すことにより、ダイナミック コントロールを削除できます。Remove メソッドを使用して、Excel のドキュメント レベルのプロジェクトの Sheet1 から NamedRange を削除するコード例を次に示します。

Visual Basic
Globals.Sheet1.Controls.Remove("ChartSource")
C#
Globals.Sheet1.Controls.Remove("ChartSource");

スタティック コントロールは実行時に削除できません。Delete メソッドまたは Remove メソッドを使用してスタティック コントロールを削除しようとすると、CannotRemoveControlException がスローされます。

メモ :

ドキュメントの Shutdown イベント ハンドラでは、コントロールをプログラムで削除しないでください。Shutdown イベントが発生すると、ドキュメントの UI 要素は使用できなくなります。ドキュメントが閉じる前にコントロールを削除するには、Document..::.BeforeCloseDocument..::.BeforeSave (Word) または Workbook..::.BeforeCloseWorkbook..::.BeforeSave (Excel) などの別のイベント ハンドラにコードを追加します。

ドキュメントへのホスト コントロールの追加

ホスト コントロールをプログラムでドキュメントに追加する場合は、そのコントロールを一意に識別する名前を渡し、コントロールを追加するドキュメント上の位置を指定する必要があります。詳細については、次に示すトピックを参照してください。

ホスト コントロールの詳細については、「ホスト項目とホスト コントロールの概要」を参照してください。

ドキュメントを保存して閉じると、動的に作成されたホスト コントロールはすべてイベントから切断され、データ バインディング機能を失います。コードをソリューションに追加して、ドキュメントが再び開かれたときにホスト コントロールを再作成することができます。詳細については、「Office ドキュメントでのダイナミック コントロールの永続化」を参照してください。

メモ :

XmlMappedRangeXMLNodeXMLNodes の各ホスト コントロールは、プログラムでドキュメントに追加することができないため、それぞれのヘルパー メソッドは用意されていません。

ドキュメントへの Windows フォーム コントロールの追加

Windows フォーム コントロールをプログラムでドキュメントに追加する場合は、そのコントロールの位置とコントロールを一意に識別する名前を渡す必要があります。Visual Studio Tools for Office には、各コントロールに対応するヘルパー メソッドが用意されています。それらのメソッドはオーバーロードされるので、コントロールの位置を範囲または特定の座標で渡すことができます。詳細な手順については、「方法 : Office ドキュメントに Windows フォーム コントロールを追加する」を参照してください。

ドキュメントを保存して閉じるとき、動的に作成された Windows フォーム コントロールはドキュメントから削除されます。コードをソリューションに追加して、ドキュメントが再び開かれたときにコントロールを再作成することができます。アプリケーション レベルのアドインを使用してダイナミック Windows フォーム コントロールを作成する場合、コントロールの ActiveX ラッパーはドキュメント内に保持されます。詳細については、「Office ドキュメントでのダイナミック コントロールの永続化」を参照してください。

メモ :

Windows フォーム コントロールは、保護されているドキュメントにはプログラムで追加できません。コントロールを追加するために、Word 文書または Excel ワークシートの保護をプログラムで解除する場合は、ドキュメントを閉じるときにコントロールの ActiveX ラッパーを削除するコードを追加で記述する必要があります。コントロールの ActiveX ラッパーは、保護されているドキュメントから自動的には削除されません。

カスタム コントロールの追加

使用できるヘルパー メソッド (たとえばカスタム ユーザー コントロール) でサポートされない System.Windows.Forms..::.Control を追加するには、次のメソッドを使用します。

コントロールを追加するには、System.Windows.Forms..::.Control、コントロールの位置、およびコントロールを一意に識別する名前を AddControl メソッドに渡します。Excel では、このメソッドは OLEObject を返します。Word では、このメソッドは OLEControl を返します。これらのオブジェクトは、コントロールがワークシートまたは文書とどのように対話するかを定義します。

AddControl(Control, Range, String) メソッドを使用して、カスタム ユーザー コントロールをワークシートに動的に追加するコード例を次に示します。この例では、UserControl1 という名前のユーザー コントロール、および range1 という名前の Range コントロールを使用します。この例は、Excel のドキュメント レベルのプロジェクトのいずれかの Sheetn クラスから実行することを前提としています。

Visual Basic
Dim customControl As New UserControl1()

Dim dynamicControl As Microsoft.Office.Tools.Excel.OLEObject = _
    Me.Controls.AddControl(customControl, range1, "dynamic")
C#
UserControl1 customControl = new UserControl1();

Microsoft.Office.Tools.Excel.OLEObject dynamicControl =
    this.Controls.AddControl(customControl, range1, "dynamic");

カスタム コントロールのメンバの使用

AddControl メソッドの 1 つを使用してコントロールをワークシートまたは文書に追加すると、2 つの異なるコントロール オブジェクトが存在するようになります。

これらのコントロールの間で、多くのプロパティおよびメソッドが共有されます。これらのメソッドとプロパティには、適切なコントロールからアクセスする必要があります。

  • カスタム コントロールのみに属するプロパティおよびメソッドにアクセスするには、System.Windows.Forms..::.Control を使用します。

  • コントロールが共有するプロパティおよびメソッドにアクセスするには、OLEObject または OLEControl を使用します。

System.Windows.Forms..::.Control から共有のメソッドやプロパティにアクセスした場合は、警告や通知なしにアクセスが失敗します。無効な結果が生成される場合もあります。OLEObject または OLEControl のメソッドまたはプロパティを常に使用し、必要なメソッドやプロパティが使用できない場合にのみ System.Windows.Forms..::.Control を参照してください。

たとえば、OLEObject クラスと System.Windows.Forms..::.Control クラスの両方に Top プロパティがあります。コントロールの上端とテキストの上端の間の距離を取得または設定するには、System.Windows.Forms..::.ControlTop プロパティではなく、OLEObjectTop プロパティを使用します。

Visual Basic
' Property is set in relation to the document.
dynamicControl.Top = 100

' Property is set in relation to the container control.
customControl.Top = 100
C#
// Property is set in relation to the document.
dynamicControl.Top = 100;

// Property is set in relation to the container control.
customControl.Top = 100;
参照

処理手順

概念

参照

その他の技術情報

履歴の変更

日付

履歴

理由

2008 年 7 月

アプリケーション レベルのアドインを使用したドキュメントへのコントロールの追加に関する情報を追加

SP1 機能変更

タグ :


Page view tracker