excel - VBA Runtime error 6: overflow 在一个计算中,但其他计算有效

我正在尝试运行以下代码,但我得到一个 runtime error 6: overflow 用于我试图做的最后一次计算。程序在到达 MLtot = MLwin / (MLwin + MLloss) 时停止。其他两个计算可以毫无问题地完成。

我也尝试将我的变量设置为不同的数据类型来解决这个问题,但没有运气。

Sub AutoWinPercent()

    Dim Swin As Variant, Sloss As Variant, OUwin As Variant, OUloss As Variant
    Dim MLwin As Variant, MLloss As Variant
    Dim Stot As Double, OUtot As Double, MLtot As Double

    For i = 1 To 17
        Swin = WorksheetFunction.CountIfs(Range("A3:A258"), i, Range("Y3:Y258"), "WIN")
        Sloss = WorksheetFunction.CountIfs(Range("A3:A258"), i, Range("Y3:Y258"), "LOSS")
        OUwin = WorksheetFunction.CountIfs(Range("A3:A258"), i, Range("Z3:Z258"), "WIN")
        OUloss = WorksheetFunction.CountIfs(Range("A3:A258"), i, Range("Z3:Z258"), "LOSS")
        MLwin = WorksheetFunction.CountIfs(Range("A3:A258"), i, Range("AA3:AA258"), "WIN")
        MLloss = WorksheetFunction.CountIfs(Range("A3:A258"), i, Range("AA3:AA258"), "LOSS")
        
        j = i + 2   'sets the starting row of where the percentages will be placed.
        
        Stot = Swin / (Swin + Sloss)
        OUtot = OUwin / (OUwin + OUloss)
        MLtot = MLwin / (MLwin + MLloss)
        
        Range("AC" & j).Value = Stot     'Spread
        Range("AD" & j).Value = OUtot    'OU
        Range("AE" & j).Value = MLtot  'ML
        
    Next i

End Sub

回答1

鉴于 overflow 错误是由零除引起的,请考虑使用用户定义的函数来检查分母中的零并根据需要有条件地处理计算。避免使用 On Error Resume Next 快速修复,因为它会抑制其他错误并使调试问题变得困难。

此外,作为 VBA 中的最佳实践,请确保限定所有对象(即,.Range 到 Worksheet,Worksheet 到 Workbook)。下面使用 With 块。请根据实际工作表名称进行调整。此外,Dim 使用的所有变量,例如 ij(除非公开声明)。

功能(与 Sub 或标准模块放在同一模块中)

Function CalcExpression(numerator As Variant, denominator As Variant) As Variant
   Dim val As Variant

   If denominator = 0 Then
       val = ""
   Else 
       val = numerator / denominator 
   End If

   CalcExpression = val   
End Function

子程序

Sub AutoWinPercent()
On Error Goto ErrHandler

    Dim Swin As Variant, Sloss As Variant
    Dim OUwin As Variant, OUloss As Variant 
    Dim MLwin As Variant, MLloss As Variant 
    Dim Stot As Variant, OUtot As Variant, MLtot As Variant 
    Dim i As Long, j As Long

    With ThisWorkbook.Worksheets("myWorksheet") 
        For i = 1 To 17 
             Swin = WorksheetFunction.CountIfs(.Range("A3:A258"), i, .Range("Y3:Y258"), "WIN")
             Sloss = WorksheetFunction.CountIfs(.Range("A3:A258"), i, .Range("Y3:Y258"), "LOSS") 
             OUwin = WorksheetFunction.CountIfs(.Range("A3:A258"), i, .Range("Z3:Z258"), "WIN") 
             OUloss = WorksheetFunction.CountIfs(.Range("A3:A258"), i, .Range("Z3:Z258"), "LOSS") 
             MLwin = WorksheetFunction.CountIfs(.Range("A3:A258"), i, .Range("AA3:AA258"), "WIN") 
             MLloss = WorksheetFunction.CountIfs(.Range("A3:A258"), i, .Range("AA3:AA258"), "LOSS") 

             Stot = CalcExpression(Swin, (Swin + Sloss))
             OUtot = CalcExpression(OUwin, (OUwin + OUloss))
             MLtot = CalcExpression(MLwin, (MLwin + MLloss))
              
             j = i + 2 'sets the starting row of where the percentages will be placed. 

             .Range("AC" & j).Value = Stot 'Spread 
             .Range("AD" & j).Value = OUtot 'OU 
             .Range("AE" & j).Value = MLtot 'ML
         Next i
    End With

ExitHandler:
    Exit Sub

ErrHandler:
    MsgBox Err.Number & " - " & Err.Description, vbCritical, "RUNTIME ERROR"
    Resume ExitHandler
End Sub

相似文章

随机推荐

最新文章