/ / Excel VBA protégeant le calcul de la division par 0 - excel, vba, excel-vba

Excel VBA protégeant le calcul de la division par 0 - Excel, VBA, Excel-VBA

J'essaie de renseigner les cellules avec des données basées sur une simple division, mais il y a (et il y aura toujours) des cas où j'ai un 0 à l'une ou aux deux extrémités de l'équation.

Est-il possible d’envelopper une sorte de protection autour de l’équation, de sorte que si c’est une division par 0, elle fixe simplement la valeur à 0 plutôt qu’une erreur en sortie?

Mon code

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

Ci-dessous les données référencées dans l'équation

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

Merci d'avoir regardé!

Réponses:

3 pour la réponse № 1

Essayez le code ci-dessous (vérifiez si la valeur de la colonne R = 0).

Depuis que tu fais une boucle avec For Each myCell In myRange, il n’est pas nécessaire d’avoir une autre variable (rowCounter) pour conserver le numéro de ligne, utilisez simplement 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

5 pour la réponse № 2

Je réponds à votre question avec quelques autres considérations:

  • vous pouvez exploiter IfError() WorksheetFunction pour intercepter l'erreur

  • c'est une erreur logique de répéter If Range("H1").Value Like "*Mon*" Then à chaque itération

    vérifier une fois au début et ensuite procéder en conséquence

  • tu peux éviter counter variable en décalant la variable de plage de boucle

pour tout ce qui précède, vous pourriez coder

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

3 pour la réponse № 3

Que diriez-vous d'un extra Déclaration ElseIF qui vérifie la valeur dans la colonne R:

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