从C#更改Excel中组合框的索引

本文关键字:索引 组合 更改 Excel | 更新日期: 2023-09-27 18:22:21

我正在编写一个程序,该程序访问包含数据列的excel模板(第一列中有一个唯一的ID号)。根据ID号的前两个数字,该行将被保留或删除。在模板中,此唯一的ID号列提供ActiveX组合框(位于工作表上)的ListFill属性。删除不匹配的行后,将重置ListFill属性,但不会重置文本。

例如,如果我根据"02"作为列A中唯一ID的前两个数字来选择行,则删除所有不以"02"开头的内容没有问题,但组合框文本仍然显示为"010001",因为这是模板中的第一个唯一ID,即使它不在新列表中。

我告诉你这一切是为了问是否有人知道访问combobox的更好方法?我可以作为OLEObject访问它,但这不允许我更改组合框的索引或文本属性,因为它们是"只读"的,因为VS 2013中出现了以下intelligense错误:

属性或索引器"Microsoft.Office.Interop.Excel_OLEObject.Index"不能归类到--它是只读的。

错误出现在以下行:

oleobj.Index=1;

下面是代码片段。当前Excel应用程序将作为xlApp传递,数组组合框也将传递。组合框数组的每个成员都包含组合框所在的工作表名称、控件名称及其在模板上的ListFillRange。数组成员示例为:

表1!:cbTest:$A$1:$A$10

private void ResetComboBoxes2(string[] comboboxes, Excel.Application xlApp)
    {
        Excel.Worksheet wksht = new Excel.Worksheet();
        Excel.Range rng;
        int listEndCellNum;
        string listEndCellApha;
        string listEndCell;
        for (int i = 0; i < comboboxes.Length; i++)
        {
            string[] comboBoxesSplit = comboboxes[i].Split(':');
            string sheetName = comboBoxesSplit[0].ToString();
            string oleObjName = comboBoxesSplit[1].ToString();
            string[] rangeArray = comboBoxesSplit[2].Split(':');
            string rangeStart = rangeArray[0];
            listEndCellNum = wksht.Range[rangeStart].End[Excel.XlDirection.xlDown].Offset[1, 0].Row - 1;
            string[] cellBreakdown = rangeStart.Split('$');
            listEndCellApha = cellBreakdown[1];
            listEndCell = "$" + listEndCellApha + "$" + listEndCellNum;
            string listFull = rangeStart + ":" + listEndCell;
            wksht = xlApp.ActiveWorkbook.Worksheets[sheetName];
            foreach (Excel.OLEObject oleobj in wksht.OLEObjects())
            {
                if (oleobj.Name.ToString() == oleObjName)
                {
                    oleobj.ListFillRange = listFull;
                    oleobj.Index = 1;
                }
            }
        }
    }

我甚至不确定是否有办法做到这一点。我总是可以在保存之前制作一大块VBA代码来重置它,并通过C#访问它,但我希望在这里做到这一点。

从C#更改Excel中组合框的索引

所以我发现我想得太多了。我回到VBA,然后将其转换回C#。结果是下面的代码,yu会注意到它相当简短和简洁。我必须测试oleObject的programID,对于所有activeX组合框,它都是"Forms.ComboBox.1",然后获取该对象的名称,然后按名称调用它,并在其中添加一个额外的"object"。

 private void ResetComboBoxes2(string[] comboboxes, Excel.Application xlApp)
    {
        Excel.Worksheet wksht = new Excel.Worksheet();
        for (int i = 0; i < comboboxes.Length; i++)
        {
                string[] comboBoxesSplit = comboboxes[i].Split(':');
                string sheetName = comboBoxesSplit[0].ToString();
                wksht = xlApp.ActiveWorkbook.Worksheets[sheetName];
                foreach (Excel.OLEObject oleobj in wksht.OLEObjects())
                {
                    if (oleobj.progID == "Forms.ComboBox.1")//oleobj.Name.ToString() == oleObjName)
                    {
                        string cbName = oleobj.Name.ToString();
                        wksht.OLEObjects(cbName).Object.ListIndex = 0;
                    }
                }
        }
    }