VBA中的错误溢出

时间:2017-04-17 07:36:56

标签: excel vba integer-overflow

我是VBA的新手。最近,我输入了一些代码,以下是我的代码示例:

Dim n As Long
n = Range("A1", Range("A1").End(xlDown)).Rows.Count
For i = 3 To n
Range("P" & i).Value = WorksheetFunction.IfError(Range("N" & i).Value / Range("O" & i).Value, 0))
Next

事实证明有溢出错误。我在互联网上搜索并找出它,我的示例代码应转换为Long类型数据。但是,当我换成:

Range("P" & i).Value = CLng(WorksheetFunction.IfError(CLng(Range("N" & i).Value) / CLng(Range("O" & i).Value), 0))

问题仍然存在。

感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

您的代码(Range("N" & i).Value / Range("O" & i).Value)中的除法发生之前它作为参数传递给IfError函数。因此,如果除法失败,您的代码会崩溃并且IfError永远不会有机会做任何事情。

另一种方法是:

Dim n As Long
n = Range("A1", Range("A1").End(xlDown)).Rows.Count
For i = 3 To n
    'Set the value in column P to a default value
    Range("P" & i).Value = 0
    'Switch on error handling
    On Error Resume Next
    'Attempt the calculation - if it fails, the value in column P will not change
    Range("P" & i).Value = Range("N" & i).Value / Range("O" & i).Value
    'Switch error handling off again
    On Error GoTo 0
Next

答案 1 :(得分:1)

您可以检查单元格值是零还是null。如果没有,你可以进行你的计算。

Sub Demo()
    Dim n As Long
    n = Range("A1", Range("A1").End(xlDown)).Rows.Count
    For i = 3 To n
        If NotNullOrZero(Range("O" & i).Value) Then
            Range("P" & i).Value = WorksheetFunction.IfError(Range("N" & i).Value / Range("O" & i).Value, 0)
        Else
            Range("P" & i).Value = ""
        End If
    Next
End Sub

Public Function NotNullOrZero(aValue As Variant) As Boolean
    ' Returns true if the value is not null and greater than zero
    If Not IsNull(aValue) Then
       If (aValue > 0) Then
           NotNullOrZero = True
       End If
    End If
    NotNullOrZero = False
End Function

来自hereNotNullOrZero函数由@BrianKE回答。