какой макрос VBA указывать дату, когда ячейка заполнена, но не когда происходит какое-либо событие

#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.