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

Предположим, у нас имеется таблица заказов, куда пользователь вводит номер заказа, имя клиента, сумму и т.д. Необходимо сделать так, чтобы при внесении номера заказа в столбец А - в столбце 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  
23.09.2017 13:52:45
Пишет переменная не определена, выделяет первую строку кода
24.09.2017 13:25:44
Добрый день, я только начинаю работать с макросами, не могли бы вы подсказать как составить макрос по следующим условиями
- существует ячейка A1 процентом выполнения проекта,    
- в соседней B1 нужно указать фиксированную дату выполнения проекта при достижении диапазона от 80 до 100%
20.10.2017 10:40:53
Как все так же сделать, только через кнопку - "галочку", нажимаешь на нее и в нужную ячейку заполняется нынешняя дата?
18.12.2017 21:55:56
Здравствуйте!
Что надо поменять и возможно ли? Чтобы код просматривал изменения при копировании - вставке целого столбца?
Работает всё как надо при ручном изменении в ячейке, при вставке содержимого единичной ячейки. Не работает при вставке нескольких значений со столбца одновременно.
--------------------------------------------
For Each cell In Target   'проходим по всем измененным ячейкам
If Not Intersect(cell, Range("C4:C1000";)) Is Nothing Then
With Range("A" & cell.Row)
  .Value = Now
  .EntireColumn.AutoFit
End With
End If

Next cell
----------------------------------------------
16.01.2018 13:38:15
Подскажите пожалуйста макрос чтоб форматировал дату за 6 месяцев , а лучше всего  чтоб оповещал если это возможно . В функциях форматирование дат, только за месяц есть.  
11.02.2018 20:48:45
Подскажите как в этой формуле сделать чтобы в другой ячейке показывало дату

Private Sub Worksheet_Change(ByVal Target As Range)
      For Each cell In Target
       If Not Intersect(cell, Range("A2:A100")) Is Nothing And _
                                     Target.Offset(0, 4) = "" Then
              With Target.Offset(0, 4)
                  .Value = Format(Now, "hh: mm")
                  .EntireColumn.AutoFit
              End With
     End If
  Next cell
End Sub
16.02.2018 13:45:45
Подскажите пожалуйста, а как сделать так чтобы на одном листе была не одна автоматически вставляемая дата, а допустим две, например мне надо в первой ячейке поставить число и чтобы во второй автоматически поставилась дата. а в третьей автоматически поставилась дата и время заполнения, как это сделать?
23.02.2018 15:55:15
Добрый день.
Подскажите, почему макрос не работает, когда включаешь защиту листа?
пишет ошибку Run time error 1004

Как можно это исправить? Очень надо, чтобы ставилась дата, когда меняется значение рядом в ячейке, но при этом, чтобы нельзя было ее поменять.

Спасибо.
18.03.2018 01:07:35
Добрый день Николай,

прочитал много комеентариев к данной статье и возник вопрос более комплексного плана с вводом даты.
У меня есть таблица скажем из 3-х колонок A, B и С

колонка А2 = должна содержать неизменяемую дату при первичном внесении информации в В2 и не меняться после пересохранении файла
колонка С2 = должна выводить значение настоящего дня и времени при условии изменении В2

Возможно ли реализовать это на одном листе?
Спасибо заранее за помощь

Владислав
25.03.2018 20:33:33
Николай, добрый вечер!)))  Большое спасибо Вам за чудесный сайт!!!!!  Мне этот макрос очень понравился, он меня выручает очень. Не получается одно: Если в столбце А стоит формулы (у меня сумма), в столбце В никаких изменений нет.. Как сделать, чтобы макрос каждый раз пересчитывал значения после изменений в столбце А?    Буду очень благодарен.
29.10.2018 08:49:26
Добрый день, Николай.
Спасибо вам за ваш труд, очень много полезной информации и примеров.
Воспользовался вашим макросом, нашёл пример на проверку вхождения слова:

Николай Павлов 07.05.2013 22:54:00
Можно добавить условие на проверку вхождения слова "Исправлено" в изменяемой ячейке в 4-й строке макроса:

If Not Intersect(cell, Range("A2:A100";)) Is Nothing And cell Like "Исправлено*" Then

пытался доделать сам на проверку по нескольким словам (внесена, срочная от, отдана в работу), но к сожалению ни чего не получилось, знаний маловато.
Подскажите пожалуйста, как реализовать такой вариант.

После долгих ожиданий помощи и поисков решения в интернет, нашёл макрос который я думаю многим понравится.

Private Sub Worksheet_Change(ByVal Target As Excel.Range)
        With Target
            If .Count > 1 Then Exit Sub
            If Not Intersect(Range("l3:l100"), .Cells) Is Nothing Then
                Application.EnableEvents = False
                If IsEmpty(.Value) Then
                    .Offset(0, 1).ClearContents
                Else
                    With .Offset(0, 1)
                        .NumberFormat = "dd.m.yyyy hh:mm:ss"
                        .Value = Now
                    End With
                End If
                Application.EnableEvents = True
            End If
        End With
    End Sub 
06.02.2019 17:07:23
Ну очень шикарная статья и сайт, уже не первый раз решаю свои задачи с помощью этого сайта.
СПАСИБО за то что Вы есть.
На основе вашей статьи и прочитаных коминтариев отредактировал код.
Private Sub Worksheet_Change(ByVal Target As Range)
     
    For Each Cell In Target   'проходим по всем измененным ячейкам
       If Not Intersect(Cell, Range("A5:A4000")) Is Nothing Then  'если изменененная ячейка попадает в диапазон A2
            If IsEmpty(Target) Then
                Target(1, 13) = Empty
                Else
                    With Target(1, 13)
                        .Value = Date
                    End With
            End If
       End If
       If Not Intersect(Cell, Range("L5:L4000")) Is Nothing Then  'если изменененная ячейка попадает в диапазон L2
            If IsEmpty(Target) Then
                Target(1, 4) = Empty
                Else
                    With Target(1, 4)
                        .Value = Date
                    End With

            End If
        End If
        If Not Intersect(Cell, Range("L5:L4000")) Is Nothing Then  'если изменененная ячейка попадает в диапазон L2
              With Cell.Offset(0, 1)
                       Cell.Font.Color = RGB(112, 173, 71)
              End With
        End If
    Next Cell
End Sub

Для чего и какая была задача?!
Так как в макросах не разбераюсь скопировал ваш код и отредактировал на свой мотив согласно гайду и коментариям.
Задача состоит в том что при внесении в первую колонку таблицы появлялась дата в 13 или (М) колонке, и потом когда таблица редактирюется и при внисении даных в колонку номер 12 (или L) отображалась дата редактирования в колонке 15 (или О).
Этого добился так как все вопросы и ответы были заданы в этой статье и были даны ответы.

Но мне еще нужно чтобы после того как в колонке L введутся даные то весь текст в строке от A до P перекрасился в зеленый цвет. Искал на сайте, нашел похожую статью по дублям и окрасам но оно мне не подходит.

Были пробы сделать через
Rows.Font.Color = RGB(112, 173, 71) 
но оно красит все.


Подскажите пожалуйста что нужно вписать в последнем блоке чтобы решить мою задачу.
Большое спасибо за ответ.
16.02.2019 11:57:47
Добрый день. Я решил момент с заливкой строки при помощи правил форматирования ячейки. В правиле задается цвет ячейки и диапазон на который оно распространяется.
пример:
Использовать формулу для определения формата ячеек
=$A3=1
после создания правила задаём диапазон
=$B$3:$H$9
10.05.2019 14:11:33
Здравствуйте Николай. Не знаю кому как, а мне этот сайт реально помогает. Правда из за "кривоватости" моих рук приходится немного попотеть, но все, что я не пробовал, у меня все работает. Большое спасибо за проделанную работу. Я и дочкам своим скинул ссылку на сайт. Удачи в вашей работе.
S K
25.06.2019 10:07:24
Николай, добрый день!
Воспользовался Вашим макросом, работает шикарно! Пробовал всякие доработки, тоже все ОК!
Но не нашел момент который интересует больше всего.

Подскажите пожалуйста как быть?
Необходимо при изменении значения в одной ячейке (допустим E2), в зависимости от значения (Заказана, Принята, Выдана), дата проставлялась в столбцы F,G,H.
К сожалению с макросами на ВЫ, у самого умений не хватает доработать =(

Private Sub Worksheet_Change(ByVal Target As Range)
     
    For Each cell In Target   'проходим по всем измененным ячейкам
       If Not Intersect(cell, Range("E2:E10000")) Is Nothing And cell Like "Заказана*" Then  'если изменененная ячейка попадает в диапазон A2:A100
            With cell.Offset(0, 1)         'вводим в соседнюю справа ячейку дату
               .Value = Now
               .EntireColumn.AutoFit 'выполняем автоподбор ширины для столбца B, чтобы дата умещалась в ячейке
        If Not Intersect(cell, Range("E2:E10000")) Is Nothing And cell Like "Принята*" Then
                With cell.Offset(0, 2)         'вводим в соседнюю справа ячейку дату
               .Value = Now
               .EntireColumn.AutoFit 'выполняем автоподбор ширины для столбца B, чтобы дата умещалась в ячейке
        If Not Intersect(cell, Range("E2:E10000")) Is Nothing And cell Like "Выдана*" Then
                With cell.Offset(0, 3)         'вводим в соседнюю справа ячейку дату
               .Value = Now
               .EntireColumn.AutoFit 'выполняем автоподбор ширины для столбца B, чтобы дата умещалась в ячейке
            End With
       End If
    Next cell
End Sub
 
Попробовал сделать так, но не работает.
S K
25.06.2019 14:59:43
Еще посидел подумал и проблему одолел самостоятельно =)

У меня заработало как надо, вот с таким кодом:
Private Sub Worksheet_Change(ByVal Target As Range)
     
    For Each cell In Target   'проходим по всем измененным ячейкам
       If Not Intersect(cell, Range("E2:E10000")) Is Nothing And cell Like "Заказана*" Then  'если изменененная ячейка попадает в диапазон с условием
            With cell.Offset(0, 1)         'вводим в соседнюю справа ячейку дату
               .Value = Now
               .EntireColumn.AutoFit 'выполняем автоподбор ширины для столбца, чтобы дата умещалась в ячейке
             End With
       End If
       If Not Intersect(cell, Range("E2:E10000")) Is Nothing And cell Like "Принята*" Then  'если изменененная ячейка попадает в диапазон с условием
            With cell.Offset(0, 2)         'вводим в соседнюю справа ячейку дату
               .Value = Now
               .EntireColumn.AutoFit 'выполняем автоподбор ширины для столбца, чтобы дата умещалась в ячейке
             End With
       End If
       If Not Intersect(cell, Range("E2:E10000")) Is Nothing And cell Like "Выдана*" Then  'если изменененная ячейка попадает в диапазон с условием
            With cell.Offset(0, 3)         'вводим в соседнюю справа ячейку дату
               .Value = Now
               .EntireColumn.AutoFit 'выполняем автоподбор ширины для столбца, чтобы дата умещалась в ячейке
             End With
       End If
    Next cell
End Sub 
Спасибо сайту и Николаю в отдельности, за понятный материал и замечательный сайт!
20.08.2019 11:34:12
Подскажите, пожалуйста, как переписать данный скрипт только через function. Я не понимаю в программировании, просто очень нужен как раз такой скрипт только для Google таблицы.
И еще один вопрос, возможно ли такое, чтобы ячейка с датой, сразу блокировалась чтобы не могли уже внести изменения в строку?
08.10.2019 10:12:46
Здравствуйте, подскажите возможно ли изменить ваш макрос так что бы при изменении прежней ячейки дата вставлялась в соседнюю ячейку.
15.12.2019 15:05:52
Добрый день.
Думаю, неимоверно бесит отвечать на подобные вопросы. Но, на свой страх и риск.
Итак, возникла сложность со следующим:
мне необходимо задать диапазон для даты в определенной строке (в моем случае строка 5). Как это сделать корректно?
И второй вопрос. У нас условием внесения даты в определенную ячейку задано изменение в диапазоне, а может ли быть условием "внесение числа" в диапазон? Спасибо.
Вот то, что я попытался сделать (соответственно, с ошибкой)


Private Sub Worksheet_Change(ByVal Target As Range)
   
   For Each cell In Target
      If Not Intersect(cell, Range("C6:ZZ7, C9:ZZ10, C12:ZZ13")) Is Nothing Then
       If IsEmpty(Target) Then
           Range("5" & cell.Column) = Empty
           Else
               With Range("5" & cell.Column)
               .Value = Date
               End With
           End If
      End If
   Next cell
End Sub
13.01.2020 15:05:40
Добрый день, Николай
Спасибо Вам за ваш труд и полезную информацию.
Как  реализовать функцию (WORKDAY) в составе предложенного Вами макроса?
Что бы возвращалась не текущая дата,  ближайшего рабочего дня.
Мучаюсь над этим 3й день.
Заранее спасибо
26.01.2020 10:57:05
Подскажите в чем может быть проблема.
Вставил код  и получил ошибку (Перед оператором отсутствует точка с запятой. (строка 2, файл Код))
ругается на Private Sub Worksheet_Change(ByVal Target As Excel.Range)
из-за чего может быть ошибка??


function myFunction() {
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
}
24.02.2020 06:42:37
Вот у меня такой код получился.
Показывает дату и время записи с права от 1-го столбца и удаляется 8-)
Private Sub Worksheet_Change(ByVal Target As Range)
    
    For Each cell In Target   'проходим по всем измененным ячейкам
       If Not Intersect(cell, Range("A3:A1000" Is Nothing Then 'если изменененная ячейка попадает в диапазон A2:A1000
        If IsEmpty(Target) Then 'проверяем на удаление информации
            Target(1, 2) = Empty 'усли пусто - тогда очистить дату
            Else ' иначе
                With Target(1, 2) 'в ячейку с указанным смещением
                .Value = Now 'ввести дату
                .EntireColumn.AutoFit
                End With
            End If
       End If
    Next cell 'к следующей ячейке
End Sub
24.02.2020 06:49:27
Вот такой код вышел
Показывает дату и время с права  в 1-й ячейке и удаляется

Private Sub Worksheet_Change(ByVal Target As Range)
    
    For Each cell In Target   'проходим по всем измененным ячейкам
       If Not Intersect(cell, Range("A3:A1000")) Is Nothing Then 'если изменененная ячейка попадает в диапазон A2:A1000
        If IsEmpty(Target) Then 'проверяем на удаление информации
            Target(1, 2) = Empty 'усли пусто - тогда очистить дату
            Else ' иначе
                With Target(1, 2) 'в ячейку с указанным смещением
                .Value = Now 'ввести дату
                .EntireColumn.AutoFit
                End With
            End If
       End If
    Next cell 'к следующей ячейке
End Sub 
24.02.2020 21:50:43
Добрый день!
Действительно интересная и важная тема, потратил некоторое время, чтобы найти подходящие для себя варианты автоматической вставки даты.
К сожалению, макросы мне не подходят, но помимо них формулой это можно реализовать лишь с помощью итераций, что вредит другим вычислениям в книге: нашел такой вариант (если в А1 вводится текст, то в В1 подтверждается дата):
=ЕСЛИ(A1<>"";ЕСЛИ(B1="";СЕГОДНЯ();B1);"") 
Однако для себя решил применить более банальный и менее красивый способ, так как целевая книга - некоторое подобие дневника, где данные вводятся вручную: введение даты с помощью Ctrl+; с подсказкой об этой комбинации при выборе ячейки.
Так как комбинацией дата вводится "откуда-то из системы", но вставляется не как формула либо макрос, а сразу как данные, и не подлежит изменению, как СЕГОДНЯ(), мне стала интересна природа этой комбинации "под капотом".
Является ли приведенный в приеме макрос реализацией данной комбинации клавиш, или природа ее иная? Если так, то можно ли ее воспроизвести без макроса?
Прошу помочь разобраться автора либо знатоков.
14.03.2020 13:17:55
Подскажите пожалуйста как изменить макрос(что добавить в формулу) чтобы дата отображалась не только во втором столбце а в нескольких столбцах (допустим во втором и пятом столбце) ???

Private Sub Worksheet_Change(ByVal Target As Range)
   
   For Each cell In Target  
      If Not Intersect(cell, Range("A3:A10000";) Is Nothing Then  A2:A1000
       If IsEmpty(Target) Then
           Target(1, 2) = Empty
           Else
               With Target(1, 2)
               .Value = Date
               .EntireColumn.AutoFit
               End With
           End If
      End If
   Next cell
End Sub
Страницы: 1  2  3  4  5  6  
Наверх