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

时间:2012-07-30 21:38:00

标签: excel vba excel-vba excel-2003 excel-2010

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

供参考,请参阅this answer上的评论:

  

我认为这会有效,但我收到了“溢出”错误并指出了我的意思   到代码“如果Master.Cells.SpecialCells(xlCellTypeVisible).Count> 0   然后“---看起来它似乎没有过滤任何特别的东西    - user1556069

this answer

  

这是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年值?

1 个答案:

答案 0 :(得分:7)

计算如此大的数字时,请使用.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

总是不会给你相同的结果。

我还建议您进一步阅读this