Автоматическая вставка текущей даты в ячейку при вводе данных
Предположим, у нас имеется таблица заказов, куда пользователь вводит номер заказа, имя клиента, сумму и т.д. Необходимо сделать так, чтобы при внесении номера заказа в столбец А - в столбце B напротив введенного заказа автоматически появлялись дата и время его занесения:
Чтобы реализовать такой ввод даты, нам потребуется простой макрос, который надо добавить в модуль рабочего листа. Для этого щелкните правой кнопкой мыши по ярлычку листа с таблицей и выберите в контекстном меню команду Исходный текст (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. В соседней ячейке тут же появится текущая дата-время!
Ссылки по теме
- Как сделать выпадающий календарь для быстрого ввода любой даты мышью в любую ячейку.
- Как Excel работает с датами
- Что такое макрос, как он работает, куда копировать текст макроса, как запустить макрос?
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Например документ был сдан в архив 12 мая 2019 года срок хранения 1 год, хотелось бы чтобы ячейка с датой сообщала мне что срок подошел для изъятия документа, скажем выделялась красными или каким нибудь другим цветом.
Заранее благодарю.
Вот "нативная" формула автодаты для Exel / Libreofice Calc, которая работает без всяких макросов.
=ЕСЛИ(C1="";"";ЕСЛИ(B1="";ЕСЛИ(C1="";"";ТДАТА());B1))
В при заполнении ячейки С1 в ячейку B1 будет выставлена текущая дата / время.
При удалении С1, удалится и B1.
При изменении С1 ячейка B1 не изменяется.
Только необходимо открыть вкладки в LibreOffice: СЕРВИС - ПАРАМЕТРЫ - LibreOffice Calc - ВЫЧИСЛЕНИЯ - ЦИКЛИЧЕСКИЕ ССЫЛКИ и поставить галочку в ИТЕРАЦИИ.
В экселе тоже надо будет найти нечто, что отвечает за циклические ссылки и итерации и включить их, иначе будет выдавать ошибку.
И работают они только в режиме ручного пересчета.
Насчет LibreOffice - не скажу, не работал в нем практически
Давно борюсь с такой проблемой не хотел писать по пустякам но видимо придется.
Прошу помощи в...
Имею две проблемы, и две нерешенные формулы, кто может сталкивался или сможет помочь, а кому надо пожалуйста пользуйтесь 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Кому интересно, прописываем этот код после своего макроса, и вуаля
Next cell Worksheets("Лист1").EnableOutlining = True Worksheets("Лист1").Protect Password:="1", UserInterfaceOnly:=True End SubЧто необходимо сделать что бы таки работала автоматическая вставка даты в соседней графе при вводе или изменении ячейки?
И еще момент. Как сделать что бы дата не менялась каждый раз при обновлении страницы.
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И может стоит еще что то подправить в имеющемся коде, я просто вообще не понимаю ничего в этом.
Макрос отличный!
Но столкнулся с такой проблемой:
если данные ввожу через форму, то дата не появляется (ячейка остается пустой).
Подскажите пожалуйста, как сделать, чтобы текущая дата и время добавлялись автоматически при вводе данных через форму?
Заранее спасибо!
Совсем профан в VBA (((
Подскажите, а можно скорректировать код таким образом, чтобы дата проставлялась, если значение в ячейке соответствует условию. Например, в ячейке записана формула, при выполнении ряда критериев значение в ней автоматически меняется от "" до 5, можно ли сделать так, чтобы дата проставлялась автоматически если значение в ячейке становится в диапазоне от 1 до 5?
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%
п.с. я первый раз это делал, поэтому возможно всё не так как кажется )))
Макрос (вирусный) удаляется неохотно...
по вставке даты например мне надо при нажатии любой кнопки в столбике 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
расположив два макроса подряд выдаёт ошибку
для столбца например А и столбца например 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
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
.NumberFormat = "dd-mm-yyyy, hh:mm:ss" / не хочет выдавать нужную инфу
затупил:
.Value = Now
.NumberFormat = "dd-mm-yyyy, hh:mm:ss"
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 ячеек в одну. Этот код пытался править. Все попытки четны.
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
Что изменить или дописать в макрос, чтобы при удалении строки и удалялась дата в ячейке?