逐步解說:在 VSTO 載入宏專案中的運行時間將控件新增至工作表
您可以使用 Excel VSTO 增益集,將控制項加入任何開啟的工作表中。 本逐步解說將示範如何使用功能區,讓使用者將 Button、NamedRange 及 ListObject 加入工作表。 如需詳細資訊,請參閱 在運行時間將控件新增至 Office 檔。
適用於: 本主題中的資訊適用於 Excel 的 VSTO 載入宏專案。 如需詳細資訊,請參閱依 Office 應用程式和專案類型提供的功能。
本逐步解說將說明下列工作:
提供可將控制項加入工作表的使用者介面 (UI)。
將控制項加入工作表。
移除工作表的控制項。
注意
在下列指示的某些 Visual Studio 使用者介面項目中,您的電腦可能會顯示不同的名稱或位置: 您所擁有的 Visual Studio 版本以及使用的設定會決定這些項目。 如需詳細資訊,請參閱將 IDE 個人化。
必要條件
您需要下列元件才能完成這個逐步解說:
此版 Visual Studio 包含 Microsoft Office Developer Tools。 如需詳細資訊,請參閱 設定計算機來開發 Office 解決方案。
Excel
建立新的 Excel VSTO 載入宏專案
請從建立新的 Excel VSTO 增益集專案開始。
若要建立新的 Excel VSTO 增益集專案
在 Visual Studio 中,使用 ExcelDynamicControls 名稱建立 Excel VSTO 載入宏專案。 如需詳細資訊,請參閱 How to: Create Office Projects in Visual Studio。
新增 Microsoft.Office.Tools.Excel.v4.0.Utilities.dll 元件的參考。 本逐步解說稍後會需要用到此參考,以透過程式設計的方式將 Windows Form 控制項加入工作表。
提供UI以將控件新增至工作表
將自訂索引標籤加入 Excel 功能區。 使用者可以選取索引標籤上的核取方塊,將控制項加入工作表。
若要提供可將控制項加入工作表的 UI
在 [專案] 功能表上,按一下 [加入新項目]。
在 [ 新增專案 ] 對話框中,選取 [功能區] [可視化設計工具],然後按兩下 [ 新增]。
名為 Ribbon1.cs 或 Ribbon1.vb 的檔案會在功能區設計工具中開啟,並顯示預設索引標籤和群組。
從 [工具箱] 的 [Office 功能區控件] 索引卷標,將 CheckBox 控件拖曳到 group1。
按一下 [CheckBox1] 予以選取。
在 [屬性] 視窗中變更下列屬性。
屬性 值 名稱 按鈕 標籤 按鈕 將第二個核取方塊加入 [group1] Walkthrough: Adding Controls to a Worksheet at Run Time in an VSTO Add-in project,然後變更下列屬性。
屬性 值 名稱 NamedRange 標籤 NamedRange 將第三個複選框新增至 group1,然後變更下列屬性。
屬性 值 名稱 ListObject 標籤 ListObject
將控件新增至工作表
您只能將 Managed 控制項加入做為容器的主項目。 因為 VSTO 增益集專案會使用任何開啟的工作表,所以 VSTO 增益集會將工作表轉換為主項目後,或取得現有主項目,再加入控制項。 將程式碼加入每個控制項的 Click 事件處理常式,以根據開啟的工作表,產生 Worksheet 主項目。 然後,將 Button、NamedRange 和 ListObject 加入工作表中目前選取的範圍。
若要將控制項加入工作表
在功能區設計工具中,按兩下 [ 按鈕]。
[按鈕] 複選框的事件處理程式會在程式Click碼編輯器中開啟。
以下列程式碼取代
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); } }
在 方案總管 中,選取 [Ribbon1.cs] 或 [Ribbon1.vb]。
在 [ 檢視] 功能表上,按兩下 [ 設計工具]。
在功能區設計工具中,按兩下 NamedRange。
以下列程式碼取代
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); } }
在功能區設計工具中,按兩下 ListObject。
以下列程式碼取代
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); } }
在功能區程式碼檔的頂端加入下列陳述式。
從工作表移除控制件
當工作表儲存和關閉時,都不會保存控制項。 您應該在儲存工作表之前,以程式設計方式移除所有產生的 Windows Form 控制項,否則該活頁簿下次開啟時,只會顯示控制項的外框。 請將程式碼加入 WorkbookBeforeSave 事件,以便從產生之主項目的控制項集合移除 Windows Form 控制項。 如需詳細資訊,請參閱 在 Office 檔中保存動態控件。
若要移除工作表的控制項
在 方案總管 中,選取 [ThisAddIn.cs] 或 [ThisAddIn.vb]。
在 [檢視] 功能表中,按一下 [程式碼]。
將下列方法新增至
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); } } }
在 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 群組中,按兩下 [按鈕]。
按鈕隨即出現在選取的儲存格中。
選取 Sheet1 中的其他儲存格。
在 group1 群組中,按兩下 [NamedRange]。
隨即定義選定儲存格的已命名範圍。
選取 Sheet1 中的一連串儲存格。
在 group1 群組中,按兩下 [ListObject]。
隨即加入選定儲存格的清單物件。
儲存工作表。
您加入 Sheet1 的控制項將不再出現。
下一步
您可以透過下列主題,進一步了解 Excel VSTO 增益集專案:
- 若要瞭解如何將控件儲存至工作表,請參閱 Office 開發範例和逐步解說中的 Excel VSTO 載入宏動態控件範例。