次の方法で共有


チュートリアル : 実行時におけるアプリケーション レベルのプロジェクトのワークシートへのコントロールの追加

更新 : 2008 年 7 月

対象

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

プロジェクトの種類

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

Microsoft Office のバージョン

  • Excel 2007

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

Excel 2007 アドインを使用して、任意の開いているワークシートにコントロールを追加できます。このチュートリアルでは、リボンを使用してユーザーがワークシートに ButtonNamedRange、および ListObject を追加できるようにする方法を説明します。

詳細については、「実行時の Office ドキュメントへのコントロールの追加」を参照してください。

このチュートリアルでは、次の作業について説明します。

  • ワークシートにコントロールを追加するためのユーザー インターフェイス (UI: User Interface) を提供する。

  • ワークシートにコントロールを追加する。

  • ワークシートからコントロールを削除する。

Cc442817.alert_note(ja-jp,VS.90).gifメモ :

お使いのマシンで、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 アドイン プロジェクトを作成するには

  1. Visual Studio で、ExcelDynamicControls という名前の Excel 2007 アドイン プロジェクトを作成します。

  2. [新しいプロジェクト] ダイアログ ボックスの [ソリューションのディレクトリを作成] チェック ボックスをオンにします。

  3. プロジェクトを任意の場所に保存します。

    詳細については、「方法 : Visual Studio Tools for Office プロジェクトを作成する」を参照してください。

ワークシートにコントロールを追加するための UI の提供

Excel 2007 のリボンにカスタム タブを追加します。ユーザーはタブにあるチェック ボックスをオンにして、ワークシートにコントロールを追加できます。

ワークシートにコントロールを追加するための UI を提供するには

  1. [プロジェクト] メニューの [新しい項目の追加] をクリックします。

  2. [新しい項目の追加] ダイアログ ボックスで、[リボン (ビジュアル デザイナ)] を選択し、[追加] をクリックします。

    リボン デザイナで Ribbon1.cs または Ribbon1.vb という名前のファイルが開き、既定のタブとグループが表示されます。

  3. ツールボックス[Office リボン コントロール] タブから、CheckBox コントロールを group1 にドラッグします。

  4. [CheckBox1] をクリックして選択します。

  5. [プロパティ] ウィンドウで、次のプロパティを変更します。

    プロパティ

    Name

    Button

    Label

    Button

  6. group1 に 2 つ目のチェック ボックスを追加し、次のプロパティを変更します。

    プロパティ

    Name

    NamedRange

    Label

    NamedRange

  7. group1 に 3 つ目のチェック ボックスを追加し、次のプロパティを変更します。

    プロパティ

    Name

    ListObject

    Label

    ListObject

ワークシートへのコントロールの追加

マネージ コントロールは、コンテナとして機能するホスト項目に対してのみ追加できます。アドイン プロジェクトは任意の開いているブックに対して機能するため、アドインはワークシートをホスト項目に変換するか、または既存のホスト項目を取得してから、コントロールを追加します。開いているワークシートに基づいた Worksheet ホスト項目を作成するように、各コントロールのクリック イベント ハンドラにコードを追加します。次に、ワークシートの現在選択されている位置に ButtonNamedRange、および ListObject を追加します。

ワークシートにコントロールを追加するには

  1. リボン デザイナで [Button] をダブルクリックします。

    [Button] チェック ボックスの Click イベント ハンドラがコード エディタで開きます。

  2. 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);
        }
    }
    
  3. ソリューション エクスプローラで、Ribbon1.cs または Ribbon1.vb を選択します。

  4. [表示] メニューの [デザイナ] をクリックします。

  5. リボン デザイナで [NamedRange] をダブルクリックします。

  6. 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);
        }
    }
    
  7. リボン デザイナで [ListObject] をダブルクリックします。

  8. 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);
        }
    }
    
  9. リボン コード ファイルの先頭に次の 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 ドキュメントでのダイナミック コントロールの永続化」を参照してください。

ワークシートからコントロールを削除するには

  1. ソリューション エクスプローラで、ThisAddIn.cs または ThisAddIn.vb を選択します。

  2. [表示] メニューの [コード] をクリックします。

  3. 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);
            }
    
        }
    }
    
  4. 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);
    }
    

ソリューションのテスト

リボンのカスタム タブからコントロールを選択し、ワークシートに追加します。ワークシートを保存すると、これらのコントロールは削除されます。

ソリューションをテストするには

  1. F5 キーを押してプロジェクトを実行します。

  2. Sheet1 で任意のセルを選択します。

  3. [アドイン] タブをクリックします。

  4. [group1] グループで、[Button] をクリックします。

    選択したセルにボタンが表示されます。

  5. Sheet1 で別のセルを選択します。

  6. [group1] グループで、[NamedRange] をクリックします。

    選択したセルに、名前付き範囲が定義されます。

  7. Sheet1 で一連のセルを選択します。

  8. [group1] グループで、[ListObject] をクリックします。

    選択したセルにリスト オブジェクトが追加されます。

  9. ワークシートを保存します。

    Sheet1 に追加したコントロールは表示されなくなります。

次の手順

Excel 2007 アドイン プロジェクトのコントロールの詳細については、以下のトピックを参照してください。

参照

概念

Excel のアプリケーション レベルのアドインの開発

Excel ワークシート上での Windows フォーム コントロールの使用

NamedRange コントロール

ListObject コントロール

その他の技術情報

Office ドキュメントのコントロール

Excel のホスト コントロール

履歴の変更

日付

履歴

理由

2008 年 7 月

トピックを追加

SP1 機能変更