逐步解說:在 VSTO 載入宏專案中的運行時間將控件新增至工作表

您可以使用 Excel VSTO 增益集,將控制項加入任何開啟的工作表中。 本逐步解說將示範如何使用功能區,讓使用者將 ButtonNamedRangeListObject 加入工作表。 如需詳細資訊,請參閱 在運行時間將控件新增至 Office 檔。

適用於: 本主題中的資訊適用於 Excel 的 VSTO 載入宏專案。 如需詳細資訊,請參閱依 Office 應用程式和專案類型提供的功能

本逐步解說將說明下列工作:

  • 提供可將控制項加入工作表的使用者介面 (UI)。

  • 將控制項加入工作表。

  • 移除工作表的控制項。

    注意

    在下列指示的某些 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 Form 控制項加入工作表。

提供UI以將控件新增至工作表

將自訂索引標籤加入 Excel 功能區。 使用者可以選取索引標籤上的核取方塊,將控制項加入工作表。

若要提供可將控制項加入工作表的 UI

  1. 在 [專案] 功能表上,按一下 [加入新項目]

  2. 在 [ 新增專案 ] 對話框中,選取 [功能區] [可視化設計工具],然後按兩下 [ 新增]。

    名為 Ribbon1.csRibbon1.vb 的檔案會在功能區設計工具中開啟,並顯示預設索引標籤和群組。

  3. 從 [工具箱] 的 [Office 功能區控件] 索引卷標,將 CheckBox 控件拖曳到 group1

  4. 按一下 [CheckBox1] 予以選取。

  5. 在 [屬性] 視窗中變更下列屬性。

    屬性
    名稱 按鈕
    標籤 按鈕
  6. 將第二個核取方塊加入 [group1] Walkthrough: Adding Controls to a Worksheet at Run Time in an VSTO Add-in project,然後變更下列屬性。

    屬性
    名稱 NamedRange
    標籤 NamedRange
  7. 將第三個複選框新增至 group1,然後變更下列屬性。

    屬性
    名稱 ListObject
    標籤 ListObject

將控件新增至工作表

您只能將 Managed 控制項加入做為容器的主項目。 因為 VSTO 增益集專案會使用任何開啟的工作表,所以 VSTO 增益集會將工作表轉換為主項目後,或取得現有主項目,再加入控制項。 將程式碼加入每個控制項的 Click 事件處理常式,以根據開啟的工作表,產生 Worksheet 主項目。 然後,將 ButtonNamedRangeListObject 加入工作表中目前選取的範圍。

若要將控制項加入工作表

  1. 在功能區設計工具中,按兩下 [ 按鈕]。

    [按鈕] 複選框的事件處理程式會在程式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 方法來取得代表活頁簿中第一個工作表的主項目,然後為目前選取的儲存格定義 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 方法來取得代表活頁簿中第一個工作表的主項目,然後為目前選取的儲存格定義 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 Form 控制項,否則該活頁簿下次開啟時,只會顯示控制項的外框。 請將程式碼加入 WorkbookBeforeSave 事件,以便從產生之主項目的控制項集合移除 Windows Form 控制項。 如需詳細資訊,請參閱 在 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 群組中,按兩下 [按鈕]。

    按鈕隨即出現在選取的儲存格中。

  5. 選取 Sheet1 中的其他儲存格。

  6. 在 group1 群組中,按兩下 [NamedRange]。

    隨即定義選定儲存格的已命名範圍。

  7. 選取 Sheet1 中的一連串儲存格。

  8. 在 group1 群組中,按兩下 [ListObject]。

    隨即加入選定儲存格的清單物件。

  9. 儲存工作表。

    您加入 Sheet1 的控制項將不再出現。

下一步

您可以透過下列主題,進一步了解 Excel VSTO 增益集專案:

  • 若要瞭解如何將控件儲存至工作表,請參閱 Office 開發範例和逐步解說中的 Excel VSTO 載入宏動態控件範例。