チュートリアル : 実行時におけるアプリケーション レベルのプロジェクトのワークシートへのコントロールの追加
更新 : 2008 年 7 月
対象 |
---|
このトピックの情報は、指定された Visual Studio Tools for Office プロジェクトおよび Microsoft Office のバージョンにのみ適用されます。 プロジェクトの種類
Microsoft Office のバージョン
詳細については、「アプリケーションおよびプロジェクトの種類別の使用可能な機能」を参照してください。 |
Excel 2007 アドインを使用して、任意の開いているワークシートにコントロールを追加できます。このチュートリアルでは、リボンを使用してユーザーがワークシートに Button、NamedRange、および ListObject を追加できるようにする方法を説明します。
詳細については、「実行時の Office ドキュメントへのコントロールの追加」を参照してください。
このチュートリアルでは、次の作業について説明します。
ワークシートにコントロールを追加するためのユーザー インターフェイス (UI: User Interface) を提供する。
ワークシートにコントロールを追加する。
ワークシートからコントロールを削除する。
メモ : |
---|
お使いのマシンで、Visual Studio ユーザー インターフェイスの一部の要素の名前や場所が、次の手順とは異なる場合があります。これらの要素は、使用している Visual Studio のエディションや独自の設定によって決まります。詳細については、「Visual Studio の設定」を参照してください。 |
前提条件
このチュートリアルを実行するには、次のコンポーネントが必要です。
Visual Studio Tools for Office (Visual Studio 2008 Professional および Visual Studio Team System のオプションの要素)
Visual Studio 2008 Service Pack 1 (SP1)
Microsoft Office Excel 2007
新しい Excel アドイン プロジェクトの作成
まず、Excel 2007 のアドイン プロジェクトを作成します。
新しい Excel アドイン プロジェクトを作成するには
Visual Studio で、ExcelDynamicControls という名前の Excel 2007 アドイン プロジェクトを作成します。
[新しいプロジェクト] ダイアログ ボックスの [ソリューションのディレクトリを作成] チェック ボックスをオンにします。
プロジェクトを任意の場所に保存します。
詳細については、「方法 : Visual Studio Tools for Office プロジェクトを作成する」を参照してください。
ワークシートにコントロールを追加するための UI の提供
Excel 2007 のリボンにカスタム タブを追加します。ユーザーはタブにあるチェック ボックスをオンにして、ワークシートにコントロールを追加できます。
ワークシートにコントロールを追加するための UI を提供するには
[プロジェクト] メニューの [新しい項目の追加] をクリックします。
[新しい項目の追加] ダイアログ ボックスで、[リボン (ビジュアル デザイナ)] を選択し、[追加] をクリックします。
リボン デザイナで Ribbon1.cs または Ribbon1.vb という名前のファイルが開き、既定のタブとグループが表示されます。
ツールボックスの [Office リボン コントロール] タブから、CheckBox コントロールを group1 にドラッグします。
[CheckBox1] をクリックして選択します。
[プロパティ] ウィンドウで、次のプロパティを変更します。
プロパティ
値
Name
Button
Label
Button
group1 に 2 つ目のチェック ボックスを追加し、次のプロパティを変更します。
プロパティ
値
Name
NamedRange
Label
NamedRange
group1 に 3 つ目のチェック ボックスを追加し、次のプロパティを変更します。
プロパティ
値
Name
ListObject
Label
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 worksheet = CType(Globals.ThisAddIn.Application.ActiveWorkbook.Worksheets(1), _ Excel.Worksheet).GetVstoObject() 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 = ((Excel.Worksheet) Globals.ThisAddIn.Application. ActiveWorkbook.Worksheets[1]).GetVstoObject(); 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 worksheet = CType(Globals.ThisAddIn.Application.ActiveWorkbook.Worksheets(1), _ Excel.Worksheet).GetVstoObject() 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 = ((Excel.Worksheet)Globals.ThisAddIn.Application.ActiveWorkbook. Worksheets[1]).GetVstoObject(); 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 worksheet = CType(Globals.ThisAddIn.Application.ActiveWorkbook.Worksheets(1), _ Excel.Worksheet).GetVstoObject() 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 = ((Excel.Worksheet)Globals.ThisAddIn.Application.ActiveWorkbook. Worksheets[1]).GetVstoObject(); 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); } }
リボン コード ファイルの先頭に次の using ステートメントを追加します。
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 メソッドを使用して、ワークシートに Visual Studio Tools for Office ワークシート オブジェクトが生成されているかどうかを確認します。生成されたワークシート オブジェクトにコントロールがある場合は、コードはそのワークシート オブジェクトを取得し、コントロール コレクションを反復処理してコントロールを削除します。
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 worksheet.HasVstoObject() And worksheet.GetVstoObject().Controls.Count > 0 Then Dim vstoWorksheet As Worksheet = worksheet.GetVstoObject() 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 (worksheet.HasVstoObject() && worksheet.GetVstoObject().Controls.Count > 0) { Worksheet vstoWorksheet = worksheet.GetVstoObject(); while (vstoWorksheet.Controls.Count > 0) { object vstoControl = vstoWorksheet.Controls[0]; vstoWorksheet.Controls.Remove(vstoControl); } } }
C# では、WorkbookBeforeSave イベントのイベント ハンドラを作成する必要があります。このコードを ThisAddIn_Startup メソッドに追加できます。イベンド ハンドラの作成方法の詳細については、「方法 : Visual Studio Tools for 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 2007 アドイン プロジェクトのコントロールの詳細については、以下のトピックを参照してください。
- ワークシートにコントロールを保存する方法の詳細については、「Excel アドインのダイナミック コントロールのサンプル」を参照してください。
参照
概念
Excel ワークシート上での Windows フォーム コントロールの使用
その他の技術情報
履歴の変更
日付 |
履歴 |
理由 |
---|---|---|
2008 年 7 月 |
トピックを追加 |
SP1 機能変更 |