计数不同版本的Excel中的单元格时不正确的值

我看到一些SO用户在尝试使用Cells.Count一些变体时遇到了问题; VBA代码在某些情况下会引发溢出错误。

作为参考,请参阅此答案的评论:

我认为这将工作,但我得到一个“溢出”的错误,它指向我的代码“如Master.Cells.SpecialCells(xlCellTypeVisible).Count> 0然后”—它似乎是不是过滤的东西特别 – user1556069

和这个答案 :

这是onyl工作(和Cells.Count不工作),因为后者使用了一个整数,16位,最大值65,536,整个电子表格返回一个numbr更大? – fast_code


我假设在后台的某个地方,VBA试图将单元数强制为一个小整数(16位)或长整数(32位)。 一个Excel 2007工作表的单元格计数将溢出这两个数据types。 不幸的是我现在无法将其隔离,因为我没有Excel 2007的方便副本,实际上不能重现您的错误。 – mwolfe02

试图理解这一点,我试图重现自己,并尝试将Cells.Count分配为整数时溢出。 这对Integer数据types的值太大是有意义的。

在Excel 2003和2010中使用下面的代码,当试图分配一个Long或Variant时,我得到了一个数字结果。

 Option Explicit Sub testInteger() Dim i As Integer i = Cells.Count 'Overflow Debug.Print i 'Doesn't get this far... End Sub Sub testLong() Dim l As Long l = Cells.Count Debug.Print l 'Prints 16777216 in both versions End Sub Sub testVariant() Dim v As Variant v = Cells.Count Debug.Print v 'Prints 16777216 in both versions End Sub 

正如你可以在我的评论中看到的, Cells.Count值是16777216 (这对于2003是正确的),但是两个版本都是一样的,这对我来说是没有意义的。 从以上链接的答案中引用mwolfe02 :

Excel 2007工作表共有1,048,576行和16,384列,总计17,179,869,184个单元格。

这告诉我,在2010年打印的价值至less应该是(我相信它应该是相同的) 17,179,869,184

那么为什么这个数字打印不正确?为什么在2010年返回的值是2003?

在计算这么大的数字时使用.Countlarge属性。

例如

 Sub CellsCount() Dim l As Double l = ActiveSheet.Cells.CountLarge Debug.Print l End Sub 

也不要使用Cells.CountCells.CountLarge而不指定工作表对象。 这是为了确保我们在兼容模式下不会得到不正确的计数/错误。 同样不要使用Rows.Count 。 总是使用ws.Rows.Count 。 这是在Excel中查找最后一行时人们最常犯的错误。 例如

这个

 lRow = ws.Range("A" & Rows.Count).End(xlUp).Row 

 lRow = ws.Range("A" & ws.Rows.Count).End(xlUp).Row 

可能永远不会给你相同的结果。

我也build议进一步阅读这个 。