【问题标题】:ListRows.Count Returns Inconsistent ResultsListRows.Count 返回不一致的结果
【发布时间】:2016-03-10 05:44:22
【问题描述】:

我的两个 Excel 表格位于我的项目中的两个不同工作表上,我遇到了一个奇怪的问题。我正在使用 VSTO,但 VBA 显示相同的结果:空表的行数在一种情况下为 0 行,在另一种情况下为 1 行(我假设插入行)。

设置

两个工作表:Sheet1、Sheet2
两个对应的命名 Excel 表:Sheet1Table、Sheet2Table

两个表都是空的,即只有一个空行,即插入行,不能删除。

我运行以下代码来确定数据行数(即不包括标题行):

Microsoft.Office.Tools.Excel.ListObject sheet1Table = Globals.Sheet1.Sheet1Table;
int numberOfListRows1 = sheet1Table.ListRows.Count;

Microsoft.Office.Tools.Excel.ListObject sheet2Table = Globals.Sheet2.Sheet2Table;
int numberOfListRows2 = sheet2Table.ListRows.Count;

结果是numberOfListRows1 为 1,numberOfListRows2 为 0,尽管结果(以正确者为准)应该相同。我比较了表格和工作表的属性,以及 Visual Studio 中的源文件,我没有发现任何差异。知道我应该寻找什么(哪个结果是正确的)?

【问题讨论】:

  • 你是否使用 .add 和 .delete 添加行,而另一方面使用插入行、删除行,因为列表只计算 .add .delete ,因此您可能通过手动编辑来扭曲计数器桌子?
  • 确实,这似乎是造成它的原因。如果手动删除所有行,则计数为“0”。那么,“1”会是正确的结果吗?我需要在计数之前以某种方式重置表格,以防它为空?
  • 事实证明删除(手动或以编程方式)可以更正它。问题是表的创建方式。我选择了标题行和一个空行,然后单击“格式化为表格”。结果看起来像一个带有插入行的空表。即使在该行中的COUNTA 也是0。但实际上它是在执行ListRows.Count 时计算的数据行。现在看起来很明显而且几乎是愚蠢的。

标签: excel vsto listobject vba


【解决方案1】:

在 VBA 中,我使用这些 subs 来测试您的案例:

Sub Sheet1TableRowsCount()
    Dim numberOfListRows1 As Integer
    Dim sheet1Table As ListObject
    Set sheet1Table = Sheet1.ListObjects("Sheet1Table")
    numberOfListRows1 = sheet1Table.ListRows.Count
    Set sheet1Table = Nothing
End Sub

Sub Sheet2TableRowsCount()
    Dim numberOfListRows2 As Integer
    Dim sheet2Table As ListObject
    Set sheet2Table = Sheet2.ListObjects("Sheet2Table")
    numberOfListRows2 = sheet2Table.ListRows.Count
    Set sheet2Table = Nothing
End Sub

这些是表格:

当这些表格是通过选择标题和一个空行然后将所选内容格式化为表格来创建(错误地)时,它们有一个空行。此行没有内容,COUNTA 跨行为 0,看起来像插入行,无法删除。然而它是一个有效的数据行,所以ListRows.Count 将获得1 的值。

同样,如果您填写一些数据并手动删除那些输入的值(使用 Delete)以使您的表格看起来像开头那样,结果仍然是1

如果您手动或以编程方式删除行(使用 Sheet1.Range("Sheet1Table").Rows("1").Delete 之类的东西),ListRows.Count 将产生 0 的值。

确定数据行实际计数的解决方案是检查ListRows.Count,如果结果为1 - 检查是否不包含实际值后删除该行。如果仅在单击格式化为表格之前选择标题行来创建空表,则可以避免这种情况。然后自动创建插入行并且不计为数据行(在这种情况下ListRows.Count 的结果是0)。

【讨论】:

  • 如果你对表格使用 vba .add 和 .delete 方法,它不会发生
  • 不,我的意思是当您添加和删除行时,如果您使用 vba .add 和 .delete 而不是 Excel 插入/删除“返回的 ListRows 对象不包括标题、总计或插入行。”
  • @StevenMartin - 谢谢。我明白了你的意思并更新了答案。
  • 感谢您的回答。我也再次使用 VBA 进行了检查,它确实看起来像手动删除行产生的计数为 0。当使用最初为空的表时,结果为 1。我使用 ListRows.Count 而不是问题中的ListRows.Count,其中应该计算没有特殊行的行(标题,总计,...)。我不确定它应该是 1 还是 0 ir,只显示空的插入行。使用DataBodyRange 有充分的理由吗?
  • 我不小心检查了DataBodyRange.Rows.Count 而不是ListRows.Count。在我看来ListRows 对你来说是一个更好的方法。当我注意到它时,我更新了答案。但我看到我们所拥有的有所不同。你说最初ListRows.Count 的结果对你来说是 1,对我来说是 0。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-08
相关资源
最近更新 更多