Excel макрос ввода даты

Функции для работы с датой и временем в VBA Excel. Синтаксис, параметры, спецсимволы, примеры. Функции, возвращающие текущие дату и время по системному таймеру.

Функция Date

Date – это функция, которая возвращает значение текущей системной даты. Тип возвращаемого значения – Variant/Date.

Синтаксис

Пример

Sub PrimerDate()

    MsgBox «Сегодня: « & Date

End Sub

Функция DateAdd

DateAdd – это функция, которая возвращает результат прибавления к дате указанного интервала времени. Тип возвращаемого значения – Variant/Date.

Синтаксис

DateAdd(interval, number, date)

Параметры

Параметр Описание
interval Обязательный параметр. Строковое выражение из спецсимволов, представляющее интервал времени, который требуется добавить.
number Обязательный параметр. Числовое выражение, задающее количество интервалов, которые необходимо добавить. Может быть как положительным (возвращается будущая дата), так и отрицательным (возвращается предыдущая дата).
date Обязательный параметр. Значение типа Variant/Date или литерал, представляющий дату, к которой должен быть добавлен интервал.

Таблицу аргументов (значений) параметра interval смотрите в параграфе «Приложение 1».

Примечание к таблице аргументов: три символа – y, d, w – указывают функции DateAdd на один день, который необходимо прибавить к исходной дате number раз.

Пример

Sub PrimerDateAdd()

    MsgBox «31.01.2021 + 1 месяц = « & DateAdd(«m», 1, «31.01.2021») ‘Результат: 28.02.2021

    MsgBox «Сегодня + 3 года = « & DateAdd(«yyyy», 3, Date)

    MsgBox «Сегодня — 2 недели = « & DateAdd(«ww», 2, Date)

    MsgBox «10:22:14 + 10 минут = « & DateAdd(«n», 10, «10:22:14») ‘Результат: 10:32:14

End Sub

Функция DateDiff

DateDiff – это функция, которая возвращает количество указанных интервалов времени между двумя датами. Тип возвращаемого значения – Variant/Long.

Синтаксис

DateDiff(interval, date1, date2, [firstdayofweek], [firstweekofyear])

Параметры

Параметр Описание
interval Обязательный параметр. Строковое выражение из спецсимволов, представляющее интервал времени, количество которых (интервалов) требуется вычислить между двумя датами.
date1, date2 Обязательные параметры. Значения типа Variant/Date, представляющие две даты, между которыми вычисляется количество указанных интервалов.
firstdayofweek Необязательный параметр. Константа, задающая первый день недели. По умолчанию – воскресенье.
firstweekofyear Необязательный параметр. Константа, задающая первую неделю года. По умолчанию – неделя, в которую входит 1 января.

Таблицу аргументов (значений) параметра interval смотрите в параграфе «Приложение 1».

Примечание к таблице аргументов: в отличие от функции DateAdd, в функции DateDiff спецсимвол "w", как и "ww", обозначает неделю. Но расчет осуществляется по разному. Подробнее об этом на сайте разработчиков.

Параметры firstdayofweek и firstweekofyear определяют правила расчета количества недель между датами.

Таблицы констант из коллекций firstdayofweek и firstweekofyear смотрите в параграфах «Приложение 2» и «Приложение 3».

Пример

Sub PrimerDateDiff()

‘Даже если между датами соседних лет разница 1 день,

‘DateDiff с интервалом «y» покажет разницу — 1 год

    MsgBox DateDiff(«y», «31.12.2020», «01.01.2021») ‘Результат: 1 год

    MsgBox DateDiff(«d», «31.12.2020», «01.01.2021») ‘Результат: 1 день

    MsgBox DateDiff(«n», «31.12.2020», «01.01.2021») ‘Результат: 1440 минут

    MsgBox «Полных лет с начала века = « & DateDiff(«y», «2000», Year(Now) 1)

End Sub

Функция DatePart

DatePart – это функция, которая возвращает указанную часть заданной даты. Тип возвращаемого значения – Variant/Integer.

Есть предупреждение по использованию этой функции.

Синтаксис

DatePart(interval, date, [firstdayofweek], [firstweekofyear])

Параметры

Параметр Описание
interval Обязательный параметр. Строковое выражение из спецсимволов, представляющее часть даты, которую требуется извлечь.
date Обязательные параметры. Значение типа Variant/Date, представляющее дату, часть которой следует извлечь.
firstdayofweek Необязательный параметр. Константа, задающая первый день недели. По умолчанию – воскресенье.
firstweekofyear Необязательный параметр. Константа, задающая первую неделю года. По умолчанию – неделя, в которую входит 1 января.

Таблицу аргументов (значений) параметра interval смотрите в параграфе «Приложение 1». В третьей графе этой таблицы указаны интервалы значений, возвращаемых функцией DatePart.

Таблицы констант из коллекций firstdayofweek и firstweekofyear смотрите в параграфах «Приложение 2» и «Приложение 3».

Пример

Sub PrimerDatePart()

    MsgBox DatePart(«y», «31.12.2020») ‘Результат: 366

    MsgBox DatePart(«yyyy», CDate(43685)) ‘Результат: 2019

    MsgBox DatePart(«n», CDate(43685.45345)) ‘Результат: 52

    MsgBox «День недели по счету сегодня = « & DatePart(«w», Now, vbMonday)

End Sub

Функция DateSerial

DateSerial – это функция, которая возвращает значение даты для указанного года, месяца и дня. Тип возвращаемого значения – Variant/Date.

Синтаксис

DateSerial(year, month, day)

Параметры

Параметр Описание
year Обязательный параметр типа Integer. Числовое выражение, возвращающее значение от 100 до 9999 включительно.
month Обязательный параметр типа Integer. Числовое выражение, возвращающее любое значение (в пределах Integer), а не только от 1 до 12.*
day Обязательный параметр типа Integer. Числовое выражение, возвращающее любое значение (в пределах Integer), а не только от 1 до 31.*

* Функция DateSerial автоматически пересчитывает общее количество дней в полные месяцы и остаток, общее количество месяцев в полные годы и остаток (подробнее в примере).

Пример

Sub PrimerDateSerial()

    MsgBox DateSerial(2021, 2, 10) ‘Результат: 10.02.2020

    MsgBox DateSerial(2020, 1, 400) ‘Результат: 03.02.2021

End Sub

Разберем подробнее строку DateSerial(2020, 1, 400):

  • 400 дней = 366 дней + 31 день + 3 дня;
  • 366 дней = 1 год, так как по условию month:=1, значит февраль 2020 входит в расчет, а в нем – 29 дней;
  • 31 день = 1 месяц, так как сначала заполняется январь (по условию month:=1);
  • 3 дня – остаток.

В итоге получается:

DateSerial(2020+1, 1+1, 3) = DateSerial(2021, 2, 3)

Функция DateValue

DateValue – это функция, которая преобразует дату, указанную в виде строки, в значение типа Variant/Date (время игнорируется).

Синтаксис

Параметр date – строковое выражение, представляющее дату с 1 января 100 года по 31 декабря 9999 года.

Пример

Sub PrimerDateValue()

    MsgBox DateValue(«8 марта 2021») ‘Результат: 08.03.2021

    MsgBox DateValue(«17 мая 2021 0:59:15») ‘Результат: 17.05.2021

End Sub

Функция DateValue игнорирует время, указанное в преобразуемой строке, но если время указано в некорректном виде (например, «10:60:60»), будет сгенерирована ошибка.

Функция Day

Day – это функция, которая возвращает день месяца в виде числа от 1 до 31 включительно. Тип возвращаемого значения – Variant/Integer.

Синтаксис

Параметр date – любое числовое или строковое выражение, представляющее дату.

Пример

Sub PrimerDay()

    MsgBox Day(Now)

End Sub

Функция IsDate

IsDate – это функция, которая возвращает True, если выражение является датой или распознается как допустимое значение даты или времени. В остальных случаях возвращается значение False.

Синтаксис

Параметр expression – это переменная, возвращающая дату или строковое выражение, распознаваемое как дата или время.

Значение, возвращаемое переменной expression, не должно выходить из диапазона допустимых дат: от 1 января 100 года до 31 декабря 9999 года (для Windows).

Пример

Sub PrimerIsDate()

    MsgBox IsDate(«18 апреля 2021») ‘Результат: True

    MsgBox IsDate(«31 февраля 2021») ‘Результат: False

    MsgBox IsDate(«4.10.20 11:12:54») ‘Результат: True

End Sub

Функция Hour

Hour – это функция, которая возвращает количество часов в виде числа от 0 до 23 включительно. Тип возвращаемого значения – Variant/Integer.

Синтаксис

Параметр time – любое числовое или строковое выражение, представляющее время.

Пример

Sub PrimerHour()

    MsgBox Hour(Now)

    MsgBox Hour(«22:36:54»)

End Sub

Функция Minute

Minute – это функция, которая возвращает количество минут в виде числа от 0 до 59 включительно. Тип возвращаемого значения – Variant/Integer.

Синтаксис

Параметр time – любое числовое или строковое выражение, представляющее время.

Пример

Sub PrimerMinute()

    MsgBox Minute(Now)

    MsgBox Minute(«22:36:54»)

End Sub

Функция Month

Month – это функция, которая возвращает день месяца в виде числа от 1 до 12 включительно. Тип возвращаемого значения – Variant/Integer.

Синтаксис

Параметр date – любое числовое или строковое выражение, представляющее дату.

Пример

Sub PrimerMonth()

    MsgBox Month(Now)

End Sub

Функция MonthName

MonthName – это функция, которая возвращает название месяца в виде строки.

Синтаксис

MonthName(month, [abbreviate])

Параметры

Параметр Описание
month Обязательный параметр. Числовое обозначение месяца от 1 до 12 включительно.
abbreviate Необязательный параметр. Логическое значение: True – возвращается сокращенное название месяца, False (по умолчанию) – название месяца не сокращается.

Пример

Sub PrimerMonthName()

    MsgBox MonthName(10) ‘Результат: Октябрь

    MsgBox MonthName(10, True) ‘Результат: окт

End Sub

Функция Now

Now – это функция, которая возвращает текущую системную дату и время. Тип возвращаемого значения – Variant/Date.

Синтаксис

Пример

Sub PrimerNow()

    MsgBox Now

    MsgBox Day(Now)

    MsgBox Hour(Now)

End Sub

Функция Second

Second – это функция, которая возвращает количество секунд в виде числа от 0 до 59 включительно. Тип возвращаемого значения – Variant/Integer.

Синтаксис

Параметр time – любое числовое или строковое выражение, представляющее время.

Пример

Sub PrimerSecond()

    MsgBox Second(Now)

    MsgBox Second(«22:30:14»)

End Sub

Функция Time

Time – это функция, которая возвращает значение текущего системного времени. Тип возвращаемого значения – Variant/Date.

Синтаксис

Пример

Sub PrimerTime()

    MsgBox «Текущее время: « & Time

End Sub

Функция TimeSerial

TimeSerial – это функция, которая возвращает значение времени для указанного часа, минуты и секунды. Тип возвращаемого значения – Variant/Date.

Синтаксис

TimeSerial(hour, minute, second)

Параметры

Параметр Описание
hour Обязательный параметр типа Integer. Числовое выражение, возвращающее значение от 0 до 23 включительно.
minute Обязательный параметр типа Integer. Числовое выражение, возвращающее любое значение (в пределах Integer), а не только от 0 до 59.*
second Обязательный параметр типа Integer. Числовое выражение, возвращающее любое значение (в пределах Integer), а не только от 0 до 59.*

* Функция TimeSerial автоматически пересчитывает общее количество секунд в полные минуты и остаток, общее количество минут в полные часы и остаток (подробнее в примере).

Пример

Sub PrimerTime()

    MsgBox TimeSerial(5, 16, 4) ‘Результат: 5:16:04

    MsgBox TimeSerial(5, 75, 158) ‘Результат: 6:17:38

End Sub

Разберем подробнее строку TimeSerial(5, 75, 158):

  • 158 секунд = 120 секунд (2 минуты) + 38 секунд;
  • 75 минут = 60 минут (1 час) + 15 минут.

В итоге получается:

TimeSerial(5+1, 15+2, 38) = TimeSerial(6, 17, 38)

Функция TimeValue

TimeValue – это функция, которая преобразует время, указанное в виде строки, в значение типа Variant/Date (дата игнорируется).

Синтаксис

Параметр time – строковое выражение, представляющее время с 0:00:00 по 23:59:59 включительно.

Пример

Sub PrimerTimeValue()

    MsgBox TimeValue(«6:45:37 PM») ‘Результат: 18:45:37

    MsgBox TimeValue(«17 мая 2021 3:59:15 AM») ‘Результат: 3:59:15

End Sub

Функция TimeValue игнорирует дату, указанную в преобразуемой строке, но если дата указана в некорректном виде (например, «30.02.2021»), будет сгенерирована ошибка.

Функция Weekday

Weekday – это функция, которая возвращает день недели в виде числа от 1 до 7 включительно. Тип возвращаемого значения – Variant/Integer.

Синтаксис

Weekday(date, [firstdayofweek])

Параметры

Параметр Описание
date Обязательный параметр. Любое выражение (числовое, строковое), отображающее дату.
firstdayofweek Константа, задающая первый день недели. По умолчанию – воскресенье.

Таблицу констант из коллекции firstdayofweek смотрите в параграфе «Приложение 2».

Пример

Sub PrimerWeekday()

    MsgBox Weekday(«23 апреля 2021», vbMonday) ‘Результат: 5

    MsgBox Weekday(202125, vbMonday) ‘Результат: 6

End Sub

Функция WeekdayName

WeekdayName – это функция, которая возвращает название дня недели в виде строки.

Синтаксис

WeekdayName(weekday, [abbreviate], [firstdayofweek])

Параметры

Параметр Описание
weekday Обязательный параметр. Числовое обозначение дня недели от 1 до 7 включительно.
abbreviate Необязательный параметр. Логическое значение: True – возвращается сокращенное название дня недели, False (по умолчанию) – название дня недели не сокращается.
firstdayofweek Константа, задающая первый день недели. По умолчанию – воскресенье.

Таблицу констант из коллекции firstdayofweek смотрите в параграфе «Приложение 2».

Пример

Sub PrimerWeekdayName()

    MsgBox WeekdayName(3, True, vbMonday) ‘Результат: Ср

    MsgBox WeekdayName(3, , vbMonday) ‘Результат: среда

    MsgBox WeekdayName(Weekday(Now, vbMonday), , vbMonday)

End Sub

Функция Year

Year – это функция, которая возвращает номер года в виде числа. Тип возвращаемого значения – Variant/Integer.

Синтаксис

Параметр date – любое числовое или строковое выражение, представляющее дату.

Пример

Sub PrimerYear()

    MsgBox Year(Now)

End Sub

Приложение 1

Таблица аргументов (значений) параметраinterval для функций DateAdd, DateDiff и DatePart:

Аргумент Описание Интервал значений
yyyy Год 100 – 9999
q Квартал 1 – 4
m Месяц 1 – 12
y День года 1 – 366
d День месяца 1 – 31
w День недели 1 – 7
ww Неделя 1 – 53
h Часы 0 – 23
n Минуты 0 – 59
s Секунды 0 – 59

В третьей графе этой таблицы указаны интервалы значений, возвращаемых функцией DatePart.

Приложение 2

Константы из коллекции firstdayofweek:

Константа Значение Описание
vbUseSystem 0 Используются системные настройки
vbSunday 1 Воскресенье (по умолчанию)
vbMonday 2 Понедельник
vbTuesday 3 Вторник
vbWednesday 4 Среда
vbThursday 5 Четверг
vbFriday 6 Пятница
vbSaturday 7 Суббота

Приложение 3

Константы из коллекции firstweekofyear:

Константа Значение Описание
vbUseSystem 0 Используются системные настройки.
vbFirstJan1 1 Неделя, в которую входит 1 января (по умолчанию).
vbFirstFourDays 2 Неделя, в которую входит не менее четырех дней нового года.
vbFirstFullWeek 3 Первая полная неделя года.

Информация о материале
Категория: Макросы Excel

Опубликовано: 25 сентября 2013

Многие ведут реестры учета всевозможных документов в таблицах Excel, проставляя в них даты различных этапов согласования и подписания. При этом не все знают, что ввести текущую дату в ячейку Excel можно нажатием сочетания горячих клавиш. Кроме того, для этой же цели можно использовать макрос VBA.

Для быстрого ввода текущей даты в ячейку предусмотрено стандартное средство Excel — нажатие сочетания горячих клавиш Ctrl+; (либо Ctrl+Ж, кому как удобнее запомнить). В случае, если кому-то такое сочетание клавиш не вполне удобно, то можно сохранить в личной книге макросов процедуру (код которой приведен ниже) и закрепить ее за более удобным сочетанием клавиш, например Ctrl+d (о том как это сделать можно прочитать подробнее), а для того чтобы это сочетание срабатывало независимо от раскладки клавиатуры, можно сохранить не одну, а две идентичных процедуры и привязать их к разным сочетаниям клавиш, например одну к Ctrl+d, а другую к Ctrl+в. 

Sub InsertDate()
' Вставка текущей даты в активную ячейку
' Сочетание клавиш: Ctrl+d
    ActiveCell.Value = Format(Now, "dd.mm.yyyy")
End Sub
'-------------------------------------------------------
Sub Вставка_Даты()
' Вставка текущей даты в активную ячейку
' Сочетание клавиш: Ctrl+в
    ActiveCell.Value = Format(Now, "dd.mm.yyyy")
End Sub

Для того чтобы текущая дата вставлялась не только в активную ячейку, но и во все выделенные ячейки, достаточно добавить цикл в программный код.

Sub InsertDate()
' Вставка текущей даты в активную ячейку
' Сочетание клавиш: Ctrl+d
    for each Cell in Selection    
        Cell.Value = Format(Now, "dd.mm.yyyy")
    Next
End Sub
'-------------------------------------------------------
Sub Вставка_Даты()
' Вставка текущей даты в активную ячейку
' Сочетание клавиш: Ctrl+в
    for each Cell in Selection
        Cell.Value = Format(Now, "dd.mm.yyyy")
    Next
End Sub

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

Другие материалы по теме:

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

Предположим, у нас имеется таблица заказов, куда пользователь вводит номер заказа, имя клиента, сумму и т.д. Необходимо сделать так, чтобы при внесении номера заказа в столбец А — в столбце 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. В соседней ячейке тут же появится текущая дата-время!

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

  • Как сделать выпадающий календарь для быстрого ввода любой даты мышью в любую ячейку.
  • Как Excel работает с датами
  • Что такое макрос, как он работает, куда копировать текст макроса, как запустить макрос?

0 / 0 / 0

Регистрация: 10.11.2011

Сообщений: 6

1

10.11.2011, 10:10. Показов 30342. Ответов 27


Студворк — интернет-сервис помощи студентам

Всем доброго времени суток.
Такая вот задача:
при выборе значения из списка в одной ячейке таблицы — в другой ячейке должна появиться текущая дата. И самое главное — дата не должна больше изменяться, тк таблица редактируется в течение месяца.



0



0 / 0 / 0

Регистрация: 10.11.2011

Сообщений: 6

14.11.2011, 08:54

 [ТС]

2

Нет желающих помочь? Слишком сложно или наоборот?



0



Димит

90 / 37 / 14

Регистрация: 03.11.2010

Сообщений: 429

15.11.2011, 09:04

3

При изменении А1 в В1 появится дата, но если ячейка В1 пуста (т.е. первый раз).
Не знаю это ли нужно.

Visual Basic
1
2
3
4
5
6
7
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$A$1" Then
    If Target.Offset(0, 1).Value = "" Then
       Target.Offset(0, 1) = Date
    End If
End If
End Sub



1



0 / 0 / 0

Регистрация: 10.11.2011

Сообщений: 6

29.11.2011, 13:30

 [ТС]

4

Спасибо, Димит, что откликнулись!
Проблемму решили другим способом: «знакомые» помогли написать макрос вставки даты при нажатии кнопки «Дата». Но этот вариант тоже интересный.
Только объясните «чайнику» — у нас макрос запускается кнопкой, а как подключить данный макрос?
И еще макрос «найти» перестает работать при защите листа….



0



90 / 37 / 14

Регистрация: 03.11.2010

Сообщений: 429

30.11.2011, 10:36

5

Цитата
Сообщение от SOV1
Посмотреть сообщение

И еще макрос «найти» перестает работать при защите листа….

Могу только посоветовать изменить макрос или защиту.

Если Вы хотите воспользоваться моим кодом, то разместите его в модуле вашего листа. Он запускается на событие изменения листа, конкретно ячеки — А1.



0



0 / 0 / 0

Регистрация: 10.11.2011

Сообщений: 6

01.12.2011, 13:01

 [ТС]

6

Димит, ваш макрос очень даже оказался нужным, только не хватило нам тяму распространить его действие на весь столбец.
Помогите, плиз!



0



90 / 37 / 14

Регистрация: 03.11.2010

Сообщений: 429

05.12.2011, 08:12

7

Замените строку
If Target.Address = «$A$1» Then
на
If Target.Column = 1 Then
в данном случае 1 — это номер столбца, т.е. «А»



0



90 / 37 / 14

Регистрация: 03.11.2010

Сообщений: 429

05.12.2011, 08:12

8

Замените строку
If Target.Address = «$A$1» Then
на
If Target.Column = 1 Then
в данном случае 1 — это номер столбца, т.е. «А»



0



0 / 0 / 0

Регистрация: 10.11.2011

Сообщений: 6

05.12.2011, 08:44

 [ТС]

9

Огромное Вам спасибо, Димит.
И, чтобы закончить этот вопрос: как сориентировать макрос на определенный диапазон ячеек.
Напимер с А5 до А100? (просто в первых строках идет шапка таблицы…)



0



90 / 37 / 14

Регистрация: 03.11.2010

Сообщений: 429

05.12.2011, 12:34

10

ну можно добавить на ограничение по строкам, типа:
If Target.Column = 1 And Target.Row > 4 Then



0



SOV1

0 / 0 / 0

Регистрация: 10.11.2011

Сообщений: 6

07.12.2011, 04:52

 [ТС]

11

Димит, еще раз большое спасибо! Изначальная цель достигнута. Получилось следующее (может еще кому-нибудь пригодится): при появлении значения в столбце №7 в ячейках с 4 по 2000 и в столбце №13 в ячейках с 4 по 2000 — справа от этих ячеек появляется дата и больше не изменяется.

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column = 7 And Target.Row > 3 _
And Target.Row < 2000 Then
If Target.Offset(0, 0).Value = "да" Then
    If Target.Offset(0, 1).Value = "" Then
       Target.Offset(0, 1) = Date
    End If
     End If
End If
 
If Target.Column = 13 And Target.Row > 3 _
And Target.Row < 2000 Then
If Target.Offset(0, 0).Value = "да" Then
    If Target.Offset(0, 1).Value = "" Then
       Target.Offset(0, 1) = Date
    End If
     End If
End If
End Sub



0



0 / 0 / 0

Регистрация: 19.01.2012

Сообщений: 3

19.01.2012, 08:13

12

Товарищи, помогите пожалуйста!
Я абсолютно не знаю МVB но очень хачется сделать следующее:
при смене или появлении значения в 7-ом столбце в 6-ом отображалась дата ввода этого значения.
Надо чтоб работало это все со 2-ой строки.
Если не трудно объясните как это сделать от А до Я т.к. я не ориентируюсь совсем (( могу лишь макрос создать и то не работает почему-то ((
заранее спасибо!



0



Димит

90 / 37 / 14

Регистрация: 03.11.2010

Сообщений: 429

19.01.2012, 09:37

13

Visual Basic
1
2
3
4
5
Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Cells.Count = 1 And Target.Column = 7 And Target.Row > 1 Then
        Target.Offset(0, -1) = Date
    End If
End Sub

Ну обьяснять тут особо не чего
Макрос срабатывает на изменение одной ячейки в 7 столбце и строке 2 и дальше.
Макрос должен находится в модуле листа.



0



0 / 0 / 0

Регистрация: 19.01.2012

Сообщений: 3

19.01.2012, 14:29

14

Спасибо!!! ))
А это как? я просто совсем не в курсе ((
вот что мне надо сделать чтобы у меня в документе работало то, что вы написали выше ?
Извините за откровенную безграмотность в этом вопросе.



0



90 / 37 / 14

Регистрация: 03.11.2010

Сообщений: 429

19.01.2012, 15:24

15

1 откройте файл Excel
2 нажмите клавиши Alt+F11
3 в окне Project-VBAProject щёлкните 2 раза на имени листа, где находится Ваша таблица
4 скопируйте код и вставьте в основное поле редактора
5 сохраните файл и закройте редактор VBA
6 измените ячейку в 7 столбце и убедитесь в работе макроса



0



0 / 0 / 0

Регистрация: 19.01.2012

Сообщений: 3

20.01.2012, 04:38

16

Здравствуйте, все сделал по вашей инструкции и получилось =))) спасибо огрмное!!! очень помогло.



0



gera_vip

0 / 0 / 0

Регистрация: 13.06.2014

Сообщений: 5

17.06.2014, 18:36

17

Дабы не создавать новую тему, спрошу здесь.
Нашел код, который добавляет дату.

Visual Basic
1
2
3
4
5
6
7
8
9
10
Private Sub Worksheet_Change(ByVal Target As Range)
         For Each cell in Target   'проходим по всем измененным ячейкам
       If Not Intersect(cell, Range("A2:A1048576")) Is Nothing Then  'если измененная ячейка попадает в диапазон A2:A1048576
            With cell.Offset(0, 4)         'вводим в соседнюю справа ячейку дату (чем выше цифра, тем дальше ячейка)
               .Value = Date 'Дата
               .EntireColumn.AutoFit  'выполняем автоподбор ширины для столбца B, чтобы дата умещалась в ячейке
            End With
       End If
    Next cell
End Sub

Может ли кто-то подсказать, как его модернизировать, чтобы при удалении значения из колонки А, удалялась и дата. А то получается если в колонке А (даже пустой) нажать клавишу Del, то тоже происходит запись даты в соответствующий столбец.
А нужно время от времени очищать таблицу полностью.
Заранее спасибо!



0



gera_vip

0 / 0 / 0

Регистрация: 13.06.2014

Сообщений: 5

19.06.2014, 11:38

18

Помогли решить проблему!
Если кому-то пригодится:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
Private Sub Worksheet_Change(ByVal Target As Range)
    For Each cell In Target
        If cell <> "" Then
            If Not Intersect(cell, Range("W9:W3000")) Is Nothing Then
                With cell.Offset(0, -1)
                    .Value = Date
                    .EntireColumn.AutoFit
                End With
            End If
        End If
    Next cell
End Sub



0



0 / 0 / 0

Регистрация: 13.01.2020

Сообщений: 3

14.01.2020, 19:20

19

Добрый день,
Как реализовать функцию (WORKDAY) в составе предложенного выше макроса?
Что бы возвращалась не текущая дата, ближайшего рабочего дня.
Мучаюсь над этим 5й день.
Заранее спасибо



0



aequit

223 / 134 / 45

Регистрация: 08.09.2012

Сообщений: 283

Записей в блоге: 1

15.01.2020, 09:03

20

Wosmerkin,
Так используйте функцию WorkDay!

Сочинил функцию, учитывающие праздничные дни:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
Function fnСледующийРабочийДень(dДень As Date) As Date
    
    Dim dYYYY As String, arrПраздники()
    dYYYY = IIf(Day(dДень) = 31 And Month(dДень) = 12, Year(dДень + 1), Year(dДень))
        
    'Добавить праздничные (а также официальные нерабочие) дни при необходимости (после выхода официальных нормативных актов):
    arrПраздники = Array(CLng(CDate("01.01." & dYYYY)), CLng(CDate("02.01." & dYYYY)), CLng(CDate("03.01." & dYYYY)), CLng(CDate("04.01." & dYYYY)), CLng(CDate("05.01." & dYYYY)), _
    CLng(CDate("06.01." & dYYYY)), CLng(CDate("07.01." & dYYYY)), CLng(CDate("08.01." & dYYYY)), CLng(CDate("23.02." & dYYYY)), CLng(CDate("08.03." & dYYYY)), CLng(CDate("01.05." & dYYYY)), _
    CLng(CDate("09.05." & dYYYY)), CLng(CDate("12.06." & dYYYY)), CLng(CDate("04.11." & dYYYY)))
    
    fnСледующийРабочийДень = Format(Application.WorksheetFunction.WorkDay(DateValue(dДень), 1, arrПраздники), "dd.mm.yyyy")
    
End Function

Тестирование:

Visual Basic
1
2
3
4
5
6
Sub testday()
    Dim d As Date
    Dim wd As Date
    d = Range("A1") 'В ячейке тестируемая дата.
    wd = fnСледующийРабочийДень(d)
End Sub

Замените в коде выше

Visual Basic
1
.Value = Date

на

Visual Basic
1
.Value = fnСледующийРабочийДень(Date)



0



Помогите создать макрос, чтобы вводил теккущую дату в ячейке А1 при создании новой записи в ячейке В1. Что-то типа регистрационного журнала: ввожу фамилию в ячейку В1, автоматически  в ячейке А1 появляется текущая дата, при этом ячейка с датой должна быть защищена от редактирования. Спасибо!


Скажи мне, кудесник, любимец ба’гов…

Яндекс-деньги: 41001632713405
Webmoney: R289877159277; Z102172301748; E177867141995


_Boroda_, спасибо! И юмор Ваш тоже оценила! :). Еще просьба: возможно ли сделать так, чтобы после изменения содержимого ячеек они тоже автоматически защищались от редактирования?


Все то же самое, только вместо
Target.Offset(, -1).Validation
нужно
Target.Offset(, -1).Resize(, 2).Validation

см.приложение

Скажи мне, кудесник, любимец ба’гов…

Яндекс-деньги: 41001632713405
Webmoney: R289877159277; Z102172301748; E177867141995


А если в таблице не две колонки, а к примеру 15? и защитить их надо так же как и предыдущие? Защищать лист полностью неудобно, т.к. данные регулярно добавляются. И еще: если можно расшифруйте (просто пытаюсь разобраться) строчку из Вашего кода?
Target.Offset(, -1).Resize(, 2).Validation
Спасибо за помощь!!!


Target — ячейка, в которой производится изменение (столбец В)
Offset(, -1) — смещение от нее на один столбец влево (столбец А)
Resize(, 2) — изменение размера диапазона на 2 вправо от текущей ячейки (от А, получаем А:В)
Validation — проверка данных

Для 15 столбцов нужно
Resize(, 15)

Для произвольного кол-ва столбцов
n = Range(«A1»).CurrentRegion.Columns.Count
Resize(, n)

Скажи мне, кудесник, любимец ба’гов…

Яндекс-деньги: 41001632713405
Webmoney: R289877159277; Z102172301748; E177867141995


Что-то для 15 столбцов не выходит ничего :(  А можно ли вот к этому коду добавить такое условие, чтобы если в ячейке уже есть запись, то курсор в нее не ставиться, а переходит на след строку?

Private Sub Worksheet_Change(ByVal Target As Range)
  If Target.Column = 3 Then
    Cells(Target.Row, 2) = Format(Now(), "DD.MM.YYYY")
  End If
End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  If Target.Column = 2 Then Target.Offset(0, 1).Select
End Sub


Напутал немного с проверкой. Исправил.
Добавил условие — если в ячейке столбца В есть запись, то курсор перходит на следующую пустую запись в столбце В

Скажи мне, кудесник, любимец ба’гов…

Яндекс-деньги: 41001632713405
Webmoney: R289877159277; Z102172301748; E177867141995


СПАСИБО!!!! Если уж вы так терпеливы и добры, то сделайте пожалуйста, чтобы данное условие действовало не только на столбец В, но и на другие столбцы. И я буду за Ваш компьютер вечно Бога молить!


Желание дамы — закон. Ловите

Скажи мне, кудесник, любимец ба’гов…

Яндекс-деньги: 41001632713405
Webmoney: R289877159277; Z102172301748; E177867141995


_Boroda_, я Вам очень признательна! Мое навязчивое желание подчинить себе Excel исполняется :). Еще раз спасибо, надеюсь, что и в след. раз не откажете в помощи !!!


Пишите звоните приезжайте
Задавайте Ваши вопросы
Сами думать не забывайте
Ну а мы поможем чем сможем

Скажи мне, кудесник, любимец ба’гов…

Яндекс-деньги: 41001632713405
Webmoney: R289877159277; Z102172301748; E177867141995


Цитата: _Boroda_ от 04.10.2009, 15:54
Пишите звоните приезжайте
Задавайте Ваши вопросы
Сами думать не забывайте
Ну а мы поможем чем сможем

Етот дивиз надо на знамя форума причепить! ;D

А по существу: Уважаемый _Boroda_! Посмотрел Вашу реализацию темы. Здорово, но есть одна заковыка, как только выделяю блок ячеек макрос «срубается».
Попробовал обоцти эту ситуацию:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Selection.Rows.Count > 1 Then
        If Selection.Columns.Count > 1 Then
            pointMnogo Target
        Else
            pointOdin Target
        End If
    Else
        If Selection.Columns.Count > 1 Then
            pointMnogo Target
        Else
            pointOdin Target
        End If
    End If
End Sub

Function pointOdin(targ As Range)
    If Selection <> "" Then targ.Offset(1).Select
End Function

Function pointMnogo(targ As Range)
    If targ.Cells.Text <> "" Then
        MsgBox "В выделенном блоке есть непустые ячейки!" & Chr(10) & _
               "Что с ними делать?", vbInformation + vbYesNoCancel, ""
    End If
End Function

— неполучается. Немогу определить есть ли в выделенном блоке непустые ячейки.

Туплю должно быть. Но все же помогите, если можно.
Заранее спасибо.

Путей к вершине — множество. Этот один из многих!


А если так:

Private Sub Worksheet_SelectionChange(ByVal Target As Range) 
     If WorksheetFunction.CountA(Selection) > 0 Then Selection.Range("a1").Offset(1).Select
End Sub

Скажи мне, кудесник, любимец ба’гов…

Яндекс-деньги: 41001632713405
Webmoney: R289877159277; Z102172301748; E177867141995


Здорово!
Большое спасибо!

А если требуется почистить данные, то я так понимаю, нужно войти с отключением работы макросов?

Путей к вершине — множество. Этот один из многих!


Выходит, что так.
Или можно в If добавить А65000<>1. А если поставить в А65000 единицу, то Selection.Range(«a1»).Offset(1).Select не работает и можно править данные

Скажи мне, кудесник, любимец ба’гов…

Яндекс-деньги: 41001632713405
Webmoney: R289877159277; Z102172301748; E177867141995


Не сочтите за флуд!

Или в любую другую ячейку, на этом листе или на любом другом в этой книге. Например на листе «Admin». Ведь подобная правка целесообразна и возможноразрешима только Администратору!? ;)

Путей к вершине — множество. Этот один из многих!


Добрый день!

Подскажите, пожалуйста. Если нужно сделать автоматическое проставление даты в столбце А, начиная с а4 и заканчивая а604, при внесении записей с b4 до b604, то в тексте программы делаю такую замену:
с

ЦитироватьIf Not Intersect(Target, [b:b]) Is Nothing Then

на

ЦитироватьIf Not Intersect(Target, Range («b4:b604»)) Is Nothing Then

верно?

если да, то почему после изменения текста, все равно не получается вручную изменить автоматически проставленную дату в b3, b2, b1?

Спасибо!


Не только
еще

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  If WorksheetFunction.CountA(Target) > 0 And Not Intersect(Target, [a4:b604]) Is Nothing Then Target.Range("a1").Offset(1).Select
End Sub

Скажи мне, кудесник, любимец ба’гов…

Яндекс-деньги: 41001632713405
Webmoney: R289877159277; Z102172301748; E177867141995


Спасибо!

Дело в том, что я воспользовался Вашим текстом из первых сообщений:

Private Sub Worksheet_Change(ByVal Target As Range)
On Error GoTo A
    If Not Intersect(Target, [b4:b604]) Is Nothing Then
    Target.Offset(, -1) = Date
    With Target.Offset(, -1).Validation
        .Delete
        .Add Type:=xlValidateCustom, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, Formula1:="=A3<>A3"
        .IgnoreBlank = True
        .InCellDropdown = True
        .InputTitle = ""
        .ErrorTitle = "Ошибка"
        .InputMessage = ""
        .ErrorMessage = "заполняется автоматически!"
        .ShowInput = True
        .ShowError = True
    End With
    End If
A: Exit Sub
End Sub

Работает, но у меня первые три строки — это названия столбцов таблицы и поэтому при редактировании названия столбца в А3 (или А1,А2) возникает ошибка «заполняется автоматически». Я только начал читать про VBA и не понимаю всех строк, но подозреваю, что нужно что-то изменить здесь «On Error GoTo A», либо здесь: «Formula1:=»=A3<>A3″». Буду признателен за помощь!)


Сделал сам. Правильным ли путем — не знаю))

Одного понять не могу, почему программа продолжала работать для ячеек заголовков столбцов, даже после удаления?


Цитата: _Boroda_ от 04.10.2009, 02:53
Примерно так:

_Boroda_, а подскажите плиз, что нужно добавить, чтобы при удалении значений из ячейки, дата тоже удалялась? (самый первый пример)
в VBA не силен :)
Спасибо!


Понравилась статья? Поделить с друзьями:
  • Excel макрос в модуль листа
  • Excel макрос активная строка
  • Excel макрос активировать ячейку
  • Excel макрос автоподбор высоты строки
  • Excel макрос автоматический запуск