Ваша базовая c проблема решается легко - просто добавьте If
, чтобы проверить содержимое ячейки:
For Each cell In Target
If UCase(cell.Value2) = "YES" Then
cell.Offset(0, 4).Value = Now
cell.Offset(0, 4).NumberFormat = "dd/mm/yyyy"
Next cell
Next cell
Однако ваша проверка для столбца 'G' некорректна. Target
содержит все ячейки, которые в данный момент изменены. Если пользователь введет что-то в ячейку, Target
будет содержать именно эту ячейку. Однако, если данные, например, вставлены в этот лист, Target
будет содержать все ячейки, в которые вставляются данные.
Теперь Intersect
проверяет, имеют ли два диапазона общие ячейки. Ваше заявление If Not Intersect(Target, Range("G:G")) Is Nothing
проверит, находится ли любая измененных ячеек в столбце G, и если да, оно запишет дату в ячейку, которая на 4 колонки справа. В случае, если пользователь вводит что-то в ячейку столбца G, это нормально. Но если он вставит что-то в, скажем, ячейки столбцов F, G, H, код будет работать для всех трех ячеек. Таким образом, вы должны проверить каждую ячейку отдельно.
Private Sub Worksheet_Change(ByVal Target As Range)
On Error GoTo change_exit ' Ensure that events are re-enabled in case of error
Application.EnableEvents = False
Dim cell As Range
For Each cell In Intersect(Target, Range("G:G"))
If UCase(cell.Value2) = "YES" Then
cell.Offset(0, 4).Value = Now
cell.Offset(0, 4).NumberFormat = "dd/mm/yyyy"
end if
Next cell
change_exit:
Application.EnableEvents = True
End Sub
Обновление : изменен лог c, просто зацикливаясь на ячейках target
, которые пересекаются со столбцом G
- спасибо в BigBen за подсказку.