Автоматическая вставка текущей даты в ячейку при вводе данных

Предположим, у нас имеется таблица заказов, куда пользователь вводит номер заказа, имя клиента, сумму и т.д. Необходимо сделать так, чтобы при внесении номера заказа в столбец А - в столбце B напротив введенного заказа автоматически появлялись дата и время его занесения:

date_auto_enter3.png

Чтобы реализовать такой ввод даты, нам потребуется простой макрос, который надо добавить в модуль рабочего листа. Для этого щелкните правой кнопкой мыши по ярлычку листа с таблицей и выберите в контекстном меню команду Исходный текст (View code).

В открывшееся окно редактора Visual Basic скопируйте этот текст этого макроса:

Private Sub Worksheet_Change(ByVal Target As Range)
    
    For Each cell In Target   'проходим по всем измененным ячейкам
       If Not Intersect(cell, Range("A2:A100")) Is Nothing Then  'если изменененная ячейка попадает в диапазон A2:A100
            With cell.Offset(0, 1)         'вводим в соседнюю справа ячейку дату
               .Value = Now
               .EntireColumn.AutoFit  'выполняем автоподбор ширины для столбца B, чтобы дата умещалась в ячейке
            End With
       End If
    Next cell
End Sub

При необходимости измените "чувствительный" диапазон "А2:А100" на свой собственный. Если необходимо вставлять дату не в соседний столбец, а правее - подставьте в оператор Offset(0,1) вместо 1 число побольше.

Закройте редактор Visual Basic и попробуйте ввести что-нибудь в диапазон А2:А100. В соседней ячейке тут же появится текущая дата-время!

Ссылки по теме

 


Страницы: 1  2  3  4  5  6  
05.04.2020 20:10:46
Private Sub Worksheet_Change(ByVal Target As Range)
       
       For Each cell In Target ' проходим по всем измененным ячейкам
        
                
        If Not Intersect(cell, Range("U2:U3035")) Is Nothing Then ' если измененная ячейка попадает в диапазон U2:U3035
        If Len(Target) Then
        With Range("V" & cell.Row) ' вводим в столбец V
        .Value = Sheets("Данные").Range("V3")
        End With
        End If
               
              
        End If
        
        Next cell
        End Sub 
Подскажите как реализовать, чтобы при стирании данных (делит) из ячейки столбца U стирались и данные из столбца из ячейки V
12.05.2020 18:31:41
Добрый вечер Николай!  подскажите пожалуйста как можно сделать автоматическое выделение даты после установленного срока:

Например документ был сдан в архив 12 мая 2019 года срок хранения 1 год, хотелось бы чтобы ячейка с датой сообщала мне что срок подошел для изъятия документа, скажем выделялась красными или каким нибудь другим цветом.

Заранее благодарю.
18.06.2020 06:05:33
А зачем городить огород с макросами, которые так тяжело изменять под свои нужды? А если у человека только Libreofice, этот макрос не будет работать в нем.  В LibreOffice, вообще с макросами довольно тяжело.
Вот "нативная" формула автодаты для Exel / Libreofice Calc, которая работает без всяких макросов.

=ЕСЛИ(C1="";"";ЕСЛИ(B1="";ЕСЛИ(C1="";"";ТДАТА());B1))

В при заполнении ячейки С1 в ячейку B1 будет выставлена текущая дата / время.
При удалении С1, удалится и B1.
При изменении С1 ячейка B1 не изменяется.

Только необходимо  открыть вкладки в LibreOffice: СЕРВИС - ПАРАМЕТРЫ - LibreOffice Calc - ВЫЧИСЛЕНИЯ - ЦИКЛИЧЕСКИЕ ССЫЛКИ и поставить галочку в ИТЕРАЦИИ.


В экселе тоже надо будет найти нечто, что отвечает за циклические ссылки и итерации и включить их, иначе будет выдавать ошибку.
18.06.2020 17:52:17
Циклические ссылки в Excel - это несколько про другое.
И работают они только в режиме ручного пересчета.
Насчет LibreOffice - не скажу, не работал в нем практически :)
18.06.2020 06:10:37
А, вообще, Майкрософту уже давно пора сделать нормальную формулу автодаты, которая не пересчитывается при изменении других ячеек. Вместо того, чтобы каждый год продавать людям новые версии своего ОФИСА, которые ничем особо не отличаются, сделали бы нормальную и удобную формулу.
18.06.2020 18:08:09
Что, хотите сказать, что невероятно мощный , крутой и мегапопулярный Microsoft Office, не имеет такой маленькой функции, как циклические ссылки? А непопулярный и тормознутый  Либреофис имеет и  выигрывает при этом? Может кто-нибудь может написать макрос с автодатой таким способом, чтобы он работал и Либреофисе, и Майкрософте, так в Либреофисе многие команды все таки работают в режиме совместимости.
23.07.2020 10:42:48
Добрый день! Хочу описать проблему которая возникла. Если отфильтровать столбец который нужно изменить дата в соседнем столбце при протягивание меняется не только в отфильтрованных но и в тех которые были между ними до фильтра.
15.09.2020 09:18:07
Здравствуйте Николай. Спасибо Вам за столь познавательный сайт. Подскажите что изменить в коде что бы дата вставлялась в определенную ячейку, With cell.Offset(0, 1) если вместо 0, 1 ставлю ячейку макрос выводит дату в ячейку где вношу данные.
24.11.2020 18:11:58
Доброе времени суток. Еще раз поблагодарю Николая Павлова за безвозмездный опыт, ниже записаны формулы с помощью видео уроком Николая

Давно борюсь с такой проблемой не хотел писать по пустякам но видимо придется.

Прошу помощи в...

Имею две проблемы, и две нерешенные формулы, кто может сталкивался или сможет помочь, а кому надо пожалуйста пользуйтесь 1-м вариантом если Вам не надо вкладывать дату в 2-ве и более ячейки она работает норм. И так...

Способ №1

1) Если ввожу дату вручную в столбик А4 по А15 то в столбце G4 по G15 автоматически и беспроблемно вводиться эта дата, при изменении даты в столбце А2 по А15 вручную то опять автоматически и беспроблемно вводится дата в следующую пустую колонку, если сделать Ctrl+С и выделить колонки А2 по А15 нажать Ctrl+V, то дата будет записана в G4-H4-I4-J4... и так далее вместо G5-G6-G7...
2) После защиты листа эта формула вовсе не работает. помогите кто знает заранее благодарю за труд.
Private Sub Worksheet_Change(ByVal Target As Range)
Dim NewCellValue$, OldComment$
Dim cell As Range
     
    'если ячейка не в отслеживаемом диапазоне, то выходим
    If Intersect(Target, Range("A4:A2000")) Is Nothing Then Exit Sub
     
    'перебираем все ячейки в измененной области
    For Each cell In Intersect(Target, Range("A4:A2000"))
        If IsEmpty(cell) Then
            NewCellValue = "Ячейка очищена" 'фиксируем очистку ячейки
        Else
            NewCellValue = cell.Formula     'или ее содержимое
        End If
        On Error Resume Next
         
        With cell
           
        End With
        
        ' ==============================================
        ' дополнительый блок
        ' ==============================================
        Row_ = Target.Row ' запоминаем текущую строку на данной странице. такая же строка будет и на странице истории обслуживания
        Col_ = 5   ' устанавливаем крайний левый столбец. 
        
        Do While "" <> Sheets("Лист1").Cells(Row_, Col_).Text ' в цикле считаем заполненные столбцы от крайнего левого столбца. Находим крайний левый пустой столбец на странице истории
                 Col_ = Col_ + 1
        Loop
        ' записываем в пустой столбец на странице истории историю изменения. Тут ее можно компоновать как хочется.
        Sheets("Лист1").Cells(Row_, Col_) = Format(NewCellValue, "DD.MM.YY")
                            
        ' ==============================================
        '  конец дополнительного блока
        ' ==============================================
    Next cell 
End Sub  

Способ №2
Или может как то объединить Вашу формулу которая будет вписывать дату в ячейке B5-B6-B7 оттуда моя формула будет уже автоматически видеть дату как вписанную в ручную в каждую ячейку и записывать по вертикали в следующею свободную ячейку G5-G6-G7...  так я пробовал но не могу запустить сразу две формулы для работы с параллельными ячейками

Private Sub Worksheet_Change(ByVal Target As Range)
Dim NewCellValue$, OldComment$
Dim cell As Range
     
    'если ячейка не в отслеживаемом диапазоне, то выходим
    If Intersect(Target, Range("B4:B2000")) Is Nothing Then Exit Sub
     
    'перебираем все ячейки в измененной области
    For Each cell In Intersect(Target, Range("B4:B2000"))
        If IsEmpty(cell) Then
            NewCellValue = "Ячейка очищена" 'фиксируем очистку ячейки
        Else
            NewCellValue = cell.Formula     'или ее содержимое
        End If
        On Error Resume Next
         
        With cell
           
        End With
        
        ' ==============================================
        ' дополнительый блок
        ' ==============================================
        Row_ = Target.Row ' запоминаем текущую строку на данной странице. такая же строка будет и на странице истории обслуживания
        Col_ = 4   ' устанавливаем крайний левый столбец. ВНИМАНИЕ! Если вы удалите столбец 5 на странице истории, надо установить эту константу на 1 меньше!
        
        Do While "" <> Sheets("Лист1").Cells(Row_, Col_).Text ' в цикле считаем заполненные столбцы от крайнего левого столбца. Находим крайний левый пустой столбец на странице истории
                 Col_ = Col_ + 1
        Loop
        ' записываем в пустой столбец на странице истории историю изменения. Тут ее можно компоновать как хочется.
        Sheets("Лист1").Cells(Row_, Col_) = Format(NewCellValue, "DD.MM.YY")
                            
        ' ==============================================
        '  конец дополнительного блока
        ' ==============================================
    Next cell
    
    For Each cell In Target   'проходим по всем измененным ячейкам
       If Not Intersect(cell, Range("A4:A100")) Is Nothing Then  'если изменененная ячейка попадает в диапазон  
                     With cell.Offset(0, 1)      'вводим в соседнюю справа ячейку дату
               .Value = Now
               .EntireColumn.AutoFit  'выполняем автоподбор ширины для столбца B, чтобы дата умещалась в ячейке
               
            End With
       End If
    Next cell 
End Sub 
26.11.2020 16:19:31
Насчет защиты уже решил вопрос, в силе остался только один он же самый главный  

Кому интересно, прописываем этот код после своего макроса, и вуаля    
Next cell
Worksheets("Лист1").EnableOutlining = True
    Worksheets("Лист1").Protect Password:="1", UserInterfaceOnly:=True
End Sub 
11.12.2020 21:39:52
Вечер добрый. А подскажите пожалуйста. Почему не работает даний код макроса в онлайн гугл документе?
Что необходимо сделать что бы таки работала автоматическая вставка даты в соседней графе при вводе или изменении ячейки?
13.12.2020 14:19:04
Добрый день. подскажите мне пожалуйста. Как написать даный код в гугл диск? что бы он работал.
И еще момент. Как сделать что бы дата не менялась каждый раз при обновлении страницы.
17.12.2020 07:44:14
Всем привет, помогите дописать макрос, чтобы при выборе в 7 столбце (H) из списка значения "исполнено" или "без исполнения"  в 8 столбце проставлялась дата

 Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Cells.Count > 1 Then Exit Sub
    If Target.Column = 2 And Target.Row > 1 And Not IsEmpty(Target.Value) And Target.Offset(0, 1).Value = "" Then _
        Target.Offset(0, 1).Value = Date
    If Target.Column = 11 And Target.Row > 1 And Not IsEmpty(Target.Value) And Target.Offset(0, 1).Value = "" Then _
        Target.Offset(0, 1).Value = Date
    If Target.Column = 8 And Target.Row > 1 And Not IsEmpty(Target.Value) And Target.Offset(0, 1).Value = "" Then _
        Target.Offset(0, 1).Value = Date
    If Target.Column = 43 And Target.Row > 1 And Not IsEmpty(Target.Value) And Target.Offset(0, 1).Value = "" Then _
        Target.Offset(0, 1).Value = Date
     If Not Intersect(Target, Range("E2:E99999")) Is Nothing Then
       i = Split(Target.Address, "$")(2)
       LastRow = Sheets("РФ").Cells(Rows.Count, 1).End(xlUp).Row
        If InStr(Cells(i, 4), "РФ") > 0 Then
          Range("A" & CStr(i) & ":E" & i).Copy Sheets("РФ").Range("A" & LastRow + 1)
        End If
     End If
End Sub

И может стоит еще что то подправить в имеющемся коде, я просто вообще не понимаю ничего в этом.
13.01.2022 00:48:41
Друзья, у меня просто перестал работать этот макрос. Подскажите в чем может быть дело?? Все перепроверял, и даже тупо копипаст делал в новый файл. и ноль реакции. Он будто вообще перестал работать. Какие настройки могли поехать?
18.02.2022 11:05:12
Здравствуйте, Николай!
Макрос отличный!
Но столкнулся с такой проблемой:
     если данные ввожу через форму, то дата не появляется (ячейка остается пустой).
Подскажите пожалуйста, как сделать, чтобы текущая дата и время добавлялись автоматически при вводе данных через форму?
Заранее спасибо!
16.06.2022 10:37:07
Добрый день!
Совсем профан в VBA (((

Подскажите, а можно скорректировать код таким образом, чтобы дата проставлялась, если значение в ячейке соответствует условию. Например, в ячейке записана формула, при выполнении ряда критериев значение в ней автоматически меняется от "" до 5, можно ли сделать так, чтобы дата проставлялась автоматически если значение в ячейке становится в диапазоне от 1 до 5?
06.07.2022 13:51:36
Хороший макрос, правда когда применяем его в "Умной таблице", -- ведёт себя непредсказуемо.
09.07.2022 19:23:34
Изменил макрос под свои нужды, с учетом того что все вышеперечисленные варианты работали очень тяжело. Каждое удаление строки (полностью) или столбца, заставляло компьютер дымиться )))))

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim iPRange As Excel.Range
    Set iPRange = Range("C2:C50")
    If Not Application.Intersect(iPRange, Range(Target.Address)) _
               Is Nothing Then
        For Each cell In Target
           If Not iPRange Is Nothing And cell Like "9?????????" Then
                With cell.Offset(0, -1)
                   .Value = "заказано"
                 End With
           End If
        Next cell
    End If
        Set iPRange = Range("B2:C50")
    If Not Application.Intersect(iPRange, Range(Target.Address)) _
               Is Nothing Then
        For Each cell In Target
           If Not iPRange Is Nothing And cell Like "заказано" Then
                With cell.Offset(0, -1)
                   .Value = Now
                 End With
           End If
           If Not iPRange Is Nothing And cell Like "доставлено" Then
                With cell.Offset(0, -1)
                   .Value = Now
                 End With
           End If
           If Not iPRange Is Nothing And cell Like "ждем" Then
                With cell.Offset(0, -1)
                   .Value = Now
                 End With
           End If
        Next cell
    End If
End Sub

Суть в том, что при вводе телефона в третьем столбце, во втором ставится статус "заказано" а в первом ставится дата. Если это важно, формат даты можете задать вручную для всего столбца. А для второго столбца я сделал список из трёх значений для удобства ручной смены, без всяких макросов.
При изменении значения во втором столбце на любое из доступных, в первом столбце обновляется дата на текущую.
Суть кардинального отличия - в использовании переменной вместо буфера и проверка на активный диапазон, что привело к ускорению работы макроса в момент работы со столбцами и строками (удаление, вставка и т.п.) примерно на 90%
п.с. я первый раз это делал, поэтому возможно всё не так как кажется )))
21.07.2022 17:43:35
Идея ХОРОШАЯ, воплощение -- слабое.
Макрос (вирусный) удаляется неохотно...
08.08.2022 17:49:24
Господа подскажите можно ли использовать на одном листе два три и четыре макроса

по вставке даты например мне надо при нажатии любой кнопки в столбике A в столбик B вставлять текущую дату

при помощи макроса ниже, как сделать так чтобы на этом же листе принажатии столбик А вставка была в В , затем при нажатии скажем D вставка была в E


Private Sub Worksheet_Change(ByVal Target As Range)
   
   For Each cell In Target   'проходим по всем измененным ячейкам
      If Not Intersect(cell, Range("A2:A100")) Is Nothing Then  'если изменененная ячейка попадает в диапазон A2:A100
           With cell.Offset(0, 2)         'вводим в соседнюю справа ячейку дату
              .Value = Time
              .EntireColumn.AutoFit  'выполняем автоподбор ширины для столбца B, чтобы дата умещалась в ячейке
           End With
      End If
   Next cell
End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
   
   For Each cell In Target   'проходим по всем измененным ячейкам
      If Not Intersect(cell, Range("D2:D100")) Is Nothing Then  'если изменененная ячейка попадает в диапазон D2:D100
           With cell.Offset(0, 2)         'вводим в соседнюю справа ячейку дату
              .Value = Time
              .EntireColumn.AutoFit  'выполняем автоподбор ширины для столбца B, чтобы дата умещалась в ячейке
           End With
      End If
   Next cell
End Sub

расположив два макроса подряд выдаёт ошибку
08.08.2022 18:08:47
Здравствуйте подскажите пожалуйста, Как использовать два таких макроса на одном листе

для столбца например А и столбца например D

Private Sub Worksheet_Change(ByVal Target As Range)
   
   For Each cell In Target   'проходим по всем измененным ячейкам
If Not Intersect(cell, Range("A2:A100")) Is Nothing Then  'если изменененная ячейка попадает в диапазон A2:A100
With cell.Offset(0, 1)   'вводим в соседнюю справа ячейку дату
  .Value = Now
  .EntireColumn.AutoFit  'выполняем автоподбор ширины для столбца B, чтобы дата умещалась в ячейке
End With
End If
   Next cell
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
   
   For Each cell In Target   'проходим по всем измененным ячейкам
If Not Intersect(cell, Range("D2:D100")) Is Nothing Then  'если изменененная ячейка попадает в диапазон D2:D100
With cell.Offset(0, 1)   'вводим в соседнюю справа ячейку дату
  .Value = Now
  .EntireColumn.AutoFit  'выполняем автоподбор ширины для столбца B, чтобы дата умещалась в ячейке
End With
End If
   Next cell
End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
 
  For Each cell In Target   'проходим по всем измененным ячейкам
If Not Intersect(cell, Range("A2:A100, D2:D100") Is Nothing Then  'если изменененная ячейка попадает в диапазон A2:A100 и D2:D100
With cell.Offset(0, 1)   'вводим в соседнюю справа ячейку дату
 .Value = Now
 .EntireColumn.AutoFit  'выполняем автоподбор ширины для столбца B, чтобы дата умещалась в ячейке
End With
End If
  Next cell
End Sub
Остался вопрос: как формат Date сделать?....
.NumberFormat = "dd-mm-yyyy, hh:mm:ss" / не хочет выдавать нужную инфу

затупил:

.Value = Now
.NumberFormat = "dd-mm-yyyy, hh:mm:ss"
24.04.2023 14:01:33
Друзья,  добрый  день !  Подскажите  пожалуйста  для  чайника.  При  создании макроса  автоматической вставки  даты в  ячейку - необходимо создание  данной  операции  более чем ,  в  двух  других  столбцах.  Т.е. макросов  необходимо  минимум   еще  два   с  однотипным  действием. Пока  не  могу  найти  ответ  или  до конца  не  вижу,  как  это можно  осуществить.
24.10.2023 10:42:12

 Private Sub Worksheet_Change(ByVal Target As Range)   
    For Each cell in Target   'проходим по всем измененным ячейкам
    If Not Intersect(cell, Range("A2:N1000")) Is Nothing Then  
      With Range("O" & cell.row)
         .Value = Now
         .EntireColumn.AutoFit  
      End With
    End If
    Next cell
End Sub

Доброго дня!
Не могу в макросе разобраться. Может не там ищу...
У меня простейший макрос написать не выходит ((
Суть в чем? Необходимо, чтобы при вводе значения в ячейку на одном листе, проставлялась дата создания значения в ячейке, в другом листе. Подставляю вышеуказанные формулы, а они не работают. Да, и к тому же, сложность вызывает то, что ячейки, и на первом и на втором листе объединены. То есть на одном листе 3 ячейки в одну, и на другом листе 5 ячеек в одну. Этот код пытался править. Все попытки четны.  
28.11.2024 18:28:54
Николай, спасибо Вам большое за классный сайт. Как сделать так, чтобы данный макрос работал с умной таблицей.

Private Sub Worksheet_Change(ByVal Target As Range)
   For Each cell In Target   'проходим по всем измененным ячейкам
   If Not Intersect(cell, Range("G4:AK100";)) Is Nothing Then
     With Range("AR" & cell.Row)
        .Value = Now
        .EntireColumn.AutoFit
     End With
   End If
   Next cell
End Sub
Что изменить или дописать в макрос, чтобы при удалении строки и удалялась дата в ячейке?
15.01.2025 15:30:25
СПАСИБО МАКРОС ПРЕВОСХОДНО РАБОТАЕТ.ВАШ САЙТ ЛУЧШИЙ.ОЧЕНЬ МНОГОМУ НАУЧИЛАСЬ И УЧУСЬ.ЧТО ОБЛЕГЧАЕТ СУЩЕСТВЕННО РАБОТУ.УСПЕХОВ .
Страницы: 1  2  3  4  5  6  
Наверх