O VBE acha que B4 * C4
está se referindo a duas variáveis denominadas B4 e C4, respectivamente.
Para se referir a um intervalo, deve ser Range("B4").Value * Range("C4").Value
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$C$4" Or Target.Address = "$D$4" Then
Application.EnableEvents = False
If Target.Address = "$C$4" Then
Range("D4").Value = Range("B4").Value * Range("C4").Value
Else
Range("C4").Value = Range("D4").Value / Range("B4").Value
End If
Application.EnableEvents = True
End If
End Sub
Também é possível usar o []
em torno dos intervalos como um atalho:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$C$4" Or Target.Address = "$D$4" Then
Application.EnableEvents = False
If Target.Address = "$C$4" Then
[D4] = [B4] * [C4]
Else
[C4] = [D4] / [B4]
End If
Application.EnableEvents = True
End If
End Sub
Também desde EnableEvents
não redefine quando o código termina e é possível obter um erro. Precisamos capturar o erro e reativar os eventos antes de sair.
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$C$4" Or Target.Address = "$D$4" Then
On Error GoTo SafeOut
Application.EnableEvents = False
If Target.Address = "$C$4" Then
[D4] = [B4] * [C4]
Else
[C4] = [D4] / [B4]
End If
Application.EnableEvents = True
End If
Exit Sub
SafeOut:
MsgBox "Error occured, check values"
Application.EnableEvents = True
End Sub
Dessa forma, se alguém colocar 0
em B4, o que causaria um erro #Div/0
, os eventos serão reativados e um msgbox dirá ao usuário para corrigir os valores.