C#Excel下拉事件

我有一个Excel电子表格,位于用C#编写的自动化testing应用程序中。 testing应用程序使用最终统计信息填充工作表,然后使用电子表格生成度量标准。 该过程的一部分是将下拉列表放入电子表格的L列,并将相关的VBA更改事件写入应用程序的表单中。

下面是将下拉列表写入电子表格Excel.DropDown xlDropDown的代码;

//set range for insert cell range = wrkSheet.get_Range("L" + (x + 9).ToString() + ":L" + (x + 9).ToString()); //insert the dropdown into the cell xlDropDown = xlDropDowns.Add((double)range.Left, (double)range.Top, (double)range.Width, (double)range.Height, true); //set the nbame of the new dropdown xlDropDown.Name = "expFail" + (x + 1).ToString(); //assign dropdown name to cmbName cmbName = xlDropDown.Name; //call function to write change macro for this box cmbWriteMacro(cmbName, xlApp, xlBook, wrkSheet); 

cmbWritefunction:

  StringBuilder sb; VBA.VBComponent xlModule; VBA.VBProject prj; string modName; int modExists; prj = wrkBook.VBProject; modExists = 0; sb = new StringBuilder(); //build string with module code sb.Append("Sub " + cmbName + "_Change()" + "\n"); sb.Append("\t" + "Call lstBox_Update(" + cmbName + ")" + "\n"); sb.Append("End Sub"); foreach (VBA.VBComponent comp in prj.VBComponents) { modName = comp.Name; if (modName == "Module2") { modExists = 1; break; } } //check to see if module already exists if (modExists != 1) { //set an object for the new module to create xlModule = wrkBook.VBProject.VBComponents.Add(VBA.vbext_ComponentType.vbext_ct_StdModule); } else { xlModule = wrkBook.VBProject.VBComponents.Item("Module2"); } //add the cmbbox macro to the spreadsheet xlModule.CodeModule.AddFromString(sb.ToString()); 

这会将以下VBA事件写入电子表格,以便在出现故障时在表格中执行操作。

 Sub expFail1_Change(ByVal Target As Range) Call lstBox_Update("expFail1") End Sub 

所有的下拉列表根据select的内容调用相同的函数(lstBox_Update)。

一切正常。 下拉菜单显示出他们应该在哪里,macros正在写入电子表格。 问题似乎是在select发生变化时触发相关的更改事件。 解决scheme可能很容易,但我已经看了全部,似乎无法find答案

我只是根据你的代码做了一个小例子。 在search了一些源代码之后,可以看到一行代码

 xlDropDown.Name = "expFail" + (x + 1).ToString(); // your code xlDropDown.OnAction = xlDropDown.Name + "_Change"; // new code: IMPORTANT 

在Microsoft知识库文章中find此代码如何使用Visual C#.NET中的自动化创buildExcelmacros

看来你需要这行代码来设置一些委托指向你的自定义VBA代码。

如果您需要我的完整源代码,请告诉我,我将邮寄给您。

您必须将更改事件写入创buildcombobox的工作表(而不是VBA模块“module2”。combobox是工作表(对象)的一部分,所有的事件处理程序必须在那里。

基于这篇文章,您需要将代码写入Worksheet_Change事件,而不是ComboBox_Change事件:

 Sub Worksheet_Change(ByVal Target As Range) Call lstBoxUpdate("expFail1") End Sub