Gaf*_*ffi 5 excel vba excel-2003 excel-vba excel-2010
我曾经看到一些SO用户在尝试使用某些变体时遇到了问题Cells.Count; 在某些情况下,VBA代码会引发溢出错误.
供参考,请参阅对此答案的评论:
我认为这会起作用,但是我得到一个"溢出"错误并且它指向代码"If 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
Run Code Online (Sandbox Code Playgroud)
正如你在我的评论中看到的那样,Cells.Count值是16777216(这对于2003来说是正确的),但两个版本都是一样的,这对我来说没有意义.从以上链接的答案中引用mwolfe02:
Excel 2007工作表包含1,048,576行和16,384列,总共17,179,869,184个单元格.
这告诉我2010年印刷的价值至少应该是(我相信它应该是一样的)17,179,869,184.
那么为什么这个数字打印不正确/为什么2010年的价值会被归还?
计算这么大的数字时使用.Countlarge属性.
例如
Sub CellsCount()
Dim l As Double
l = ActiveSheet.Cells.CountLarge
Debug.Print l
End Sub
Run Code Online (Sandbox Code Playgroud)
也绝不使用Cells.Count或Cells.CountLarge不指定工作表对象.这是为了确保我们在兼容模式下不会得到错误的计数/错误.同样从不使用Rows.Count.一直用ws.Rows.Count.这是人们在尝试查找excel中的最后一行时最常犯的错误.例如
这个
lRow = ws.Range("A" & Rows.Count).End(xlUp).Row
Run Code Online (Sandbox Code Playgroud)
和
lRow = ws.Range("A" & ws.Rows.Count).End(xlUp).Row
Run Code Online (Sandbox Code Playgroud)
总是可能不会给你相同的结果.
我还建议进一步阅读此.