我写了一个简单的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
有什么想法吗?
答案 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'
。