ListRows.Count Returns 不一致的结果
ListRows.Count Returns Inconsistent Results
我有一个奇怪的问题,我的两个 Excel 表驻留在我项目的两个不同工作表上。我正在使用 VSTO,但 VBA 显示相同的结果:一个空 table 的行计数在一种情况下有 0 行,在另一种情况下有 1 行(我假设插入行)。
设置
两个工作表:工作表 1、工作表 2
两个对应的命名 Excel 表:Sheet1Table、Sheet2Table
两个table都是空的,即有一个空行,是不能删除的插入行。
我运行以下代码判断数据行数(即不包括表头行):
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 尽管结果(以正确者为准)应该是相同的。我比较了 table 和工作表属性,以及 Visual Studio 中的源文件,我没有发现任何差异。知道我应该寻找什么(哪个结果是正确的)?
在 VBA 中,我使用这些潜艇来测试你的情况:
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
当通过选择 header 和一个空行然后将选择格式化为 table 创建(错误地)这些 table 时,它们有一个空行。该行没有内容,跨行COUNTA
为0,看起来像插入行,无法删除。然而,它是一个有效的数据行,因此 ListRows.Count
将获得 1
.
的值
类似地,如果您填写一些数据并手动删除这些输入的值(使用 Delete),这样您的 table 就会像开始时一样,结果仍然是 1
.
如果您手动或以编程方式(使用类似 Sheet1.Range("Sheet1Table").Rows("1").Delete
的方式)删除行,则 ListRows.Count
将产生 0
的值。
确定数据行的实际计数的解决方案是检查ListRows.Count
,如果结果为1 - 检查是否不包含实际值后删除该行。如果仅在单击 格式为 Table 之前通过选择 header 行来创建空 table,则可以避免整个情况。然后自动创建插入行,不计入数据行(本例中 ListRows.Count
的结果是 0
)。
我有一个奇怪的问题,我的两个 Excel 表驻留在我项目的两个不同工作表上。我正在使用 VSTO,但 VBA 显示相同的结果:一个空 table 的行计数在一种情况下有 0 行,在另一种情况下有 1 行(我假设插入行)。
设置
两个工作表:工作表 1、工作表 2
两个对应的命名 Excel 表:Sheet1Table、Sheet2Table
两个table都是空的,即有一个空行,是不能删除的插入行。
我运行以下代码判断数据行数(即不包括表头行):
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 尽管结果(以正确者为准)应该是相同的。我比较了 table 和工作表属性,以及 Visual Studio 中的源文件,我没有发现任何差异。知道我应该寻找什么(哪个结果是正确的)?
在 VBA 中,我使用这些潜艇来测试你的情况:
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
当通过选择 header 和一个空行然后将选择格式化为 table 创建(错误地)这些 table 时,它们有一个空行。该行没有内容,跨行COUNTA
为0,看起来像插入行,无法删除。然而,它是一个有效的数据行,因此 ListRows.Count
将获得 1
.
类似地,如果您填写一些数据并手动删除这些输入的值(使用 Delete),这样您的 table 就会像开始时一样,结果仍然是 1
.
如果您手动或以编程方式(使用类似 Sheet1.Range("Sheet1Table").Rows("1").Delete
的方式)删除行,则 ListRows.Count
将产生 0
的值。
确定数据行的实际计数的解决方案是检查ListRows.Count
,如果结果为1 - 检查是否不包含实际值后删除该行。如果仅在单击 格式为 Table 之前通过选择 header 行来创建空 table,则可以避免整个情况。然后自动创建插入行,不计入数据行(本例中 ListRows.Count
的结果是 0
)。