Автоматическая вставка текущей даты в ячейку при вводе данных
Предположим, у нас имеется таблица заказов, куда пользователь вводит номер заказа, имя клиента, сумму и т.д. Необходимо сделать так, чтобы при внесении номера заказа в столбец А - в столбце 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 работает с датами
- Что такое макрос, как он работает, куда копировать текст макроса, как запустить макрос?
- существует ячейка A1 процентом выполнения проекта,
- в соседней B1 нужно указать фиксированную дату выполнения проекта при достижении диапазона от 80 до 100%
Что надо поменять и возможно ли? Чтобы код просматривал изменения при копировании - вставке целого столбца?
Работает всё как надо при ручном изменении в ячейке, при вставке содержимого единичной ячейки. Не работает при вставке нескольких значений со столбца одновременно.
--------------------------------------------
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
----------------------------------------------
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
Подскажите, почему макрос не работает, когда включаешь защиту листа?
пишет ошибку Run time error 1004
Как можно это исправить? Очень надо, чтобы ставилась дата, когда меняется значение рядом в ячейке, но при этом, чтобы нельзя было ее поменять.
Спасибо.
прочитал много комеентариев к данной статье и возник вопрос более комплексного плана с вводом даты.
У меня есть таблица скажем из 3-х колонок A, B и С
колонка А2 = должна содержать неизменяемую дату при первичном внесении информации в В2 и не меняться после пересохранении файла
колонка С2 = должна выводить значение настоящего дня и времени при условии изменении В2
Возможно ли реализовать это на одном листе?
Спасибо заранее за помощь
Владислав
Спасибо вам за ваш труд, очень много полезной информации и примеров.
Воспользовался вашим макросом, нашёл пример на проверку вхождения слова:
Николай Павлов 07.05.2013 22:54:00
Можно добавить условие на проверку вхождения слова "Исправлено" в изменяемой ячейке в 4-й строке макроса:
If Not Intersect(cell, Range("A2:A100"
пытался доделать сам на проверку по нескольким словам (внесена, срочная от, отдана в работу), но к сожалению ни чего не получилось, знаний маловато.
Подскажите пожалуйста, как реализовать такой вариант.
После долгих ожиданий помощи и поисков решения в интернет, нашёл макрос который я думаю многим понравится.
СПАСИБО за то что Вы есть.
На основе вашей статьи и прочитаных коминтариев отредактировал код.
Для чего и какая была задача?!
Так как в макросах не разбераюсь скопировал ваш код и отредактировал на свой мотив согласно гайду и коментариям.
Задача состоит в том что при внесении в первую колонку таблицы появлялась дата в 13 или (М) колонке, и потом когда таблица редактирюется и при внисении даных в колонку номер 12 (или L) отображалась дата редактирования в колонке 15 (или О).
Этого добился так как все вопросы и ответы были заданы в этой статье и были даны ответы.
Но мне еще нужно чтобы после того как в колонке L введутся даные то весь текст в строке от A до P перекрасился в зеленый цвет. Искал на сайте, нашел похожую статью по дублям и окрасам но оно мне не подходит.
Были пробы сделать через
Подскажите пожалуйста что нужно вписать в последнем блоке чтобы решить мою задачу.
Большое спасибо за ответ.
пример:
Использовать формулу для определения формата ячеек
=$A3=1
после создания правила задаём диапазон
=$B$3:$H$9
Воспользовался Вашим макросом, работает шикарно! Пробовал всякие доработки, тоже все ОК!
Но не нашел момент который интересует больше всего.
Подскажите пожалуйста как быть?
Необходимо при изменении значения в одной ячейке (допустим E2), в зависимости от значения (Заказана, Принята, Выдана), дата проставлялась в столбцы F,G,H.
К сожалению с макросами на ВЫ, у самого умений не хватает доработать =(
У меня заработало как надо, вот с таким кодом:
И еще один вопрос, возможно ли такое, чтобы ячейка с датой, сразу блокировалась чтобы не могли уже внести изменения в строку?
Думаю, неимоверно бесит отвечать на подобные вопросы. Но, на свой страх и риск.
Итак, возникла сложность со следующим:
мне необходимо задать диапазон для даты в определенной строке (в моем случае строка 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
Спасибо Вам за ваш труд и полезную информацию.
Как реализовать функцию (WORKDAY) в составе предложенного Вами макроса?
Что бы возвращалась не текущая дата, ближайшего рабочего дня.
Мучаюсь над этим 3й день.
Заранее спасибо
Вставил код и получил ошибку (Перед оператором отсутствует точка с запятой. (строка 2, файл Код))
ругается на Private Sub Worksheet_Change(ByVal Target As Excel.Range)
из-за чего может быть ошибка??
Показывает дату и время записи с права от 1-го столбца и удаляется
Показывает дату и время с права в 1-й ячейке и удаляется
Действительно интересная и важная тема, потратил некоторое время, чтобы найти подходящие для себя варианты автоматической вставки даты.
К сожалению, макросы мне не подходят, но помимо них формулой это можно реализовать лишь с помощью итераций, что вредит другим вычислениям в книге: нашел такой вариант (если в А1 вводится текст, то в В1 подтверждается дата):
Так как комбинацией дата вводится "откуда-то из системы", но вставляется не как формула либо макрос, а сразу как данные, и не подлежит изменению, как СЕГОДНЯ(), мне стала интересна природа этой комбинации "под капотом".
Является ли приведенный в приеме макрос реализацией данной комбинации клавиш, или природа ее иная? Если так, то можно ли ее воспроизвести без макроса?
Прошу помочь разобраться автора либо знатоков.
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