我看到有些SO用户在尝试使用Cells.Count
的某些变体时遇到了问题。在某些情况下,VBA代码会引发溢出错误。
供参考,请参阅this answer上的评论:
我认为这会有效,但我收到了“溢出”错误并指出了我的意思 到代码“如果Master.Cells.SpecialCells(xlCellTypeVisible).Count> 0 然后“---看起来它似乎没有过滤任何特别的东西 - user1556069
这是onyl工作(和Cells.Count没有用)因为后者 使用整数,16位,最大值65,536和整数 电子表格返回的数字更大? - fast_code
我假设VBA正试图在幕后的某个地方施加压力 单元计数为小整数(16位)或长整数(32位)。 Excel 2007工作表的单元格计数将溢出这两个 数据类型。不幸的是我现在无法隔离它,因为我没有 有一份Excel 2007的方便,实际上无法重现你的 错误。 - mwolfe02
试图理解这一点,我尝试重现自己并在尝试将Cells.Count
指定为整数时出现溢出。这是有道理的,因为该值对于Integer数据类型来说太大了。
在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年打印的价值至少应该是(我相信它应该真的相同)17,179,869,184
。
那么为什么这个数字打印不正确/为什么在2010年返回2003年值?
答案 0 :(得分:7)
计算如此大的数字时,请使用.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
总是不会给你相同的结果。
我还建议您进一步阅读this。