Здравствуйте, подскажите как сделать, что бы исходное значение в ячейке автоматически перезаписывалось новым по условию при изменении входящих данных. Я вот что-то навоял для примера, вроде начинает работать, а потом выскакивает ошибка и подвисает. И еще, в какой модуль книги его нужно вставлять.
[vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range) If Range("A1").Value > 100 Then Range("B10") = 12345 ElseIf Range("A1").Value < 100 Then Range("B10") = 54321 Else: Range("B10") = 00000 End If End Sub
[/vba]
Здравствуйте, подскажите как сделать, что бы исходное значение в ячейке автоматически перезаписывалось новым по условию при изменении входящих данных. Я вот что-то навоял для примера, вроде начинает работать, а потом выскакивает ошибка и подвисает. И еще, в какой модуль книги его нужно вставлять.
[vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range) If Range("A1").Value > 100 Then Range("B10") = 12345 ElseIf Range("A1").Value < 100 Then Range("B10") = 54321 Else: Range("B10") = 00000 End If End Sub
У меня в 2013 валился на втором изменении с полным вываливанием из Excel. Нужно обязательно отключать события на время отработки логики: [vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range) Application.EnableEvents = False 'ОБЯЗАТЕЛЬНО - иначе события зациклятся If Range("A1").Value > 100 Then Range("B10") = 12345 ElseIf Range("A1").Value < 100 Then Range("B10") = 54321 Else Range("N10") = 0 End If Application.EnableEvents = True 'ОБЯЗАТЕЛЬНО - опять включить события End Sub
У меня в 2013 валился на втором изменении с полным вываливанием из Excel. Нужно обязательно отключать события на время отработки логики: [vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range) Application.EnableEvents = False 'ОБЯЗАТЕЛЬНО - иначе события зациклятся If Range("A1").Value > 100 Then Range("B10") = 12345 ElseIf Range("A1").Value < 100 Then Range("B10") = 54321 Else Range("N10") = 0 End If Application.EnableEvents = True 'ОБЯЗАТЕЛЬНО - опять включить события End Sub
К сожалению не работает. Записывается 54321, после чего что бы я не вводил в исходную ячейку, значение 12345 в конечной ячейке не появляется. Более того, если я хочу удалить 54321 из B10, то оно не удаляется. Кстати в Range("N10") = 0, там на самом деле Range("B10") = 0 должно быть. Подправил в коде.
К сожалению не работает. Записывается 54321, после чего что бы я не вводил в исходную ячейку, значение 12345 в конечной ячейке не появляется. Более того, если я хочу удалить 54321 из B10, то оно не удаляется. Кстати в Range("N10") = 0, там на самом деле Range("B10") = 0 должно быть. Подправил в коде.Vertep7
Сообщение отредактировал Vertep7 - Вторник, 08.08.2023, 14:32
Здравствуйте. Вставлять это нужно в модуль той книги, где вы меняете значения. Пример вы не приложили, поэтому можно только догадываться, почему у вас появляется ошибка. Сам код вполне рабочий и не должен создавать ошибку, вот только в таком виде код будет срабатывать при изменении значений в любой ячейки этого листа. Я вам просто прокомментирую, что делает ваш код [vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range) ' произошло изменение значений в каком то диапазоне этого листа, запускается этот макрос, которому в качестве параметра передается объект типа Range, ' с именем Target, соответствующий измененому диапазону. ' В большинстве случаев требуется проверка того, что изменилось и как на это должен реагировать макрос. Здесь могут быть разные варианты, например ' если изменение произошло не в том диапазоне листа, который нужно контролировать, или количество измененных ячеек больше одной (удалили строку или столбец), ' то выход из процедуры (Exit Sub) If Range("A1").Value > 100 Then ' в этом блоке If у вас происходит изменение значений ячеек B10 и N10 на активном листе при любом изменении значений на этом листе, а не только в A1. Range("B10") = 12345 ElseIf Range("A1").Value < 100 Then Range("B10") = 54321 Else: Range("N10") = 00000 End If End Sub
Здравствуйте. Вставлять это нужно в модуль той книги, где вы меняете значения. Пример вы не приложили, поэтому можно только догадываться, почему у вас появляется ошибка. Сам код вполне рабочий и не должен создавать ошибку, вот только в таком виде код будет срабатывать при изменении значений в любой ячейки этого листа. Я вам просто прокомментирую, что делает ваш код [vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range) ' произошло изменение значений в каком то диапазоне этого листа, запускается этот макрос, которому в качестве параметра передается объект типа Range, ' с именем Target, соответствующий измененому диапазону. ' В большинстве случаев требуется проверка того, что изменилось и как на это должен реагировать макрос. Здесь могут быть разные варианты, например ' если изменение произошло не в том диапазоне листа, который нужно контролировать, или количество измененных ячеек больше одной (удалили строку или столбец), ' то выход из процедуры (Exit Sub) If Range("A1").Value > 100 Then ' в этом блоке If у вас происходит изменение значений ячеек B10 и N10 на активном листе при любом изменении значений на этом листе, а не только в A1. Range("B10") = 12345 ElseIf Range("A1").Value < 100 Then Range("B10") = 54321 Else: Range("N10") = 00000 End If End Sub
Нет, прошу прощения, все заработало. Когда делал пример не увидел что у меня A1 и B10, а должны были быть A1 и B1. Сейчас все исправил, все заработало. Спасибо)
Нет, прошу прощения, все заработало. Когда делал пример не увидел что у меня A1 и B10, а должны были быть A1 и B1. Сейчас все исправил, все заработало. Спасибо)Vertep7
Сообщение отредактировал Vertep7 - Вторник, 08.08.2023, 14:49