#excel #vba #events
#excel #vba #Мероприятия
Вопрос:
У меня есть файл Excel, который на самом деле является базой данных, которую я регулярно обновляю. Каждый раз, когда я выполняю обновление, я хочу отфильтровать данные, которые я ввел в этот конкретный день.
Итак, я нашел этот макрос в Интернете, который действительно отлично подходит для моего приложения.
Private Sub Worksheet_Change(ByVal Target As Range)
Dim C As Range, D As Range, Inte As Range, r As Range
Set C = Range("C:C")
Set Inte = Intersect(C, Target)
If Inte Is Nothing Then Exit Sub
Application.EnableEvents = False
For Each r In Inte
r.Offset(0, 1).Value = Date
Next r
Application.EnableEvents = True
End Sub
Это дает мне ячейку D с датой дня, когда я изменил ячейку C. Проблема в том, что я хочу, чтобы дата отображалась, только если я действительно помещаю текст в ячейку C. Иногда я просто вставляю строку, но пустую в ячейку C, и макрос рассматривает это как событие. Затем он выдает мне дату в ячейке D, однако я ничего не написал.
Я предполагаю, что это должна быть довольно простая строка для добавления где-нибудь в макрос с If Not IsEmpty(C.Value) Then
, но я не смог поместить ее в нужное место, поскольку это не работает…
Заранее благодарю вас за любую помощь, которую вы можете получить. И всем хороших выходных!
Ответ №1:
попробуйте
Private Sub Worksheet_Change(ByVal Target As Range)
Dim C As Range, D As Range, Inte As Range, r As Range
Set C = Range("C:C")
Set Inte = Intersect(C, Target)
If Inte Is Nothing Then Exit Sub
Application.EnableEvents = False
For Each r In Inte
If Not IsEmpty(r.Value) Then ' line added
r.Offset(0, 1).Value = Date
Else
r.Offset(0, 1).Value = ""
End If
Next r
Application.EnableEvents = True
End Sub
Комментарии:
1. спасибо, Ахмед АУ! На самом деле это отлично работает, когда я добавляю строку, но ничего не записываю в ячейку C. Как вы думаете, я мог бы еще больше обновить его, чтобы в ячейке D ничего не было, даже если я начал писать в ячейке C, но в конечном итоге это была ошибка, и я стер содержимое ячейки C? Потому что, как только я что-то записываю в ячейку C, дата появляется в ячейке D и остается здесь, даже если я сразу после этого удаляю ячейку C.
2. Отредактированный ответ в соответствии с вашими требованиями. Можете принять ответ, если это соответствует вашим целям.
3. Привет, Ахмед АУ, у меня все еще есть другое обновление, которое я хотел бы внести в этот макрос, но у меня не получается. Я хотел бы на том же листе иметь точно такой же код, который выполнял бы то же самое, но в других столбцах. Когда я пишу в columnO, я бы хотел, чтобы он записывал дату в columnP. У меня были ошибки со всем, что я пытался объединить два кода. Единственное, что работает, это если у меня есть два отдельных кода, но я вызываю второй Worksheet_SelectionChange() вместо Worksheet_Change(). Однако этот параметр заставляет столбец P актуализироваться только тогда, когда я покидаю ячейку в O и возвращаюсь к ней.
4. Если я вас правильно понял, что вы также хотите добавить ту же функциональность столбца C в столбец O, затем измените
Set C = Range("C:C")
наSet C = Union(Range("C:C"), Range("O:O"))
. Это будет работать как для столбца C, так и для O.5. это было так просто! Спасибо! на самом деле так просто, что я подумал, что это будут два разных кода и что я мог бы впоследствии изменить второй, не раздражая вас дополнительными вопросами. Я хотел бы, чтобы дата указывалась в столбце P только тогда, когда я пишу «зарезервировано» в столбце O, а не когда я пишу что-либо еще. Я сожалею об этом. большое вам спасибо за ваше время!
Ответ №2:
Используйте SpecialCells для работы только с непустыми ячейками
И вам не нужно выполнять цикл
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Inte As Range
Set Inte = Intersect(Range("C:C"), Target)
If Inte Is Nothing Then Exit Sub
Application.EnableEvents = False
Inte.SpecialCells(xlCellTypeConstants).Offset(0, 1).Value = Date
Application.EnableEvents = True
End Sub
Комментарии:
1. Спасибо за ваш комментарий DisplayName. К сожалению, это не работает, поскольку, как только я пишу womething в ячейке C, он записывает дату во всех ячейках, где уже было что-то написано, во всех столбцах, кроме A и B.