1. Код Worksheet_Change должен быть в модуле листа (Лист2), а не в модуле ЭтаКнига и не в Module1
2. В начале кода должна быть строчка, отключающая реакцию на события:
Application.EnableEvents = False
иначе .Value = Now снова вызовет эту процедуру и т.д. - бесконечный цикл.
3. В конце кода должна быть строчка, восстанавливающая реакцию на события:
Application.EnableEvents = True
Более корректно код может выглядеть, например, так:
Код |
---|
' Этот код должен быть в модуле листа (Лист2), а не в модуле ЭтаКнига и не в Module1
Private Sub Worksheet_Change(ByVal Target As Range)
Const Addr = "A2:A100" ' <-- Контролируемый диапазон изменения (вручную) данных
Dim Cell As Range, Rng As Range
Dim dt As Date
' Усли изменения не в контролируемом диапазоне, то выйти
Set Rng = Intersect(Target, Range(Addr))
If Rng Is Nothing Then Exit Sub
' Отключить события для исключения зацикливания,
' иначе .Value = Now снова вызовет эту процедуру - это бесконечный цикл!
Application.EnableEvents = False
' При ошибке завершить код с восстановлением обработки событий и сообщить об ошибке записи даты,
' например, при защите листа с заблокированными ячейками "B"
On Error GoTo exit_
' В строках изменения записать даты в столбец "B"
dt = Now
For Each Cell In Target
With Cell
If Len(.Value) = 0 Then
' Очистить дату в ячейке "B", когда ячейка "A" - пустая
.Offset(0, 1).ClearContents
Else
' Записать в ячейке "B" текущую дату и время
.Offset(0, 1).Value = dt
End If
End With
Next
' Выровнять ширину столбца "B" (один раз в конце цикла)
Range(Addr).Offset(0.1).EntireColumn.AutoFit
exit_:
' Вернуть реагирование на события
Application.EnableEvents = True
' Указать на ошибку записи даты (если этого хочется)
If Err Then
Cell.Offset(0, 1).Select
MsgBox "Невозможна запись даты в " & Cell.Offset(0, 1).Address(0, 0), vbExclamation, "Ошибка записи даты"
Err.Clear
End If
End Sub |