当行数== 1时,ListObject.Resize()使DataBodyRange为空

本文关键字:Resize DataBodyRange 为空 ListObject 1时 | 更新日期: 2023-09-27 18:13:58

我试图重置Excel ListObject中的列数。我知道您可以逐个添加和删除列,但我希望避免不必要的循环。我决定使用resize方法来调整ListObject的大小。

下面是我使用的代码(其中OutputCasesTable是ListObject):

OutputCasesTable.DataBodyRange.Value2 = "";
OutputCasesTable.Resize(OutputCasesTable.Range.Resize[ColumnSize: CaseCount]);
OutputCasesTable.DataBodyRange.Value2 = OutputCasesAray;

上面的代码行看起来工作得很好,但是如果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;

我个人更喜欢看第一个解决方案!

有什么我可以做,使它与空字符串的工作?或者你有更好的解决办法?

问好,

当行数== 1时,ListObject.Resize()使DataBodyRange为空

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;