N'évitez pas de travailler avec plusieurs cellules comme cible. Intersect peut rapidement analyser, même en supprimant plusieurs colonnes entières, la plage appropriée et la restreindre davantage à la plage utilisée de la feuille de calcul.
Ajoutez un contrôle des erreurs, en particulier pour l'opération de division. Une cellule vide en A2 étouffera rapidement le calcul lors d'une division par zéro.
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
'deal with multiple cells as bel;ow; don't avoid them
'If Target.Cells.Count > 1 Then Exit Sub
'use the Intersect to determine if relevant cells have been chanmged
'note: columns Q:R, not O:R and restrict to the used range
If Not Intersect(Target, Target.Parent.UsedRange, Range("Q:R")) Is Nothing Then
On Error GoTo Safe_Exit
Application.EnableEvents = False
Dim trgt As Range
For Each trgt In Intersect(Target, Target.Parent.UsedRange, Range("Q:R"))
Select Case trgt.Column
Case 17
'guard against multiplying a number by text
If Not IsError(Cells(2, 3).Value2 * Cells(2, 1).Value2) Then
trgt.Offset(0, 1) = Cells(2, 3).Value2 * Cells(2, 1).Value2
End If
Case 18
'guard against possible #DIV/0! error and divding a number by text
If Not IsError(Cells(2, 3).Value2 / Cells(2, 1).Value2) Then
trgt.Offset(0, -1) = Cells(2, 3).Value2 / Cells(2, 1).Value2
End If
End Select
Next trgt
End If
Safe_Exit:
Application.EnableEvents = True
End Sub
Je suis presque sûr que le calcul réel devrait impliquer une variable comme trgt.Row
mais le calcul que vous avez affiché n'utilisait que C2 et A2 comme références de cellules statiques pour diviser/multiplier l'une par rapport à l'autre.