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 № 1Essayez 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'erreurc'est une erreur logique de répéter
If Range("H1").Value Like "*Mon*" Then
à chaque itérationvé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