C#excel从c#创build的工作表中获取文档级别

我一直在试图添加一个combobox或真正的任何forms的控制到飞行中创build的Excel表。 在c#中创build一个Excel工作簿项目时,我可以添加一个combobox到excel工作表,并且能够访问文档级(Sheet1)中的Controls.AddComboBox函数,如下所示:图1

namespace ExcelWorkbook2{ public partial class Sheet1{ private void Sheet1_Startup(object sender, System.EventArgs e){ Microsoft.Office.Tools.Excel.Controls.ComboBox comboBox1 =this.Controls.AddComboBox(this.Range["A1", "A1"], "comboBox1"); comboBox1.Items.Add("1 Item"); 

this是指sheet1这个代码在创build工作簿项目时工作正常,但是当我像这样创build一个Excel工作表时:图2

 Application xlApp = new Application(); xlApp.Visible = true; Workbook wb = xlApp.Workbooks.Add(XlWBATemplate.xlWBATWorksheet); Worksheet ws = (Worksheet)wb.Worksheets[1]; 

我无法进入工作表(ws)并获得“controls.AddCombobox”。 将工作表(图2)放在快速表中说System .___ Comobject在另一个项目(图1)中的“this”对象返回值(ExcelWorkbook2.Sheet1)。 我怎么能到达Controls.AddCombobox作为WorkSheetBase在c#生成的工作表中使用(图2)。 谢谢

Controls.AddCombobox仅适用于Microsoft.Office.Tools.Excel命名空间的宿主项目 。 就你而言,Sheet1是在devise时创build的主机项目。

运行时创build的工作表

…不能包含任何主机控件或Windows窗体控件。

在运行时在工作表上创build一个combobox ,处理C#中的事件并避免VBA:

大会参考:
Microsoft.Vbe.Interop(Microsoft.Vbe.Interop.dll)
Microsoft.Vbe.Interop.Forms(Microsoft.Vbe.Interop.Forms.dll)
Microsoft.VisualBasic(Microsoft.VisualBasic.dll)

testing/工作代码:

 using MSForms = Microsoft.Vbe.Interop.Forms; using System.Windows.Forms; ... // insert object shape Excel.Shape cbo = ws.Shapes.AddOLEObject("Forms.ComboBox.1", Type.Missing, false, false, Type.Missing, Type.Missing, Type.Missing, 20, 1, 100, 20); cbo.Name = cboName; // bind it and wire it up MSForms.ComboBox comboBox = (Microsoft.Vbe.Interop.Forms.ComboBox)Microsoft.VisualBasic.CompilerServices.NewLateBinding.LateGet(ws, null, cboName, new object[0], null, null, null); comboBox.FontSize = 10; comboBox.FontBold = true; comboBox.Change += new MSForms.MdcComboEvents_ChangeEventHandler(comboBox_Changed); // samle data comboBox.AddItem("Stackoverflow"); comboBox.AddItem("Cool devs"); ... private void comboBox_Changed() { System.Windows.Forms.MessageBox.Show("Selectiong Changed!"); } 

在运行时在工作表上创build一个button ,以处理C#中的事件并避免VBA

请支持您的投票和评论。 谢谢,狮子座。