【发布时间】: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 上搜索该术语以了解它是如何完成的)