Страницы: 1
RSS
Условное реагирование на изменение ячейки
 
Добрый день! Помогите, пожалуйста, советом как избежать зацикленности при условном реагировании на изменение ячейки?

Есть столбец из трёх значений A1,А2,А3. Нужно при изменении значения одной из этих трёх ячеек поменять значения в двух других(на "1","2" или "3" в зависимости от того какую строчку изменили).

У меня возникает зацикленность макроса, которую я никак не могу победить. Хотя выход из процедуры (Exit Sub) стоит в каждом из случаев.
Вот мой текст макроса и функции:
Код
Private Sub Worksheet_Change(ByVal Target As Range)
  Select Case Target.Address    
    Case "$A$1"
      macro1
      Exit Sub
      
    Case "$A$2"
      macro2
      Exit Sub
      
    Case "$A$3"
      macro3
      Exit Sub
      
  End Select
  
End Sub


-----------------------------------------
а это сами функции изменения:
Код
Function macro1()
    Cells(2, 1).Value = "1"
    Cells(3, 1).Value = "1"
End Function
    
Function macro2()
    Cells(1, 1).Value = "2"
    Cells(3, 1).Value = "2"
End Function

Function macro3()
    Cells(1, 1).Value = "3"
    Cells(2, 1).Value = "3"
End Function
Изменено: Szholud - 29.10.2017 15:40:11
 
Код следует оформлять соответствующим тегом. Ищите такую кнопку <...> и исправьте своё сообщение.
По вопросу: отключайте отслеживание событий на время работы макроса. Только не забудьте потом включить.
Application.EnableEvents = False
 
Юрий, код соответствующим тегом оформил. Спасибо за замечание.

Отключение отслеживания событий помогло! спасибо большое!
 
А Exit Sub везде для чего? У Вас же после Select'а ничего нет, поэтому смысла в Exit Sub нет.
There is no knowledge that is not power
 
supercat,  все верно,  exit sub лишнее.  Я просто думал,  что без него выполняются следующие условия и поэтому получается зацикленность,  но в итоге проблема решилась другим способом,  который подсказал уважаемый Юрий.  
 
Цитата
Szholud написал:
Я просто думал,  что без него выполняются следующие условия
Конструкция Select Case - End Select тем и хороша, что при выполнении одного условия, другие даже не проверяются )
 
Ваши несколько в одном:
Код
Private Sub Worksheet_Change(ByVal Target As Range)
Dim lVal As Long
    If Not Application.Intersect(Range("A1:A3"), Target) Is Nothing Then
        Application.EnableEvents = False
        lVal = Target.Value
        Range("A1:A3").Value = Target.Row
        Target.Value = lVal
        Application.EnableEvents = True
    End If
End Sub
Страницы: 1
Наверх