Excel VBA保护计算除以0

时间:2017-02-08 17:56:13

标签: excel vba excel-vba

我正在尝试使用基于简单除法的数据填充单元格但是(并且将始终是)实例,其中我在等式的一端或两端具有0。

是否有可能在等式周围包含某种保护,这样如果它除以0,它只是将值设置为0而不是错误输出?

我的代码

Set myRange = Range("S3:S20")
rowCounter = 3
For Each myCell In myRange
    If Range("H1").Value Like "*Mon*" Then
        myCell.Value = Range("Q" & rowCounter).Value
        rowCounter = rowCounter + 1

    Else
        myCell.Value = ((myCell.Value + Range("Q" & rowCounter).Value) / Range("R" & rowCounter).Value)
        rowCounter = rowCounter + 1

    End If
Next myCell

以下是等式中引用的数据

P    Q      R    S
5   1:03    5   1:03
0   0:00    0   0:00
0   0:00    0   0:00
7   0:19    7   0:19
0   0:00    0   0:00
0   0:00    0   0:00
12  0:26    12  0:26
3   0:15    3   0:15
3   1:16    3   1:16
7   0:29    7   0:29
9   0:14    9   0:14
0   0:00    0   0:00
0   0:00    0   0:00
6   0:28    6   0:28
0   0:00    0   0:00
4   0:15    4   0:15
0   0:00    0   0:00
0   0:00    0   0:00

感谢您的期待!

3 个答案:

答案 0 :(得分:5)

我回答你的问题以及其他一些注意事项:

  • 您可以利用IfError() WorksheetFunction来捕获错误

  • 在每次迭代中重复If Range("H1").Value Like "*Mon*" Then都是一个逻辑错误

    在开头检查一次,然后相应地进行

  • 您可以通过抵消循环范围变量来避免counter变量

以上所有可以编码的内容

Sub main()
    Dim myRange As Range, myCell As Range

    Set myRange = Range("S3:S20")
    If Range("H1").Value Like "*Mon*" Then
        myRange.Value = myRange.Offset(, -2).Value
    Else
        For Each myCell In myRange
            myCell.FormulaR1C1 = "=iferror((" & myCell.Value & "+ RC[-2])/RC[-1],0)"
        Next myCell
        myRange.Value = myRange.Value
    End If
End Sub

答案 1 :(得分:3)

检查R列中值的额外 ElseIF语句怎么样:

Set myRange = Range("S3:S20")
rowCounter = 3
For Each myCell In myRange
        If Range("H1").Value Like "*Mon*" Then
            myCell.Value = Range("Q" & rowCounter).Value
            rowCounter = rowCounter + 1
        ElseIf Range("R" & rowCounter).Value <> "0" Then
            myCell.Value = ((myCell.Value + Range("Q" & rowCounter).Value) / Range("R" & rowCounter).Value)
            rowCounter = rowCounter + 1
        Else
            myCell.Value = 0
            rowCounter = rowCounter + 1
        End If
Next myCell

答案 2 :(得分:3)

尝试以下代码(检查R列中的值是否为0)。

由于您使用For Each myCell In myRange进行循环,因此无需使用其他变量(rowCounter)来保留行号,只需使用myCell.Row

Option Explicit

Sub HandleDev_ByZero()

Dim myRange As Range, myCell As Range

Set myRange = Range("S3:S20")
For Each myCell In myRange
    If Range("H1").Value Like "*Mon*" Then
        myCell.Value = Range("Q" & myCell.Row).Value
    Else
        If Range("R" & myCell.Row).Value = 0 Then ' check if 0
            myCell.Value = 0
        Else
            myCell.Value = ((myCell.Value + Range("Q" & myCell.Row).Value) / Range("R" & myCell.Row).Value)
        End If
    End If
Next myCell

End Sub