【发布时间】:2015-11-04 19:02:25
【问题描述】:
我正在对手动创建的电子表格进行逆向工程以进行动态创建。大多数单元格都填充了简单的数据,但有几个是“排序/过滤”下拉菜单,如下所示:
如何动态创建这样的控件?
有没有办法在 Excel 电子表格中“查看源代码”以查看生成这些控件可能需要什么样的代码?
更新
改编MacroMark的代码,编译:
var rangeMonthYears = _xlSheet.Range[_xlSheet.Cells[7, 3], _xlSheet.Cells[7, 15]];
object sortFilterCombobox = (object)rangeMonthYears.AutoFilter(1, System.Reflection.Missing.Value, XlAutoFilterOperator.xlAnd, System.Reflection.Missing.Value, true);
_xlSheet.Cells["6", "C"] = sortFilterCombobox; //MonthLabel;
...但它崩溃了,向我展示了这个责备说明:
我是怎么误入歧途的?
更新 2
为了在下面的评论中回答 MacroMarc,这里是遗留/模型电子表格中过滤器控件的屏幕截图(我正在对其进行逆向工程):
在这种情况下,我从列表中取消选择“11 月”,以便将其删除,如您所见。所以用户选择的内容会影响下面列的可见性。
更新 3
由于所有这些花哨的内容都融入了旧版电子表格,我现在正在考虑将其保存为模板,并根据需要简单地替换单元格内容。有什么理由不可行吗?
如果不是,要完成此操作,我是否应该将现有的电子表格保存为“启用 Excel 宏的工作簿”?
更新 4
我尝试像这样调整 MacroMarc 的答案:
Range monthYearCells = _xlSheet.Range[_xlSheet.Cells[COLUMN_HEADING_ROW, MONTH1_COL], _xlSheet.Cells[COLUMN_HEADING_ROW, MONTH13_COL]];
object monthFilter = (object)monthYearCells.AutoFilter(1, System.Reflection.Missing.Value, XlAutoFilterOperator.xlAnd, System.Reflection.Missing.Value, true);
var monthFilterCell = (Range)_xlSheet.Cells[6, 3];
monthFilterCell.Value = monthFilter;
...但是遇到了运行时异常:
是导致问题的最后一行(将 monthFilter 分配给范围的 Value 属性)吗?如果是这样,我应该将monthFilter分配给什么,或者我应该如何处理它?
【问题讨论】:
-
啊,我明白了。我给你的代码只是为了在 Excel 范围内启用“过滤下拉菜单”。它们自动出现在该范围的第一行。您似乎想从 Excel 单元格中连续捕获一年中的十二个月,并将它们显示在完全不同的单元格中的下拉列表中。即您希望转移“过滤器下拉菜单”。不会使用该语法/对象。这可能会导致一个又一个问题。也许最好解释一下您希望达到的目标,我们会尽力为您提供最佳建议。 “过滤器下拉菜单”是一种在列顶部下拉的功能。
-
如果您注释掉 "_xlSheet.Cells["6", "C"] = sortFilterCombobox; //MonthLabel;"线??您是否看到每个月的过滤器下拉列表?只是检查那部分...... Excel中有各种各样的过滤器,包括更棘手的数据透视表过滤器。不太确定您的 C# 应用程序的目的是什么...
-
“更多命令”选项位于我发布的第一个屏幕截图所示的菜单中,而不是第二个。要在第二个窗口中查看开发人员选项卡选项,请从第二个屏幕截图(带有“选择命令”标签的组合框)顶部的下拉列表中选择“开发人员选项卡”。
-
另外,我找到了您的问题的原因,并相应地更新了我的答案。
-
好的。看起来您可能在数据透视表中。你能证实这一点吗?如果您单击 sep 14,您应该会在功能区上看到一个新的彩色标签弹出,上面写着数据透视表工具。
标签: c# excel office-interop excel-interop