即使我使用长数据类型,vba中的整数溢出

时间:2015-09-01 00:41:27

标签: excel vba excel-vba

我写了一个简单的vba宏。我正在检查一列中的每个单元格,每当它再次开始返回1时,我将前一个值(例如4)复制到相应的槽中:

1
2
3
4
1
2
3

所以输出看起来像这样:

1 4
2 4
3 4
4 4
1 3
2 3
3 3

覆盖有符号整数的范围似乎工作正常。然而,一旦我按下单元格32,769,它就会一遍又一遍地开始产生相同的数字,这让我觉得它已经溢出。

实际上,调试器会抛出错误:

run-time error '1004':
Application-defined or object-defined error

它强调了这一行代码:

Range("L" & start).Resize(iCounter) = curVal

根据调试器,start为值32769,iCounter为32771,curVal为3.

但不是这样做:

1 3
2 3
3 3

这样做(5是之前的大值):

1 5
2 5
3 5

正如你所看到的,这是不正确的,即使我的程序说最高值应该是3.我假设发生了某种类型的溢出。但是,我使用的是长值,所以我不确定为什么会发生溢出:

Sub calculateLargest()
  Worksheets("parlam2010_resumen").Activate
  Range("K9").Activate

  Dim curVal As Long
  Dim nextVal As Long
  Dim iCounter As Long
  Dim start As Long

  iCounter = 9
  start = 9
  Do
    If ActiveCell.Value = "" Then Exit Do

    curVal = ActiveCell.Value
    nextVal = ActiveCell.Offset(1, 0).Value

    If curVal > nextVal Then
      Range("L" & start).Resize(iCounter) = curVal
      start = iCounter + 1
    End If

    ActiveCell.Offset(1, 0).Activate
    iCounter = iCounter + 1
  Loop
End Sub

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

没有整数溢出。您只是没有正确调整curVal的目标。

Range("L" & start).Resize(iCounter - start + 1) = curVal

在K32771 iCounter是32771而start是32769.您的Range.Resize property不应该是32771.它应该是32771 - 32769 + 1.这5个未到来从计算1,2,3完全。在前一次迭代中,用过多的单元格编写了5个单元。

iCounter增长并且start向下移动时,最终您将尝试写入不在工作表下边界的单元格。这就是生成Run-time error '1004'

的原因