次の方法で共有


チュートリアル: VSTO アドイン プロジェクトの実行時にワークシートにコントロールを追加する

Excel VSTO アドインを使用して、任意の開いているワークシートにコントロールを追加できます。 このチュートリアルでは、リボンを使用してユーザーがワークシートに ButtonNamedRange、および ListObject を追加できるようにする方法を説明します。 詳しくは、「実行時に Office ドキュメントにコントロールを追加する」をご覧ください。

対象: このトピックの情報は、Excel の VSTO アドインのプロジェクトに適用されます。 詳細については、「 Features Available by Office Application and Project Type」を参照してください。

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

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

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

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

    Note

    次の手順で参照している Visual Studio ユーザー インターフェイス要素の一部は、お使いのコンピューターでは名前や場所が異なる場合があります。 これらの要素は、使用している Visual Studio のエディションや独自の設定によって決まります。 詳細については、「Visual Studio IDE のカスタマイズ」を参照してください。

必須コンポーネント

このチュートリアルを実行するには、次のコンポーネントが必要です。

新しい Excel VSTO アドイン プロジェクトを作成する

まず、Excel VSTO アドイン プロジェクトを作成します。

新しい Excel VSTO アドイン プロジェクトを作成するには

  1. Visual Studio で、ExcelDynamicControls という名前の Excel VSTO アドイン プロジェクトを作成します。 詳細については、「 How to: Create Office Projects in Visual Studio」を参照してください。

  2. Microsoft.Office.Tools.Excel.v4.0.Utilities.dll アセンブリへの参照を追加します。 この参照は、このチュートリアルの後半で Windows フォーム コントロールをワークシートにプログラムを使用して追加するのに必要です。

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

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

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

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

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

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

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

  4. [CheckBox1] をクリックしてオンにします。

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

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

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

    プロパティ
    名前 Listobject
    ラベル Listobject

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

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

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

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

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

  2. Button_Click イベント ハンドラーを次のコードで置き換えます。

    このコードでは、GetVstoObject メソッドを使用してブックの最初のワークシートを表すホスト項目を取得し、現在選択されているセルに Button コントロールを追加します。

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

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

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

  6. NamedRange_Click イベント ハンドラーを次のコードで置き換えます。

    このコードでは、GetVstoObject メソッドを使用してブックの最初のワークシートを表すホスト項目を取得し、現在選択されている (1 つまたは複数の) セルの NamedRange コントロールを定義します。

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

  8. ListObject_Click イベント ハンドラーを次のコードで置き換えます。

    このコードでは、GetVstoObject メソッドを使用してブックの最初のワークシートを表すホスト項目を取得し、現在選択されている (1 つまたは複数の) セルの ListObject を定義します。

    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);
        }
    }
    
  9. リボン コード ファイルの先頭に次のステートメントを追加します。

    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 メソッドを使用して、ワークシートにワークシート オブジェクトが生成されているかどうかを確認します。 生成されたワークシート オブジェクトにコントロールがある場合、コードはそのワークシート オブジェクトを取得し、コントロール コレクションを反復処理してコントロールを削除します。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

次のステップ

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