Excel - Duas Células, Ou é Entrada, Outra é o resultado da fórmula

1

Eu tenho um VBA para inserir no Excel em uma das duas células ... a célula que não recebe entrada é preenchida com um resultado de fórmula com base na entrada da outra.
Exemplo:

Células B4, C4 & D4.

B4 é inserido manualmente, então C4 recebe entrada manual e a fórmula C4 determina o resultado para D4 ... Ou ... D4 recebe entrada manual e a fórmula D4 determina o resultado para C4.

Código:

Private Sub Worksheet_Change(ByVal Target As Excel.Range)

    If Target.Address = "$C$4" Or Target.Address = "$D$4" Then

        Application.EnableEvents = False

        If Target.Address = "$C$4" Then
            Range("D4").Value = B4 * C4
        Else
            Range("C4").Value = D4 / B4

        End If

    Application.EnableEvents = True

    End If

End Sub

Continuo recebendo o erro Run-Time '6': Overflow - especificamente na instrução Range ("C4"). Value = D4 / B4 .

Nada que eu tente parece resolver isso ... qualquer sugestão seria muito apreciada.

    
por Phil 05.10.2017 / 22:29

1 resposta

3

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.

    
por 05.10.2017 / 22:34