2016-02-08 2 views
0

В настоящее время im создает модель, в которой мне нужны 2 ячейки, чтобы сохранить фиксированное соотношение, так что когда сумма из двух ячеек всегда равна единице. В этом случае ячейками являются F13 и F14. Чтобы привести пример, если значение F13 изменилось на 0,4, тогда F14 должно стать 0,6. То же самое происходит, если значение off F14 изменяется на 0,2, тогда F13 должно составлять 0,8. Код, который я получил для получения:Сохраняйте фиксированное соотношение между двумя ячейками Excel vba

Private Sub Worksheet_Change(ByVal Target As Range) 
    If Not Intersect(Target, Target.Worksheet.Range("F13")) Is Nothing Then 
     If ActiveCell.Value > 1 Then 
      MsgBox "input value is larger than 1" 
     Else 
      Range("F14").Value = 1 - ActiveCell.Value 
      Exit Sub 
     End If 
     Exit Sub 
    End If 
    Exit Sub 

    If Not Intersect(Target, Target.Worksheet.Range("F14")) Is Nothing Then 
     If ActiveCell.Value > 1 Then 
      MsgBox "input value is larger than 1" 
     Else 
      Range("F13").Value = 1 - ActiveCell.Value 
      Exit Sub 
     End If 
     Exit Sub 
    End If 
    Exit Sub 

End Sub 

Однако этот код не работает должным образом. Поэтому мой вопрос заключается в том, как мне изменить свой код, чтобы он работал правильно?

+1

«Этот код работает неправильно» - что означает это утверждение? Ошибка кода? Вызывает ли это другое значение, чем вы ожидали? Какое тестирование вы сделали (укажите конкретные примеры переменных значений), какое значение было произведено и что вы ожидали от valud? –

+1

Также - почему у вас так много выходов «exit sub»? Я не могу сказать, какова их общая цель, поскольку, по-видимому, вы можете полностью обработать весь подраздел с ветвящимся логическим путем If/ElseIf и вообще не нуждаться в каких-либо выводах подстановки Exit. Обратите внимание, в частности, что * никогда не будет времени, когда код действительно попадает в «... F14 = Nothing» If Statement - потому что код * всегда * выходит из подпрограммы непосредственно перед этой строкой. –

+0

Итак, вы хотите иметь его так, чтобы сменить один из F13 или F14 автоматически изменил другой? Кроме того, это не похоже на * соотношение * двух ячеек так же, как * разность * между ними. –

ответ

2

Может быть, это будет работать для вас:

Private Sub Worksheet_Change(ByVal Target As Range) 
    Dim v As Variant 
    If Target.Address = "$F$13" Then 
     v = Target.Value 
     If Not IsNumeric(v) Then 
      Range("F13").Value = CVErr(xlErrValue) 
     ElseIf v < 0 Or v > 1 Then 
      Range("F13").Value = CVErr(xlErrValue) 
     Else 
      Range("F14").Value = 1 - v 
     End If 
    ElseIf Target.Address = "$F$14" Then 
     v = Target.Value 
     If Not IsNumeric(v) Then 
      Range("F14").Value = CVErr(xlErrValue) 
     ElseIf v < 0 Or v > 1 Then 
      Range("F14").Value = CVErr(xlErrValue) 
     Else 
      Range("F13").Value = 1 - v 
     End If 
    End If 
End Sub 

Если F13 изменяется на значение в диапазоне от 0 до 1, то F14 автоматически изменяется на комплементарный значение, и наоборот. Если какое-либо значение, отличное от числа от 0 до 1, помещается в одну из этих двух ячеек, тогда значение в этой ячейке становится ошибкой. Обработчик событий работает только в том случае, если значение помещается непосредственно в любую из этих ячеек (в отличие от большего диапазона, содержащего эти ячейки), но с использованием вами ActiveCell, который, по-видимому, является намерением.

+0

Спасибо за помощь! Код работает так, как должен. Опять же, спасибо! – Maurice