计数不同版本的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.Count
或Cells.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议进一步阅读这个 。