【发布时间】: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 代码来重置它,但我希望在这里做。
【问题讨论】: