チュートリアル : 実行時におけるアプリケーション レベルのプロジェクトのワークシートへのコントロールの追加
Excel アドインを使用して、任意の開いているワークシートにコントロールを追加できます。このチュートリアルでは、リボンを使用してユーザーがワークシートに Button、NamedRange、および ListObject を追加できるようにする方法を説明します。詳細については、「実行時の Office ドキュメントへのコントロールの追加」を参照してください。
適用されます: は、このトピックの情報は、Excel 2010のアプリケーション レベルのプロジェクトを適用します。詳細については、「Office アプリケーションおよびプロジェクト タイプ別の使用可能な機能」を参照してください。
このチュートリアルでは、次の作業について説明します。
ワークシートにコントロールを追加するためのユーザー インターフェイス (UI: User Interface) を提供する。
ワークシートにコントロールを追加する。
ワークシートからコントロールを削除する。
[!メモ]
お使いのマシンで、Visual Studio ユーザー インターフェイスの一部の要素の名前や場所が、次の手順とは異なる場合があります。これらの要素は、使用している Visual Studio のエディションや独自の設定によって決まります。詳細については、「Visual Studio の設定」を参照してください。
必須コンポーネント
このチュートリアルを実行するには、次のコンポーネントが必要です。
-
Microsoft Office Developer Tools が含まれているエディションの Visual Studio 2012。詳細については、「[Office ソリューションを開発できるようにコンピューターを構成する](bb398242\(v=vs.110\).md)」を参照してください。
- Excel 2013 または Excel 2010。
新しい Excel アドイン プロジェクトの作成
まず、Excel のアドイン プロジェクトを作成します。
新しい Excel アドイン プロジェクトを作成するには
Visual Studio で、ExcelDynamicControls という名前の Excel アドイン プロジェクトを作成します。詳細については、「方法: Visual Studio で Office プロジェクトを作成する」を参照してください。
[Microsoft.Office.Tools.Excel.v4.0.Utilities.dll] のアセンブリへの参照を追加します。この参照は、このチュートリアルの後半で Windows フォーム コントロールをワークシートにプログラムで追加するのに必要です。
ワークシートにコントロールを追加するための UI の提供
Excel のリボンにカスタム タブを追加します。ユーザーはタブにあるチェック ボックスをオンにして、ワークシートにコントロールを追加できます。
ワークシートにコントロールを追加するための UI を提供するには
[プロジェクト] メニューの [新しい項目の追加] をクリックします。
[新しい項目の追加] ダイアログ ボックスで、[リボン (ビジュアル デザイナー)] を選択し、[追加] をクリックします。
リボン デザイナーで Ribbon1.cs または Ribbon1.vb という名前のファイルが開き、既定のタブとグループが表示されます。
ツールボックスの [Office リボン コントロール] タブから、CheckBox コントロールを group1 にドラッグします。
[CheckBox1] をクリックして選択します。
[プロパティ] ウィンドウで、次のプロパティを変更します。
プロパティ
価値
名前
ボタン
ラベル
ボタン
group1 に 2 つ目のチェック ボックスを追加し、次のプロパティを変更します。
プロパティ
価値
名前
NamedRange
ラベル
NamedRange
group1 に 3 つ目のチェック ボックスを追加し、次のプロパティを変更します。
プロパティ
価値
名前
ListObject
ラベル
ListObject
ワークシートへのコントロールの追加
マネージ コントロールは、コンテナーとして機能するホスト項目に対してのみ追加できます。アドイン プロジェクトは任意の開いているブックに対して機能するため、アドインはワークシートをホスト項目に変換するか、または既存のホスト項目を取得してから、コントロールを追加します。開いているワークシートに基づいた Worksheet ホスト項目を作成するように、各コントロールのクリック イベント ハンドラーにコードを追加します。次に、ワークシートの現在選択されている位置に Button、NamedRange、および ListObject を追加します。
ワークシートにコントロールを追加するには
リボン デザイナーで [Button] をダブルクリックします。
[Button] チェック ボックスの Click イベント ハンドラーがコード エディターで開きます。
Button_Click イベント ハンドラーを次のコードで置き換えます。
このコードでは、GetVstoObject メソッドを使用してブックの最初のワークシートを表すホスト項目を取得し、現在選択されているセルに Button コントロールを追加します。
Private Sub Button_Click(ByVal sender As System.Object, _ ByVal e As Microsoft.Office.Tools.Ribbon.RibbonControlEventArgs) _ Handles Button.Click Dim NativeWorksheet As Microsoft.Office.Interop.Excel.Worksheet = Globals.ThisAddIn.Application.ActiveWorkbook.Worksheets(1) Dim worksheet As Microsoft.Office.Tools.Excel.Worksheet = Globals.Factory.GetVstoObject(NativeWorksheet) Dim buttonName As String = "MyButton" If CType(sender, RibbonCheckBox).Checked Then Dim selection As Excel.Range = Globals.ThisAddIn.Application.Selection If Not (selection Is Nothing) Then Dim button As New Microsoft.Office.Tools.Excel.Controls.Button() worksheet.Controls.AddControl(button, selection, buttonName) End If Else worksheet.Controls.Remove(buttonName) End If End Sub
private void Button_Click(object sender, RibbonControlEventArgs e) { Worksheet worksheet = Globals.Factory.GetVstoObject( Globals.ThisAddIn.Application.ActiveWorkbook.Worksheets[1]); string buttonName = "MyButton"; if (((RibbonCheckBox)sender).Checked) { Excel.Range selection = Globals.ThisAddIn.Application.Selection as Excel.Range; if (selection != null) { Microsoft.Office.Tools.Excel.Controls.Button button = new Microsoft.Office.Tools.Excel.Controls.Button(); worksheet.Controls.AddControl(button, selection, buttonName); } } else { worksheet.Controls.Remove(buttonName); } }
ソリューション エクスプローラーで、Ribbon1.cs または Ribbon1.vb を選択します。
[表示] メニューの [デザイナー] をクリックします。
リボン デザイナーで [NamedRange] をダブルクリックします。
NamedRange_Click イベント ハンドラーを次のコードで置き換えます。
このコードでは、GetVstoObject メソッドを使用してブックの最初のワークシートを表すホスト項目を取得し、現在選択されている 1 つまたは複数のセルに NamedRange コントロールを定義します。
Private Sub NamedRange_Click(ByVal sender As System.Object, _ ByVal e As Microsoft.Office.Tools.Ribbon.RibbonControlEventArgs) _ Handles NamedRange.Click Dim NativeWorksheet As Microsoft.Office.Interop.Excel.Worksheet = Globals.ThisAddIn.Application.ActiveWorkbook.Worksheets(1) Dim worksheet As Microsoft.Office.Tools.Excel.Worksheet = Globals.Factory.GetVstoObject(NativeWorksheet) Dim rangeName As String = "MyNamedRange" If CType(sender, RibbonCheckBox).Checked Then Dim selection As Excel.Range = Globals.ThisAddIn.Application.Selection If Not (selection Is Nothing) Then Dim namedRange As NamedRange = _ worksheet.Controls.AddNamedRange(selection, rangeName) End If Else worksheet.Controls.Remove(rangeName) End If End Sub
private void NamedRange_Click(object sender, RibbonControlEventArgs e) { Worksheet worksheet = Globals.Factory.GetVstoObject( Globals.ThisAddIn.Application.ActiveWorkbook.Worksheets[1]); string Name = "MyNamedRange"; if (((RibbonCheckBox)sender).Checked) { Excel.Range selection = Globals.ThisAddIn.Application.Selection as Excel.Range; if (selection != null) { worksheet.Controls.AddNamedRange(selection, Name); } } else { worksheet.Controls.Remove(Name); } }
リボン デザイナーで [ListObject] をダブルクリックします。
ListObject_Click イベント ハンドラーを次のコードで置き換えます。
このコードでは、GetVstoObject メソッドを使用してブックの最初のワークシートを表すホスト項目を取得し、現在選択されている 1 つまたは複数のセルに ListObject を定義します。
Private Sub ListObject_Click(ByVal sender As System.Object, _ ByVal e As Microsoft.Office.Tools.Ribbon.RibbonControlEventArgs) _ Handles ListObject.Click Dim NativeWorksheet As Microsoft.Office.Interop.Excel.Worksheet = Globals.ThisAddIn.Application.ActiveWorkbook.Worksheets(1) Dim worksheet As Microsoft.Office.Tools.Excel.Worksheet = Globals.Factory.GetVstoObject(NativeWorksheet) Dim listObjectName As String = "MyListObject" If CType(sender, RibbonCheckBox).Checked Then Dim selection As Excel.Range = _ Globals.ThisAddIn.Application.Selection If Not (selection Is Nothing) Then worksheet.Controls.AddListObject(selection, listObjectName) End If Else worksheet.Controls.Remove(listObjectName) End If End Sub
private void ListObject_Click(object sender, RibbonControlEventArgs e) { Worksheet worksheet = Globals.Factory.GetVstoObject( Globals.ThisAddIn.Application.ActiveWorkbook.Worksheets[1]); string listObjectName = "MyListObject"; if (((RibbonCheckBox)sender).Checked) { Excel.Range selection = Globals.ThisAddIn.Application.Selection as Excel.Range; if (selection != null) { worksheet.Controls.AddListObject(selection, listObjectName); } } else { worksheet.Controls.Remove(listObjectName); } }
リボン コード ファイルの先頭に次のステートメントを追加します。
Imports Excel = Microsoft.Office.Interop.Excel Imports Microsoft.Office.Tools.Excel Imports Microsoft.Office.Tools.Excel.Extensions
using Excel = Microsoft.Office.Interop.Excel; using Microsoft.Office.Tools.Excel; using Microsoft.Office.Tools.Excel.Extensions;
ワークシートからのコントロールの削除
ワークシートが保存されて閉じられるとき、コントロールは保持されません。ワークシートを保存する前に、生成されたすべての Windows フォーム コントロールをプログラムによって削除する必要があります。そうしないと、ワークシートを再び開いたときに、コントロールのアウトラインが表示されることになります。生成されたホスト項目のコントロール コレクションから Windows フォーム コントロールを削除するコードを、WorkbookBeforeSave イベントに追加します。詳細については、「Office ドキュメントでのダイナミック コントロールの永続化」を参照してください。
ワークシートからコントロールを削除するには
ソリューション エクスプローラーで、ThisAddIn.cs または ThisAddIn.vb を選択します。
[表示] メニューの [コード] をクリックします。
ThisAddIn クラスに次のメソッドを追加します。このコードはブックの最初のワークシートを取得し、HasVstoObject メソッドを使用して、ワークシートにワークシート オブジェクトが生成されているかどうかを確認します。生成されたワークシート オブジェクトにコントロールがある場合は、コードはそのワークシート オブジェクトを取得し、コントロール コレクションを反復処理してコントロールを削除します。
Sub Application_WorkbookBeforeSave _ (ByVal workbook As Microsoft.Office.Interop.Excel.Workbook, _ ByVal SaveAsUI As Boolean, ByRef Cancel As Boolean) _ Handles Application.WorkbookBeforeSave Dim worksheet As Excel.Worksheet = workbook.Worksheets(1) If Globals.Factory.HasVstoObject(worksheet) And Globals.Factory.GetVstoObject(worksheet).Controls.Count > 0 Then Dim vstoWorksheet As Worksheet = Globals.Factory.GetVstoObject(worksheet) While vstoWorksheet.Controls.Count > 0 Dim vstoControl As Object = vstoWorksheet.Controls(0) vstoWorksheet.Controls.Remove(vstoControl) End While End If End Sub
void Application_WorkbookBeforeSave(Microsoft.Office.Interop.Excel.Workbook workbook, bool SaveAsUI, ref bool Cancel) { Excel.Worksheet worksheet = workbook.Worksheets[1] as Excel.Worksheet; if (Globals.Factory.HasVstoObject(worksheet) && Globals.Factory.GetVstoObject(worksheet).Controls.Count > 0) { Worksheet vstoWorksheet = Globals.Factory.GetVstoObject(worksheet); while (vstoWorksheet.Controls.Count > 0) { object vstoControl = vstoWorksheet.Controls[0]; vstoWorksheet.Controls.Remove(vstoControl); } } }
C# では、WorkbookBeforeSave イベントのイベント ハンドラーを作成する必要があります。このコードを ThisAddIn_Startup メソッドに追加できます。イベンド ハンドラーの作成方法の詳細については、「方法: Office プロジェクトでイベント ハンドラーを作成する」を参照してください。ThisAddIn_Startup メソッドを次のコードに置き換えます。
private void ThisAddIn_Startup(object sender, System.EventArgs e) { this.Application.WorkbookBeforeSave += new Microsoft.Office.Interop.Excel.AppEvents_WorkbookBeforeSaveEventHandler (Application_WorkbookBeforeSave); }
ソリューションのテスト
リボンのカスタム タブからコントロールを選択し、ワークシートに追加します。ワークシートを保存すると、これらのコントロールは削除されます。
ソリューションをテストするには
F5 キーを押してプロジェクトを実行します。
Sheet1 で任意のセルを選択します。
[アドイン] タブをクリックします。
[group1] グループで、[Button] をクリックします。
選択したセルにボタンが表示されます。
Sheet1 で別のセルを選択します。
[group1] グループで、[NamedRange] をクリックします。
選択したセルに、名前付き範囲が定義されます。
Sheet1 で一連のセルを選択します。
[group1] グループで、[ListObject] をクリックします。
選択したセルにリスト オブジェクトが追加されます。
ワークシートを保存します。
Sheet1 に追加したコントロールは表示されなくなります。
次の手順
Excel アドイン プロジェクトのコントロールの詳細については、以下のトピックを参照してください。
- ワークシートにコントロールを保存する方法の詳細については、「Office 開発のサンプルとチュートリアル」の Excel アドインのダイナミック コントロールのサンプルを参照してください。
参照
概念
Office ドキュメントでの Windows フォーム コントロールの概要