Этот код приводит к сбою моего файла, если я выбираю «-» в раскрывающемся списке на моем листе. Временная метка реализуется, когда выбрано «Да», однако она выходит из строя, когда я выбираю «-». Что мне не хватает?
Выпадающий список содержит 2 опции:
-, Да
Private Sub Worksheet_Change(ByVal Target As Range)
On Error GoTo Handler
If ActiveCell.Value = "Yes" Then
ActiveCell.Offset(0, 1) = Format(Now(), "dd-mm-yyyy hh:mm")
ElseIf ActiveCell.Value = "-" Then
ActiveCell.Offset(0, 1) = ""
End If
Handler:
End Sub
Ваш код может вызвать бесконечный цикл. например. Ячейка A1 изменена, ActiveCell.Offset(0, 1) = ..
снова вызывает Change
событие. и так далее ...
Application.EnableEvents = False
необходим, если в коде события Change
изменены какие-либо ячейки.
кстати, лучше использовать Target.Value
вместо ActiveCell.Value
.
Документация Майкрософт:
Private Sub Worksheet_Change(ByVal Target As Range)
On Error GoTo Handler
Application.EnableEvents = False
If ActiveCell.Value = "Yes" Then
ActiveCell.Offset(0, 1) = Format(Now(), "dd-mm-yyyy hh:mm")
ElseIf ActiveCell.Value = "-" Then
ActiveCell.Offset(0, 1) = ""
End If
Handler:
Application.EnableEvents = True
End Sub
Почему Target.Value лучше, чем ActiveCell.Value?
Целевой аргумент — это ячейки изменения (объект Range). Activecell — это всегда ячейка на листе. Измененный диапазон может состоять из нескольких ячеек.