我正在尝试重置 Excel ListObject 中的列数。我知道您可以一一添加和删除列,但我想避免不必要的循环。我决定使用 Resize 方法调整 ListObject 的大小。
这是我正在使用的代码(其中 OutputCasesTable 是 ListObject):
OutputCasesTable.DataBodyRange.Value2 = "";
OutputCasesTable.Resize(OutputCasesTable.Range.Resize[ColumnSize: CaseCount]);
OutputCasesTable.DataBodyRange.Value2 = OutputCasesAray;
Run Code Online (Sandbox Code Playgroud)
上面的代码行看起来工作得很好,但是如果 ListObject 只包含 1 行数据,则 ListObject 的 DataBodyRange 在第二行变为 null - 当我尝试更改其单元格的值时会产生错误。excel 中的行似乎仍然存在。
MSDN 文档说明如下: “标题必须保留在同一行中,结果列表必须与原始列表重叠。列表必须包含标题行和至少一行数据。”
现在我明白“一行数据”意味着该行包含值 - 所以这里错误的原因一定是 DataBodyRange 单元格都不包含值(“”)。但是,具有两个包含“”的数据行的表仍然没有包含数据的行,是吗?
我知道有很多方法可以完成这项任务,但我想了解为什么会发生这种情况。
临时解决方案:将代码替换为仅将要删除的列(高于新列数的列)中的值设置为空字符串。所有其他列将被替换:
if(OutputCasesTable.ListColumns.Count - CaseCount > 0)
OutputCasesTable.DataBodyRange.Offset[ColumnOffset: CaseCount].Resize[ColumnSize: OutputCasesTable.ListColumns.Count - CaseCount].Value2 = "";
OutputCasesTable.Resize(OutputCasesTable.Range.Resize[ColumnSize: CaseCount]);
OutputCasesTable.DataBodyRange.Value2 = OutputCasesAray;
Run Code Online (Sandbox Code Playgroud)
我个人更喜欢看第一个解决方案!
有什么我可以做的让它与空字符串一起工作吗?或者你有更好的解决方案吗?
此致,
该Resize操作是杀死 的部分DataBodyRange,显然有一些内部逻辑Resize使用,类似于“如果只有一行,并且所有单元格都是空的,则删除所有数据行。如果有不止一行,不要删除任何”。
我同意这个逻辑有点令人困惑。如果你的问题是微软为什么要这样实现它,我认为虽然它不一致,但在某种程度上它可能更整洁 - 对于模型来说,你正在使用一个空表,并且模型没有办法以图形方式区分差异(表格不可能只有标题行)。
当Resize它执行工作并找到单行空白表时,它无法判断您是否有零行表或带有空字符串的单行表。如果它到达并发现两个空行,那么这是明确的(它们必须是有意义的行)。
对于问题的解决方法部分,我建议一种更简洁的解决方案,只需检查 ListRows.Count 属性,并在必要时添加一个。请注意,您也可以使用Clear而不是将 Value2 设置为空白;对我来说,它读起来更不言自明。
OutputCasesTable.DataBodyRange.Clear();
OutputCasesTable.Resize(OutputCasesTable.Range.Resize[ColumnSize: CaseCount]);
if (OutputCasesTable.ListRows.Count == 0) OutputCasesTable.ListRows.Add();
OutputCasesTable.DataBodyRange.Value2 = OutputCasesAray;
Run Code Online (Sandbox Code Playgroud)