1

我一直在尝试将组合框或任何表单控件添加到动态创建的 Excel 工作表中。在 c# 中创建 Excel 工作簿项目时,我能够向 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 此代码在创建工作簿项目时工作正常,但当我像这样动态创建 excel 工作表时:图 2

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

我无法进入 WorkSheet (ws) 并获得“controls.AddCombobox”。将工作表(图 2)放入快速监视中表示 System.___Comobject 另一个项目(图 1)中的“this”对象返回值(ExcelWorkbook2.Sheet1)。我怎样才能到达被转换为 WorkSheetBase 的 Controls.AddCombobox 以在 c# 生成的工作表中使用(图 2)。谢谢

4

1 回答 1

0

Controls.AddCombobox仅适用于 Microsoft.Office.Tools.Excel 命名空间的宿主项。在您的情况下,Sheet1 是在设计时创建的宿主项。

在运行时创建的工作表..

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

要在运行时在工作表上创建一个ComboBox来处理 C# 中的事件并避免使用 VBA:

程序集参考:
Microsoft.Vbe.Interop (Microsoft.Vbe.Interop.dll)
Microsoft.Vbe.Interop.Forms (Microsoft.Vbe.Interop.Forms.dll)
Microsoft.VisualBasic (Microsoft.VisualBasic.dll)

测试/工作代码:

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!");
}

在运行时在工作表上创建一个用于处理 C# 中的事件并避免使用 VBA的按钮

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

于 2017-10-19T17:47:08.393 回答