【问题标题】:Changing the index of a combobox in Excel from C#从 C# 更改 Excel 中组合框的索引
【发布时间】:2015-11-19 03:34:42
【问题描述】:

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

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

我告诉你这一切是为了问是否有人知道访问组合框的更好方法?我可以将它作为 OLEObject 进行访问,但这不允许我更改组合框的索引或文本属性,因为它们是“只读”的,根据 VS 2013 中的以下智能感知错误:

无法将属性或索引器“Microsoft.Office.Interop.Excel_OLEObject.Index”分配给——它是只读的。

出现错误就行了:

oleobj.Index = 1;

代码 sn-p 如下。当前 Excel 应用程序作为 xlApp 传递,并且数组组合框被传递。组合框数组的每个成员都包含组合框所在的工作表名称、控件的名称以及它在模板上的 ListFillRange。示例数组成员是:

Sheet1!: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;
                }
            }

        }
    }

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

【问题讨论】:

    标签: c# excel vba combobox


    【解决方案1】:

    所以我能够弄清楚我想太多了。我回到 VBA,然后将其转回 C#。结果是下面的代码,你会注意到它相当短和简洁。我必须测试 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;
                        }
                    }
            }
        }
    

    【讨论】:

      猜你喜欢
      • 2011-04-14
      • 2017-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-11
      • 2017-08-26
      • 2020-10-01
      • 2012-12-16
      相关资源
      最近更新 更多