実行時の Office ドキュメントへのコントロールの追加
Microsoft Office Word 文書および Microsoft Office Excel ブックでは、実行時にコントロールを追加するだけでなく、削除することもできます。 実行時にドキュメントに追加するコントロールをダイナミック コントロールといいます。
対象: このトピックの情報は、Excel 2007 と Excel 2010、および Word 2007 と Word 2010 のドキュメント レベルのプロジェクトおよびアプリケーション レベルのプロジェクトに適用されます。詳細については、「Office アプリケーションおよびプロジェクト タイプ別の使用可能な機能」を参照してください。
ここでは、次の情報について説明します。
コントロール コレクションによる実行時のコントロールの管理
ドキュメントへのホスト コントロールの追加
ドキュメントへの Windows フォーム コントロールの追加
関連のビデオ デモについては、「How Do I: Add Controls to a Document Surface at Runtime? (操作方法: 実行時にドキュメントにコントロールを追加する)」を参照してください。
コントロール コレクションによる実行時のコントロールの管理
実行時にコントロールを追加、取得、または削除するには、Microsoft.Office.Tools.Excel.ControlCollection オブジェクトおよび Microsoft.Office.Tools.Word.ControlCollection オブジェクトのヘルパー メソッドを使用します。
これらのオブジェクトにアクセスする方法は、開発しているプロジェクトの種類によって異なります。
Excel のドキュメント レベルのプロジェクトの場合、Sheet1 クラス、Sheet2 クラス、および Sheet3 クラスの Worksheet.Controls プロパティを使用します。 これらのクラスの詳細については、「Worksheet ホスト項目」を参照してください。
Word のドキュメント レベルのプロジェクトの場合、ThisDocument クラスの Document.Controls プロパティを使用します。 このクラスの詳細については、「Document ホスト項目」を参照してください。
Excel または Word のアプリケーション レベルのプロジェクトの場合、実行時に生成される Microsoft.Office.Tools.Excel.Worksheet または Microsoft.Office.Tools.Word.Document の Controls プロパティを使用します。 実行時にこれらのオブジェクトを生成する方法の詳細については、「アプリケーション レベルのアドインにおける実行時の Word 文書や Excel ブックの拡張」を参照してください。
コントロールの追加
Microsoft.Office.Tools.Excel.ControlCollection 型および Microsoft.Office.Tools.Word.ControlCollection 型には、ホスト コントロールおよび一般的な Windows フォーム コントロールを文書やワークシートに追加するために使用できるヘルパー メソッドが含まれています。 各メソッドの名前は Add<control class> という形式です。control class は追加するコントロールの名前のクラス名です。 たとえば、NamedRange コントロールを文書に追加するには、AddNamedRange メソッドを使用します。 ヘルパー メソッドの一覧については、「ホスト コントロールのヘルパー メソッド」および「Windows フォーム コントロールのヘルパー メソッド」を参照してください。
Excel のドキュメント レベルのプロジェクトの Sheet1 に NamedRange を追加するコード例を次に示します。
Dim range1 As Excel.Range = Globals.Sheet1.Range("A1", "D5")
Dim namedRange1 As Microsoft.Office.Tools.Excel.NamedRange = _
Globals.Sheet1.Controls.AddNamedRange(range1, "ChartSource")
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.Document の Controls プロパティを使用して、デザイン時に追加したコントロールを含むドキュメント内のすべてのコントロールを反復処理できます。 デザイン時に追加するコントロールをスタティック コントロールといいます。
コントロールの Delete メソッドを呼び出すか、または各 Controls コレクションの Remove メソッドを呼び出すことにより、ダイナミック コントロールを削除できます。 Remove メソッドを使用して、Excel のドキュメント レベルのプロジェクトの Sheet1 から NamedRange を削除するコード例を次に示します。
Globals.Sheet1.Controls.Remove("ChartSource")
Globals.Sheet1.Controls.Remove("ChartSource");
スタティック コントロールは実行時に削除できません。 Delete メソッドまたは Remove メソッドを使用してスタティック コントロールを削除しようとすると、CannotRemoveControlException がスローされます。
注意
ドキュメントの Shutdown イベント ハンドラーでは、コントロールをプログラムで削除しないでください。 Shutdown イベントが発生すると、ドキュメントの UI 要素は使用できなくなります。 ドキュメントが閉じる前にコントロールを削除するには、Document.BeforeClose や Document.BeforeSave (Word) または Workbook.BeforeClose や Workbook.BeforeSave (Excel) などの別のイベント ハンドラーにコードを追加します。
ドキュメントへのホスト コントロールの追加
ホスト コントロールをプログラムでドキュメントに追加する場合は、そのコントロールを一意に識別する名前を渡し、コントロールを追加するドキュメント上の位置を指定する必要があります。 詳細については、次に示すトピックを参照してください。
ホスト コントロールの詳細については、「ホスト項目とホスト コントロールの概要」を参照してください。
ドキュメントを保存して閉じると、動的に作成されたホスト コントロールはすべてイベントから切断され、データ バインディング機能を失います。 コードをソリューションに追加して、ドキュメントが再び開かれたときにホスト コントロールを再作成することができます。 詳細については、「Office ドキュメントでのダイナミック コントロールの永続化」を参照してください。
注意
XmlMappedRange、XMLNode、XMLNodes の各ホスト コントロールは、プログラムでドキュメントに追加することができないため、それぞれのヘルパー メソッドは用意されていません。
ドキュメントへの Windows フォーム コントロールの追加
Windows フォーム コントロールをプログラムでドキュメントに追加する場合は、そのコントロールの位置とコントロールを一意に識別する名前を渡す必要があります。 Visual Studio Tools for Office Runtime には、各コントロールに対応するヘルパー メソッドが用意されています。 それらのメソッドはオーバーロードされるので、コントロールの位置を範囲または特定の座標で渡すことができます。詳細な手順については、「方法 : Office ドキュメントに Windows フォーム コントロールを追加する」を参照してください。
ドキュメントを保存して閉じるとき、動的に作成された Windows フォーム コントロールはドキュメントから削除されます。 コードをソリューションに追加して、ドキュメントが再び開かれたときにコントロールを再作成することができます。 アプリケーション レベルのアドインを使用してダイナミック Windows フォーム コントロールを作成する場合、コントロールの ActiveX ラッパーはドキュメント内に保持されます。 詳細については、「Office ドキュメントでのダイナミック コントロールの永続化」を参照してください。
注意
Windows フォーム コントロールは、保護されているドキュメントにはプログラムで追加できません。 コントロールを追加するために、Word 文書または Excel ワークシートの保護をプログラムで解除する場合は、ドキュメントを閉じるときにコントロールの ActiveX ラッパーを削除するコードを追加で記述する必要があります。 コントロールの ActiveX ラッパーは、保護されているドキュメントから自動的には削除されません。
カスタム コントロールの追加
使用できるヘルパー メソッド (たとえばカスタム ユーザー コントロール) でサポートされない System.Windows.Forms.Control を追加するには、次のメソッドを使用します。
Excel では、Microsoft.Office.Tools.Excel.ControlCollection オブジェクトの AddControl() メソッドのいずれかを使用します。
Word では、Microsoft.Office.Tools.Word.ControlCollection オブジェクトの AddControl() メソッドのいずれかを使用します。
コントロールを追加するには、System.Windows.Forms.Control、コントロールの位置、およびコントロールを一意に識別する名前を AddControl メソッドに渡します。 AddControl メソッドは、コントロールがワークシートまたは文書とどのように対話するかを定義するオブジェクトを返します。 返されるオブジェクトの型は、プロジェクトによって決まります。
.NET Framework 4 を対象とするプロジェクトでは、このメソッドは Microsoft.Office.Tools.Excel.ControlSite オブジェクト (Excel の場合) または Microsoft.Office.Tools.Word.ControlSite オブジェクト (Word の場合) を返します。
.NET Framework 3.5 を対象とするプロジェクトでは、このメソッドは Microsoft.Office.Tools.Excel.OLEObject オブジェクト (Excel の場合) または Microsoft.Office.Tools.Word.OLEControl オブジェクト (Word の場合) を返します。
AddControl(Control, Range, String) メソッドを使用して、.NET Framework 4 を対象とするドキュメント レベルの Excel プロジェクトのワークシートにカスタム ユーザー コントロールを動的に追加するコード例を次に示します。 この例では、UserControl1 という名前のユーザー コントロール、および range1 という名前の Range コントロールを使用します。このコード例を使用するには、プロジェクトの Sheetn クラスから実行します。
Dim customControl As New UserControl1()
Dim dynamicControl As Microsoft.Office.Tools.Excel.ControlSite = _
Me.Controls.AddControl(customControl, range1, "dynamic")
UserControl1 customControl = new UserControl1();
Microsoft.Office.Tools.Excel.ControlSite dynamicControl =
this.Controls.AddControl(customControl, range1, "dynamic");
カスタム コントロールのメンバーの使用
AddControl メソッドの 1 つを使用してコントロールをワークシートまたは文書に追加すると、2 つの異なるコントロール オブジェクトが存在するようになります。
カスタム コントロールを表す System.Windows.Forms.Control。
ワークシートまたは文書に追加された後のコントロールを表す ControlSite、OLEObject、または OLEControl オブジェクト。
これらのコントロールの間で、多くのプロパティおよびメソッドが共有されます。 これらのメンバーには、適切なコントロールからアクセスする必要があります。
カスタム コントロールのみに属するメンバーにアクセスするには、System.Windows.Forms.Control を使用します。
コントロールが共有するメンバーにアクセスするには、ControlSite、OLEObject、または OLEControl オブジェクトを使用します。
System.Windows.Forms.Control から共有のメンバーにアクセスした場合は、警告や通知なしにアクセスが失敗します。無効な結果が生成される場合もあります。 ControlSite、OLEObject、または OLEControl オブジェクトのメソッドまたはプロパティを常に使用し、必要なメソッドやプロパティが使用できない場合にのみ System.Windows.Forms.Control を参照してください。
たとえば、ControlSite クラスと System.Windows.Forms.Control クラスの両方に Top プロパティがあります。 コントロールの上端とテキストの上端の間の距離を取得または設定するには、System.Windows.Forms.Control の Top プロパティではなく、ControlSite の Top プロパティを使用します。
' Property is set in relation to the document.
dynamicControl.Top = 100
' Property is set in relation to the container control.
customControl.Top = 100
// Property is set in relation to the document.
dynamicControl.Top = 100;
// Property is set in relation to the container control.
customControl.Top = 100;
参照
処理手順
方法 : ワークシートに ListObject コントロールを追加する
方法 : ワークシートに NamedRange コントロールを追加する
方法 : ワークシートに Chart コントロールを追加する
方法 : Word 文書にコンテンツ コントロールを追加する
方法 : Word 文書に Bookmark コントロールを追加する
方法 : Office ドキュメントに Windows フォーム コントロールを追加する
概念
Office ドキュメントでのダイナミック コントロールの永続化
Office ドキュメントでの Windows フォーム コントロールの概要