Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#Excel下拉事件_C#_Excel_Vba_Dropdownbox - Fatal编程技术网

C#Excel下拉事件

C#Excel下拉事件,c#,excel,vba,dropdownbox,C#,Excel,Vba,Dropdownbox,我有一个Excel电子表格,它位于用C#编写的自动测试应用程序中。测试应用程序使用最终统计数据填充工作表,然后使用电子表格生成度量。该过程的一部分是将下拉列表放置在电子表格的L列中,并将其关联的VBA更改事件从应用程序写入工作表中 下面是将下拉列表写入电子表格的代码 Excel.DropDown-xlDropDown //set range for insert cell range = wrkSheet.get_Range("L" + (x + 9).ToString() + ":L" +

我有一个Excel电子表格,它位于用C#编写的自动测试应用程序中。测试应用程序使用最终统计数据填充工作表,然后使用电子表格生成度量。该过程的一部分是将下拉列表放置在电子表格的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); 
写入功能:

    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
所有下拉列表根据所选内容调用相同的函数(lstBox_Update)


一切正常。下拉列表显示它们应该在哪里,并且宏正在正确写入电子表格。问题似乎是在更改选择时触发关联的更改事件。解决方案可能很简单,但我已经看了一遍,似乎找不到答案

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

基于此,您需要将代码写入
工作表\u Change
事件,而不是
组合框\u Change
事件:

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

我只是根据你的代码做了一个小例子。在谷歌搜索和测试了一些源代码后,它归结为一行代码:

在如何使用Visual C#.NET中的自动化创建Excel宏的中找到此代码

似乎需要这行代码来设置指向自定义vba代码的某种委托


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

对不起,这是在尝试解决此问题时使用的代码版本。我最初将宏写入Sheet1(电子表格上唯一的工作表)但仍然没有乐趣。不过,这是Sheet1中的代码,由app Sub expFail2_Change()调用lstBox_Update(expFail2)End Sub expFail1_Change()调用lstBox_Update(expFail1)End Sub lstBox_Update()编写[做点什么]End sub您的输出也与代码不匹配。expFail1\u Change sub不应该有参数(根据示例代码,它没有参数)。也许你更新了你的代码?好消息--你是对的。我已经更改了它,这样就没有参数。坏消息--仍然没有乐趣。不幸的是,我正在尝试在Excel中尝试一些我以前从未尝试过的东西,并且已经到处尝试解决这个问题,所以我为不一致性道歉。我编写的代码只是启动工作表。\u Change事件当包含下拉列表的单元格更新时,如果Intersect(Target,failRange)为Nothing,则退出Sub Else调用lstBox_Update()End If。当我更新工作表时,它会按应有方式激发并退出,因为更新不在failRange(存在下拉列表的单元格范围)中。即使下拉列表通过其.LinkedCells属性链接到它们所在的单元格,当对新选择的索引进行选择时,单元格的值也会更新,但工作表\u更改事件不会发生。是的!就是这样。我只花了一个小时研究了这个问题,在任何地方都找不到分配宏的方法o控件。我没有想到,只需键入它,而不希望IntelliSense找到它,就可以工作。作为补充说明,如果您将宏代码存储在
工作表
模块中,而不是VBA模块
模块1
,则需要在事件名称前加上工作表名称,因此
“Sheet1”+xlDropDown.Name+“\u Change”
xlDropDown.Name = "expFail" + (x + 1).ToString(); // your code
xlDropDown.OnAction = xlDropDown.Name + "_Change"; // new code: IMPORTANT