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

Предположим, у нас имеется таблица заказов, куда пользователь вводит номер заказа, имя клиента, сумму и т.д. Необходимо сделать так, чтобы при внесении номера заказа в столбец А - в столбце 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  
08.08.2014 23:51:32
Здравствуйте, все что делается макросом , красиво, классно, спасибо, а как это сделать формулами, потому что в андроиде макросы не работают. Спасибо
09.08.2014 17:06:05
Анатолий, а где вы Excel для Андроида нашли?
18.08.2014 15:45:27
Доброго времени суток, Николай! Большое спасибо за такой чудесный сайт! У меня возник вопрос: макрос работает, но только лишь когда нужное слово будет написано в ячейке пользователем. У меня же эта ячейка зависит от другой (используется функция ЕСЛИ), и если в ячейке автоматически меняется слово на нужное, макрос его не видит. Можно ли что-нибудь сделать в данной ситуации? Заранее благодарю.
31.08.2014 22:33:32
Добрый вечер, полезная статья, вот только хотелось бы дополнить все это дело. Я пытался к макросу, написанному автору, как-то из комментариев дополнить его следующими вещами:
1) Добавить возможность при удалении данных из строки удалить и дату в соответствующей строке, получалось сделать через следующую конструкцию:
If IsEmpty(Target) Then
     Target(1, 2) = Empty 
2) При изменении текста в столбце не изменять дату и время (также актуально при изменении таблицы, тут многие спрашивали про такой момент). По этому вопросу писали в 1 комментарии и писал Николай целый код:

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,1)="" Then
          With Target.Offset(0, 1)
           .Value = Now
           .EntireColumn.AutoFit
          End With
    End If
    Next cell
End Sub
 
И все бы ничего и вроде как работает, НО, у меня данные идут так, что дата в столбце А, а вносимые данные в столбце В и при изменении оператора
 Target.Offset (0,1)
единичку на "-1" - макрос вроде как работает, не изменяет дату при изменении ячейки В столбца, но выдает ошибку 1004 каждый раз, когда добавляется новое значение в новой строке и при нажатии на кнопку "Debug" подчеркивает 3 и 4 строки....
В общем у меня на данном этапе получилось "собрать" следующее:
Private Sub Worksheet_Change(ByVal Target As Range)
    For Each cell In Target
    If Not Intersect(cell, Range("B:B") ) Is Nothing And _
    Target.Offset(1, 0) = "" Then
      If IsEmpty(Target) Then
      Target(1, 0) = Empty
Else
     With Target(1, 0)
     .Value = Now
     .EntireColumn.AutoFit
     End With
End If
    End If
    Next cell
End Sub
Вроде бы все хорошо работает, но есть недостатки:
а) Удаляет дату только при удалении последней строки (если удалить, например, строчку предпоследнюю, то дата сохранится в столбце А);
б) Аналогично изменение даты - если последняя строка - то при изменении данных меняется и дата в ячейке А.

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

Также еще искал, как эти возможности (удаление в ячейке данных и даты к ней + изменение ячейки данных без изменения даты к ней) "приклеить" к этому макросу:
Private Sub Worksheet_Change(ByVal Target As Range)   
    For Each cell in Target   'проходим по всем измененным ячейкам
    If Not Intersect(cell, Range("D:D")) Is Nothing Then  
      With Range("A" & cell.row)
         .Value = Now
         .EntireColumn.AutoFit  
      End With
    End If
    Next cell
End Sub 
Здесь не получилось ничего добавить, выдает ошибку либо ничего не происходит вообще...

В VBA не силен, но уж больна нравится идея и возможности ее воплощения. Если кто подскажет что и как дописать, буду премного благодарен!
02.09.2014 05:43:29
Николай, подскажите валенку - нужно чтобы текущая дата вставлялась над любой ячейкой, если в ней меняется значение. Заранее благодарен.
03.09.2014 16:47:47
Будет примерно такой код:
Private Sub Worksheet_Change(ByVal Target As Range)
       On Error Resume Next
       Application.EnableEvents = False
       Target.Offset(-1, 0).Value = Date
       Application.EnableEvents = True
End Sub
03.09.2014 17:38:00
Спасибо огромное:) все работает
11.09.2014 14:50:44
Макрос супер!!! Внимательно прочитал все коментарии, но не нашел ответ на вопрос который меня волнует.
Как откоректировать макрос чтобы дата изменялась при изменении ячейки в которой находится формула? Для меня критично.
Спасибо большое за ответ.
Так как в програмировании я полный ноль прошу показать полный код.
Спасибо большое!!! Вы меня очень выручите. Я давно являюсь фаном сайта.
11.09.2014 16:45:42
Все... ничего не нашел. Какие то варианты были но я не смог их адаптировать. Жду с нетерпением .
11.09.2014 19:30:37
Например нижеприведенный. Минусы- при изменении ячейки с данными дата меняет значение только  если ячейка пустая и проставляется одинаковая для всего диапазана. Мне нужна такая же работа как в Вашем Николай макросе - изменяется ячейка с датой только если изменено значение согласно формулы . Пытался комбинировать но без понимания нет результата...
Private Sub Worksheet_Calculate()
Dim target As Range
Dim Cell As Variant

Set target = Range("A3:A100")
For Each Cell In target.Cells
    If Cell.Offset(0, 1).Value = "" Then
     Cell.Offset(0, 1) = Date
     Cell.Offset(, 2) = Format(Now, "hh:nn")
    End If
Next Cell

End Sub
 
03.10.2014 15:00:32
Николай, подскажите, а можно в макрос вставить функцию округления даты (т.е. без времени), мне это необходимо, т.к. полученная дата далее влияет на выполнение следующей функции, при условии что даты абсолютно равны. А из-за разного времени это условие не выполняется.
Буду благодарна за ответ.
03.10.2014 18:21:00
Дарья, просто вместо Now напишите Date - и все будет ОК :)
подскажите пожалуйста что я делаю не правильно
вот макрос
Private Sub Worksheet_Change(ByVal Target As Range)
For Each cell In Target
If cell <> "" Then
If Not Intersect(cell, Range("E3:E151,H3:H151,K3:K151,N3:N151,Q3:Q151,T3:T151,W3:W151,Z3:Z151,AC3:AC151,AF3:AF151,AI3:AI151,AL3:AL151,AO3:AO151,AR3:AR151,AU3:AU151,AX3:AX151,BA3:BA151,BD3:BD151,BG3:BG151,BJ3:BJ151,BM3:BM151,BP3:BP151,BS3:BS151,BV3:BV151,BY3:BY151,CB3:CB151,CE3:CE151" ;) ) Is Nothing Then
With cell.Offset(0, 2)
.Value = Now
.EntireColumn.AutoFit
End With
End If
End If
Next cell
End Sub

В строку "If Not Intersect(cell, Range" вставив еще пару столбико выскакивает ошибка, и строка выделяться жёлтым
08.11.2014 22:35:13
Прошу помочь и мне. У меня в документе работает два макроса. Один вышеперечисленный, второй вот такой, который выполняется при нажатии кнопки.

Sub Сохранение()

'ActiveSheet.Unprotect Password:="qawsed" 'снятие защиты изменения
    Range("B4:I4").Select
        Range(Selection, Selection.End(xlDown)).Select
           Sheets("База").Select
            'ActiveSheet.Unprotect Password:="qawsed"
    Sheets("Шахматка").Select
    Selection.Copy
    Sheets("База").Select
    Range("B2").Select
      Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
        Columns("A:I").Select
    Selection.Locked = True
    Selection.FormulaHidden = False
       'ActiveSheet.Protect Password:="qawsed" 'активация защиты
        Sheets("Шахматка").Select
            'ActiveSheet.Unprotect Password:="qawsed"
   Rows("4:254").Select
    Selection.Delete Shift:=xlUp
    'Здесь нужно остановить "Privat Sub
    'ActiveSheet.Unprotect Password:="qawsed"
    Sheets("Data").Select
       Range("D1:K250").Select
               Selection.Copy
         Sheets("Шахматка").Select
         Range("A4").Select
         ActiveSheet.Paste
    'ActiveSheet.Protect Password:="qawsed" 'активация защиты
    'А здесь снова включить
End Sub
 
Суть в том, что данный макрос подразумевает копирование данных с одного листа "Шахматка" на другой "Data" с последующим удалением всех данных на первом. Дело в том, что на этом листе есть формулы, которые удаляются вместе со всем, что не есть гуд. Вариантом решения стало создание копии листа "Шахматка" и копирование всего после удаления. Проблема в том, что после копирования ставятся даты на всех строках.
Можно как-то остановить выполнение макроса темы, а после всех операций удаления/копирования, снова включить.
P.S. Возможно мой макрос не идеальный, поэтому прошу отнестись снисходительно.
Заранее благодарю.
09.11.2014 01:09:34
Используйте команды Application.EnableEvents=False, чтобы отключить временно макрос и, соответственно, Application.EnableEvents=True, чтобы потом обратно его включить.
18.11.2014 13:40:09
Извините, что сразу не отписался. Все отлично работает. Спасибо.
24.11.2014 16:11:37
Здравствуйте еще раз. Не нашел нужной темы на форуме, вернее нашел, но она в архиве и я не могу туда попасть. Спрошу здесь, если можно.
Вопрос такого плана: дата вставляется в формате dd.mm.yy hh:mm Затем нужно фильтровать данные по нескольким параметрам с помощью макроса. Условие отбора вводится в UserForm, TextBox.  Вот фрагмент кода

      iCriteria1 = ">=" & Format(Me.TextBox1.Text, "#")
                iCriteria2 = "<=" & Format(Me.TextBox2.Text, "#")
                Range("A1").AutoFilter Field:=2, Criteria1:=iCriteria1, Operator:=xlAnd, Criteria2:=iCriteria2 

 
не работает
Пробовал так

  Range("A1").AutoFilter Field:=2, Criteria1:=">=TextBox1.Text", Operator:=xlAnd, Criteria2:="<=TextBox2.Text" 
тоже не работает. Выбирает все даты. Подразумеваю, что проблема в нестыковке форматов Дата/текст, но решить не получается. Буду признателен за помощь.
25.11.2014 14:27:46
Уточнение к предыдущему комментарию. Первый вариант работает, но если я пытаюсь вставить условие на игнорирование пустого значения
If TextBox1 <> "" Then
            ElseIf TextBox2 <> "" Then
                iCriteria1 = ">=" & Format(Me.TextBox1.Text, "#")
                iCriteria2 = "<=" & Format(Me.TextBox2.Text, "#")
                  Range("A1").AutoFilter Field:=2, Criteria1:=iCriteria1, Operator:=xlAnd, Criteria2:=iCriteria 
            End If
 
т. е. чтобы пропускал отбор по дате, если TextBox1 и TextBox2 пустые, тогда перестает работать.
25.11.2014 16:03:14
Все. Проблему решил. Если кому интересно, пишите расскажу как.
10.01.2015 01:11:57
Здравствуйте, Николай!
ОБОЛДЕННЫЙ САЙТ!!!!!!!!
Мне очень помогает в роботе!!!!! СПАСИБО!!!!:);)8)

У меня один вопрос по поводу макросов вообще.....
Я выкладываю свою таблицу(уже с Вашими апгрейдами, макросами) на сервер(общий диск) и его должны на протяжении года заполнять мои сотрудники(с разных ПК). Вопрос: На сколько моему файлу или ПК(каждого сотрудника) грозит опасность если каждому сотруднику на ПК отключить "защиту" от поддержки макросов? (Windows 7).

P.S. Я не силен в Excel, все таблицы самоучно с Ваших уроков!!!!

Наперед благодарен за ответ!
10.01.2015 08:47:56
Спасибо за добрые слова, Виктор! Приятно слышать :)
Насчет вашего вопроса могу сказать, что у меня на всех моих компьютерах всегда была эта защита отключена и за последние 10 лет никаких макровирусов я не встречал. Антивирус-то у вас на компьютере полюбому уже есть, правильно?
13.01.2015 09:32:47
А можно, это реализовать без макроса? Формулой? Просто сам фаил находиться в облаке и открыт для совместного редактирования. А в таком режиме макросы не работают
16.01.2015 10:10:15
=ЕСЛИ(G1<>"";СЕГОДНЯ();"")

в столбце G построчно добавляешь записи, соседняя слева ячейка выпаливает "непустоты" и как только находит значение, в столбце F, рядом, вставляется дата.
19.01.2015 20:04:06
А как сделать так, чтобы после внесения дата и время больше не менялись? сейчас при открытие книги, дата меняется на текущую, а не остается той, что была при внесение данных.  
20.01.2015 02:13:35
Отличный вопрос!
Это было очевидно, что данные будут пересчитываться, но я об этом не задумывался и честно - удивился. :(
Сейчас попытаюсь найду решение этой проблемы и обязательно отпишусь!

*задумчиво нырнул в гугл*  
20.01.2015 07:25:33
Большое спасибо! Я со соей стороны тоже не буду сидеть и тоже ищу решение. Но если честно самый большой справочник по эксель - это данный ресурс
24.02.2015 17:28:49
Добрый день!
Возможно этот вопрос уже звучал, заранее прошу прощение за повтор.
Что необходимо подправить в моем макросе дабы:
1. столбец с датой и временем нельзя было редактировать (т.е. чтоб сотрудник, который заполняет инф., не мог "ручками" изменить время и дату);
2. при удалении информации в строке так же удалялась и дата/время.

Private Sub Worksheet_Change(ByVal Target As Range)
   
   For Each cell In Target
      If Not Intersect(cell, Range("A3:A1000000")) Is Nothing Then
           With cell.Offset(0, 17)
              .Value = Now
              .EntireColumn.AutoFit
           End With
      End If
   Next cell
End Sub
04.03.2015 06:44:55
Здравствуйте, Николай. Как сделать, чтобы в столбце B отображалась дата и время ввода в столбец A, а столбце D дата и время ввода в столбец С?
04.03.2015 08:38:48
Добрый день, Павел! Это уже спрашивали пару раз - посмотрите комменты выше.
11.03.2015 05:09:22
Вставил код в у себя в файле

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

Не работает, выдает ошибку
Run time 1004   Method Range of object Worksheet failed или вообще ничего не происходит
12.03.2015 13:44:40
Добрый день.
Макрос действительно очень полезный и удобный.
Большое спасибо.
Только есть несколько моментов, которые никак не могу реализовать:cry:.
Буду очень благодарен за помощь.

Таблица предназначена для двух групп пользователей, которые соответственно редактируют левую и правую часть таблицы отдельно:
первая вносит данные в колонку В, вторая группа в колонку К.
Следовательно, при заполнении пользователем первой группы ячейки колонки B,
появляется текущая дата и время в колонке F, а имя пользователя в колонке I,
далее,
при заполнении пользователем второй группы ячейки колонки K, появляется имя пользователя в колонке L, а дата и время в колонке M.

Никак не могу реализовать эти два условия в этом коде.
Помогите!!!

Private Sub Worksheet_Change(ByVal Target As Range)
   
   For Each cell In Target   'проходим по всем измененным ячейкам
If Not Intersect(cell, Range("B2:B100,K2:K100";) Is Nothing Then 'если изменененная ячейка попадает в диапазон A2:A100
With cell.Offset(0, 4) 'вводим в соседнюю справа ячейку дату
  .Value = Now
  .EntireColumn.AutoFit  'выполняем автоподбор ширины для столбца B, чтобы дата умещалась в ячейке
End With
cell.Offset(0, 7) = Application.UserName
cell.Offset(0, 1) = Application.UserName
End If
   Next cell
End Sub
11.04.2015 07:47:02
Присоединюсь ко всем - вышеписавшим: сайт спасает просто уйму времени и нервов. Огромное спасибо за помощь.

Зашла сюда с этой темы и хоть это и моветон, но повторюсь, так как из комментов выше так и не поняла, что сделать, что бы дата вставлялась не только при ручном изменении ячейки. Если это невозможно, просто напишите пожалуйста, и думаю, вопросов больше не будет.

У меня ячейка изменяется при помощи копирования или протягивания нумерации.
11.04.2015 11:41:02
Спасибо за макрос. Работает.

проблема в следующем : когда файл загружаю onedrive чтобы мой коллега одновременно мог работать над файлом ... вообщем не работает он через браузер.

Посоветуйте может как то изменить макрос чтобы работал на  onedrive? или посоветуйте другой способ редактирование екселя нескольким человекам одновременно .
05.05.2015 18:37:07
Здравствуйте, Николай!
Спасибо за пример.
Необходимо что бы не только из диапазона A но и из другого диапазона вставлялась дата в колонку B .

Спасибо
15.05.2015 10:10:56
Добрый день. Подскажите пожалуста как сделать чтобы день менялся не 24.00 а 8.00. И кроме даты в соседнем столбце появлялись порядковые номера. Спасибо.
01.06.2015 15:04:55
Добрый день.
Хочу выразить свою признательность автору за прекрасный интернет-ресурс. Спасибо !

Конечно же, "не просто так" я пишу свой комент :D и мне "что-то нужно"...
Макрос прекрасен и экономит кучу времени и нервов. Но, у меня возник вопрос в моём конкретном случае т.к. я совсем ни чего не понимаю в макросах. Ваш макрос записан в следующем виде...

Private Sub Worksheet_Change(ByVal Target As Range)

For Each cell In Target
 If Not Intersect(cell, Range("A6:A300")) Is Nothing Then
  With Range("C" & cell.Row)
   Application.Calculation = xlManual
   .Value = Now
     Application.Calculation = xlAutomatic
.EntireColumn.AutoFit
     End With
    End If
   Next cell
End Sub 

Использую "Умную таблицу" (Format as Table) и всё прекрасно работает без задержек, но есть маленький пунктик который нервирует моих пользователей таблицей - после заполнения полей в строке и нажатии "Tab", что-бы ввести новую строку, макрос естествено "определяет" изменения и тут же прописывает дату и время в колонку "С". Это от макроса и требуется, но только в процессе заполнения полей в "А"... Как мне устранить этот маленький недочёт ?!
Заранее благодарен.
11.06.2015 22:43:56
Здравствуйте.
Подскажите, как к описанному макросу добавить возможность при вводе нового значения в соседнем столбике считать временной интервал между введенным и предыдущим значениями (и при вводе первого значения в этом столбе ставить просто нулевой интервал)?
Страницы: 1  2  3  4  5  6  
Наверх