【问题标题】:integer overflow in vba even though I'm using long data type即使我使用的是长数据类型,vba 中的整数溢出
【发布时间】:2015-09-01 00:41:26
【问题描述】:

我写了一个简单的 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

有什么想法吗?

【问题讨论】:

  • 您的问题标题令人困惑。这是关于整数溢出,不是堆栈溢出。
  • @paddy 我更正了。我在写lol的时候想到了这个网站。
  • 您的代码没有按照您的想法执行。尝试单步执行一个小数据集,你会发现调整后的范围不是你想的那样。如果您使用最大行数为 65536 的 .xls,您将收到您描述的错误
  • 仅供参考,这可以通过使用Variant array's 进行编码以更快地运行(几个数量级)。 (在 SO 上搜索该术语以了解它是如何完成的)

标签: vba excel


【解决方案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' 的原因。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-22
    • 1970-01-01
    • 1970-01-01
    • 2020-08-17
    • 1970-01-01
    • 1970-01-01
    • 2012-05-23
    • 2021-03-11
    相关资源
    最近更新 更多