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

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年的价值会被归还?

Sid*_*out 7

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

例如

Sub CellsCount()
    Dim l As Double
    l = ActiveSheet.Cells.CountLarge
    Debug.Print l
End Sub
Run Code Online (Sandbox Code Playgroud)

也绝不使用Cells.CountCells.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)

总是可能不会给你相同的结果.

我还建议进一步阅读.

  • 这就像问为什么MS有Excel 2003和Excel 2007:P.`.CountLarge`是在Excel 2007中引入的,并不适用于以前版本的Excel.`Count`属性使用长数据类型,因此它可以存储的最大值是2,147,483,647.`.CountLarge`使用双数据类型,它可以处理高达1.79 + E ^ 308. (2认同)