Функции для работы с датой и временем в 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
Для того, чтобы перенести этот программный код на свой компьютер, наведите курсор мыши на поле с программным кодом, нажмите на одну из двух кнопкок в правом верхнем углу этого поля, скопируйте программный код и вставьте его в модуль проекта на своем компьютере (подробнее о том, как сохранить программный код макроса).
Другие материалы по теме:
Автоматическая вставка текущей даты в ячейку при вводе данных
Предположим, у нас имеется таблица заказов, куда пользователь вводит номер заказа, имя клиента, сумму и т.д. Необходимо сделать так, чтобы при внесении номера заказа в столбец А — в столбце 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 работает с датами
- Что такое макрос, как он работает, куда копировать текст макроса, как запустить макрос?
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 пуста (т.е. первый раз).
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 |
И еще макрос «найти» перестает работать при защите листа…. Могу только посоветовать изменить макрос или защиту. Если Вы хотите воспользоваться моим кодом, то разместите его в модуле вашего листа. Он запускается на событие изменения листа, конкретно ячеки — А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 |
Замените строку
0 |
90 / 37 / 14 Регистрация: 03.11.2010 Сообщений: 429 |
|
05.12.2011, 08:12 |
8 |
Замените строку
0 |
0 / 0 / 0 Регистрация: 10.11.2011 Сообщений: 6 |
|
05.12.2011, 08:44 [ТС] |
9 |
Огромное Вам спасибо, Димит.
0 |
90 / 37 / 14 Регистрация: 03.11.2010 Сообщений: 429 |
|
05.12.2011, 12:34 |
10 |
ну можно добавить на ограничение по строкам, типа:
0 |
SOV1 0 / 0 / 0 Регистрация: 10.11.2011 Сообщений: 6 |
||||
07.12.2011, 04:52 [ТС] |
11 |
|||
Димит, еще раз большое спасибо! Изначальная цель достигнута. Получилось следующее (может еще кому-нибудь пригодится): при появлении значения в столбце №7 в ячейках с 4 по 2000 и в столбце №13 в ячейках с 4 по 2000 — справа от этих ячеек появляется дата и больше не изменяется.
0 |
0 / 0 / 0 Регистрация: 19.01.2012 Сообщений: 3 |
|
19.01.2012, 08:13 |
12 |
Товарищи, помогите пожалуйста!
0 |
Димит 90 / 37 / 14 Регистрация: 03.11.2010 Сообщений: 429 |
||||
19.01.2012, 09:37 |
13 |
|||
Ну обьяснять тут особо не чего
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
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 |
|||
Дабы не создавать новую тему, спрошу здесь.
Может ли кто-то подсказать, как его модернизировать, чтобы при удалении значения из колонки А, удалялась и дата. А то получается если в колонке А (даже пустой) нажать клавишу Del, то тоже происходит запись даты в соответствующий столбец.
0 |
gera_vip 0 / 0 / 0 Регистрация: 13.06.2014 Сообщений: 5 |
||||
19.06.2014, 11:38 |
18 |
|||
Помогли решить проблему!
0 |
0 / 0 / 0 Регистрация: 13.01.2020 Сообщений: 3 |
|
14.01.2020, 19:20 |
19 |
Добрый день,
0 |
aequit 223 / 134 / 45 Регистрация: 08.09.2012 Сообщений: 283 Записей в блоге: 1 |
||||||||||||||||
15.01.2020, 09:03 |
20 |
|||||||||||||||
Wosmerkin, Сочинил функцию, учитывающие праздничные дни:
Тестирование:
Замените в коде выше
на
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
Пишите звоните приезжайте
Задавайте Ваши вопросы
Сами думать не забывайте
Ну а мы поможем чем сможем
Етот дивиз надо на знамя форума причепить!
А по существу: Уважаемый _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 не силен
Спасибо!