実行時の Office ドキュメントへのコントロールの追加
実行時にMicrosoft Office ExcelのMicrosoft Office Word文書およびブックにコントロールを追加できます。実行時に削除することもできます。追加または実行時の削除を ダイナミック コントロールと呼ばれるコントロール。
対象: このトピックの情報は、Excel 2013 と Excel 2010、および Word 2013 と 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クラスを制御します。があります。たとえば、NamedRange コントロールを文書に追加するには、AddNamedRange メソッドを使用します。
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 には、各コントロールに対応するヘルパー メソッドが用意されています。これらのメソッドは、コントロールの位置を範囲または特定の座標を渡すことができるようにオーバーロードされます。
ドキュメントを保存して閉じるとき、動的に作成された 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 メソッドは、コントロールがワークシートまたは文書とどのように対話するかを定義するオブジェクトを返します。AddControl のメソッドは Microsoft.Office.Tools.Excel.ControlSite (Excelの場合) または Microsoft.Office.Tools.Word.ControlSite のオブジェクトを返します (Wordの場合)。
次のコード例は、動的にドキュメント レベルのExcelプロジェクトのワークシートにカスタム ユーザー コントロールを追加するに AddControl(Control, Range, String) のメソッドを使用する方法を示します。この例では、ユーザー コントロールに UserControl1という名前で、Rangerange1はという名前です。この例を実行 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 フォーム コントロールの概要