1

У меня есть VBA для ввода в Excel для любой из двух ячеек ... ячейка, не получающая ввода, заполняется результатом формулы на основе ввода от другой.
Пример;

Клетки B4, C4 и D4.

B4 вводится вручную, затем C4 получает ввод вручную, а формула C4 определяет результат для D4 ... Или же... D4 получает ручной ввод, а формула D4 определяет результат для C4.

Код:

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

Я продолжаю получать Run-Time '6': Ошибка переполнения - особенно в диапазоне ("C4").Значение = D4 / B4 заявление.

Ничто из того, что я пытаюсь решить, кажется, не решает эту проблему ... любые предложения будут с благодарностью

1 ответ1

3

VBE считает, что B4 * C4 относится к двум переменным с именами B4 и C4 соответственно.

Для обозначения диапазона это должен быть 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

Можно также использовать [] вокруг диапазонов в качестве сокращения:

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

Также, так как EnableEvents не сбрасывается, когда код заканчивается, и возможно получить ошибку. Нам нужно зафиксировать ошибку и снова включить события перед выходом.

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

Таким образом, если кто-то введет 0 в B4, что приведет к ошибке #Div/0 , события снова включатся, и msgbox скажет пользователю исправить значения.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .