Excel макросы сравнить даты

 

Всем ДД.  
Маленький кусочек кода  
a = Range(«B4»)  
If a < «15.07.2005» Then  

  в «В4» число в формате даты 12.07.2005  
Как это правильно записать?  
и, заодно, какой тип задать переменной А?  
Dim A As ?  
Спасибо.

 

KuklP

Пользователь

Сообщений: 14868
Регистрация: 21.12.2012

E-mail и реквизиты в профиле.

Здравствуй, Миш.  
dim a as date  
a = Range(«B4»)  
If a < CDate(«15.07.2005») Then …

Я сам — дурнее всякого примера! …

 

Юрий М

Модератор

Сообщений: 60570
Регистрация: 14.09.2012

Контакты см. в профиле

ДВ! Тоже экономлю :-)  
Dim a as Date, b as Date  
А по первой части не очень понял — с датами обычная работа при сравнении (это ведь числа):  
If a < b Then

 

Немного не точно написал.    
a = Range(«B4:B6»)  
as date выдает ошибку… только as variant ?

 

Юрий М

Модератор

Сообщений: 60570
Регистрация: 14.09.2012

Контакты см. в профиле

Range(«B4:B6») — это уже диапазон :-) Что за данные там? Может файл?

 

KuklP

Пользователь

Сообщений: 14868
Регистрация: 21.12.2012

E-mail и реквизиты в профиле.

{quote}{login=Михаил}{date=28.02.2011 07:44}{thema=}{post}Немного не точно написал.    
a = Range(«B4:B6»)  
as date выдает ошибку… только as variant ?{/post}{/quote}  
Если указываешь диапазон,  то а будет массив значений. тогда циклом cdate(a(i)) сравнивай.

Я сам — дурнее всякого примера! …

 

В диапазоне только даты — (сам сейчас заполняю, автоподстановкой).  
Юр, ну можно, конечно, написать в коде    
If a < 46000 Then (например), но хочется, что б и наглядность была  
:)

 

KuklP

Пользователь

Сообщений: 14868
Регистрация: 21.12.2012

E-mail и реквизиты в профиле.

Вернее  
a(i,1)

Я сам — дурнее всякого примера! …

 

Про массив и цикл я понимаю. Просто не получалось сравнить  
А(2) > «01.03.2000» (к примеру)

 
 

Юрий М

Модератор

Сообщений: 60570
Регистрация: 14.09.2012

Контакты см. в профиле

{quote}{login=Михаил}{date=28.02.2011 07:51}{thema=}{post}Юр, ну можно, конечно, написать в коде    
If a < 46000 Then (например), но хочется, что б и наглядность была  
:){/post}{/quote}  
Про числа я совсем с другой стороны :-)  
В А1 — Сегодня  
If Range(«A1») < CDate(«01.03.2011») Then MsgBox «Меньше»

 

KuklP

Пользователь

Сообщений: 14868
Регистрация: 21.12.2012

E-mail и реквизиты в профиле.

Юра, Васмк представляет даты, как #12.07.2005#(можно увидеть в окне переменных). Вопрос, а как такой же формат использовать в коде? Не сталкивался? Собственно, вопрос не только к Юре. Если у кого мысли(или варианты) есть — давайте обсудим.

Я сам — дурнее всякого примера! …

 

KuklP

Пользователь

Сообщений: 14868
Регистрация: 21.12.2012

E-mail и реквизиты в профиле.

Флуд, конечно, глянул на три первые поста темы и мелькнуло — старперы собрались, доминошники(сам никогда ни в домино, ни в другие игры… мне интересны головоломки):-)  
С уважением, Сергей.

Я сам — дурнее всякого примера! …

 

Hugo

Пользователь

Сообщений: 23249
Регистрация: 22.12.2012

Привет, Сергей.  
Опередил меня, я точно такой код написал :)  
Я по поводу #12.07.2005#.  

  Dim a As Date, b As Date  
a = Range(«B4»)  
b = CDate(«15.07.2005»)  
If a < b Then MsgBox 1  

  Если так написать, то в Locals обе переменные одинаковы.

 

KuklP

Пользователь

Сообщений: 14868
Регистрация: 21.12.2012

E-mail и реквизиты в профиле.

{quote}{login=Hugo}{date=28.02.2011 08:32}{thema=}{post}Привет, Сергей.  
Опередил меня, я точно такой код написал :)…  
Я по поводу #12.07.2005#.  
{/post}{/quote}  
А кто сомневался:-)… А дальше? Как такой формат #12.07.2005# втюхать в код?

Я сам — дурнее всякого примера! …

 

Hugo

Пользователь

Сообщений: 23249
Регистрация: 22.12.2012

Не знаю… Я помню ту тему — тоже потыкался, так ничего не получилось…  
А здесь CDate(«15.07.2005»)=#15.07.2005#

 

Юрий М

Модератор

Сообщений: 60570
Регистрация: 14.09.2012

Контакты см. в профиле

Да, интересно… Вот, например, время я ввожу так:  
Public Const TimeStart = #12:00:00 AM#  
Т.е., решётка имеет место быть :-)

 

KuklP

Пользователь

Сообщений: 14868
Регистрация: 21.12.2012

E-mail и реквизиты в профиле.

{quote}{login=Юрий М}{date=28.02.2011 09:08}{thema=}{post}Да, интересно… Вот, например, время я ввожу так:  
Public Const TimeStart = #12:00:00 AM#  
Т.е., решётка имеет место быть :-){/post}{/quote}  
Ребят, да не парьтесь. Нет, так нет. Мы с вами легко решаем такие феньки без диезов. Т.е. дедушка Эксель прелагает  нам множество других путей.:-) Очень рад видеть вас на форуме!

Я сам — дурнее всякого примера! …

 

Kuzmich

Пользователь

Сообщений: 7998
Регистрация: 21.12.2012

Может быть так  
Dim d As Date  
Dim s As Single  
s=#1/3/2011#  
d=s

 

KuklP

Пользователь

Сообщений: 14868
Регистрация: 21.12.2012

E-mail и реквизиты в профиле.

Офигеть. Дело в разделителях. Какого же он в переменных показывает… Ну да, Locals… Kuzmich, спасибо! Короче, или никак, или с буржуйскими разделителями:-)

Я сам — дурнее всякого примера! …

 

Serge

Пользователь

Сообщений: 11308
Регистрация: 01.01.1970

{quote}{login=KukLP}{date=28.02.2011 09:15}{thema=Re: }{post}…дедушка Эксель прелагает  нам множество других путей…{/post}{/quote}Какой-же он дедушка, если ему только 26-й годик?

 

KuklP

Пользователь

Сообщений: 14868
Регистрация: 21.12.2012

E-mail и реквизиты в профиле.

Серег, все познается… А если сложить все года разработчиков, на него затраченные? Я помню еще Quattro, QuattroPro, Supercalc — где они сейчас? Так что Экс считаю уже умуденным сединами. И очень уважаю(можно даже сказать люблю). Думаю(зная тебя) и ты со мной спорить не станешь:-)

Я сам — дурнее всякого примера! …

 

Serge

Пользователь

Сообщений: 11308
Регистрация: 01.01.1970

Нет.  
Вопрос риторический был :-)

 

R Dmitry

Пользователь

Сообщений: 3103
Регистрация: 22.12.2012

Excel,MSSQL,Oracle,Qlik

#24

28.02.2011 23:54:10

ну и не забываем что формат всегда mm/dd/yyyy  

  :-)

Спасибо

Функции для работы с датой и временем в 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 Первая полная неделя года.

UPDATED WITH ANSWER: I found an answer to my question. I’ll place a simplified version below the original question here, just to make it easy, with a more detailed version below as the accepted answer.

I’m writing a VBA function to filter a pivot table by a date range entered by the user. For some reason, it is not returning the results expected.

The dates being compared are in two different date formats. The user-entered dates are in mmmm yyyy format (October 2013). When this value is pulled into the macro for comparison, it is translated correctly as 10/1/2013. The pivot table dates are in mmm yy format (Oct 13). When I call on this date with the code PivotItem.Value it seems to be translating the date as a string «Oct 13.»

I can’t quite figure out what the macro is doing, as it behaves somewhat erratically. If I run it for October 2011 to October 2013, it returns all months from Jan to September for every year, 2008, 2009, 2010, etc. If I run it for June 2013 to October 2013, it returns June to September for every year. Furthermore, in each example, the macro continues to run past the maximum range of data in the pivot table and gets an error. When I debug, the macro is trying to set the visibility to ‘true’ for a date that doesn’t even exist in the pivot table (IE for Jan 2014 when the data only goes through Oct 2013). No idea why that’s happening.

Below is the code. Any insight would be greatly appreciated.

UPDATE:

So the problem is definitely the date format. If I change the field settings in the pivot table to the date format mm/dd/yyyy (10/1/2013), then the macro works exactly as expected. This would be a simple fix to the problem except that the table is feeding a chart seen in the user dashboard, which I would really like to be in the format mmm yy, since it looks much cleaner. Is there a simple way to convert the format to mm/dd/yyyy inside the macro for the comparison, then back to the desired format once complete?

And I would still like to understand why a different date format is returning such different results, when the raw data being compared is the same, and both are formatted as dates, not like date vs text or something.

Sub filterPivotDate(pt As PivotTable, strtDate As Date, endDate As Date)

Dim pf As PivotField
Dim pi As PivotItem

'Clear current date filter
Set pf = pt.PivotFields("Date")
pf.ClearAllFilters

'Set new date filter
For Each pi In pf.PivotItems
    If pi.Value >= strtDate And pi.Value <= endDate Then
        pi.Visible = True
    Else
        pi.Visible = False
    End If
Next pi

end sub

ANSWER UPDATE:
I replaced the loop I was using to set the filter with the following line of code:

pf.PivotFilters.Add Type:=xlDateBetween, Value1:=strtDate, Value2:=endDate

This solved the issue I was having with the date format. More information in the accepted answer below, as well as at this website

dominc_66

1

Макрос сравнения по дате с текущей

28.07.2009, 09:15. Показов 10355. Ответов 2


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

Подскажите пожалуйста макрос с возможнастю: есть документ Excel с тремя листами на первом листе список из названий фирм и дат(срок окончания лицензий), как сделать чтоб шло сравнение дат во втрой ячейки с системной(текущей), и макрос разбивал бы спискок на первом листе еще на два списка: тоесь на первом- исходные данние, на втором- просрочениые лицензии, на третем- актуальные(те что работают). Зарание БОЛЬШОЕ спасибо.

Programming

Эксперт

94731 / 64177 / 26122

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

Сообщений: 116,782

28.07.2009, 09:15

2

analyst

437 / 144 / 9

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

Сообщений: 678

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

28.07.2009, 10:19

2

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
Sub ÑÎÐÒÈÐÎÂÊÀ()
i = 1
Do While Sheets("Ëèñò1").Cells(i, 1) <> 0
    'ïðîâåðÿåì ÿâëÿåòñÿ ëè ÿ÷åéêà âî âòîðîì ñòîëáöå äàòîé
    If IsDate(Sheets("Ëèñò1").Cells(i, 2).Value) = True Then
    data_okonch_lic = Sheets("Ëèñò1").Cells(i, 2)
    End If
    'ïðîâåðÿåì ñîîòâåòñòâèå òåêóùåé äàòå
    If data_okonch_lic < Date Then
        j = 1
    'ищем первую незаполненную строчку
        Do
            If Sheets("Ëèñò2").Cells(j, 1).Value <> 0 Then
            j = j + 1
            Else: GoTo copypaste1
            End If
        Loop
copypaste1:
    'вставляем данные
    Worksheets("Ëèñò1").Rows(CStr(i) + ":" + CStr(i)).Copy _
    Destination:=Worksheets("Ëèñò2").Rows(CStr(j) + ":" + CStr(j))
    
    ElseIf data_okonch_lic >= Date Then
        j = 1
        Do
            If Sheets("Ëèñò3").Cells(j, 1).Value <> 0 Then
            j = j + 1
            Else: GoTo copy_paste2
            End If
        Loop
copy_paste2:
    Worksheets("Ëèñò1").Rows(CStr(i) + ":" + CStr(i)).Copy _
    Destination:=Worksheets("Ëèñò3").Rows(CStr(j) + ":" + CStr(j))
    End If
    i = i + 1
Loop
End Sub



1



dominc_66

28.07.2009, 19:42

3

Спасибо за помощь analyst,

Выручайте! макросы, сравнение дат и повторяющиеся строки

Автор stas10, 25.05.2012, 22:50

« назад — далее »

1. Представьте, имеются строчки, в которых есть разные данные (по столбцам).
Одни из данных — ДАТА СОЗДАНИЯ СЧЕТА.
Необходимо — проверить во всех строчках эту дату на просроченность (30 дней), и если просрочена дата — выделить ВСЮ строчку.
т.е. дата СОЗДАНИЯ СЧЕТА+30дней — если больше чем СЕГОДНЯ,то выделить всю строку красным, например.
Как это написать в макросе?

2. Если вставить новую строку в конец, как проверить ее на повтор (по АРТИКУЛУ), и если она уже есть, то взять из нее новые данные (ПОСЛЕДНИЕ ДВА СТОЛБЦА С ДАТАМИ) и заменить в старой строке (ТОЛЬКО ДАТЫ)

Кто реально поможет, закину немного денег на телефон.


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


Цитата: Poltava от 26.05.2012, 01:47
Сделать то можно. Только пара вопросов.
1) +30 дней или все же месяц, то есть по такое же число следующего месяца
2) как должно работать ??? то есть как понять что вы добавили новую строку и нужно начать сравнение. Нажатие на кнопку, заполнение последнего ну или первого столбца в последней строке, или еще как то
3) по какому из артикулов сравнивать 1, 2 или 3 колонка ???
4) что сделать с последней строкой если совпадение найдено удалить ???
5) в файл добавляется по одной строке ??? сравнивать нужно только последнею
6) все макросами или можно скажем через условное_форматирование как в приложенном файле

Заранее огромное спасибо!
Действительно важные вопросы, сегодня все уточню.
Могу точно сказать, что 3) надо сравнить по 1 артикулу (1 столбец) и по номеру заказа (3 столбец). Если совпадает, то мы берем последние две даты (послед. 2 столбца), обновляем их в старой строке, а новую-вставленную удаляем.
Я сегодня уточню, но скорее всего вставляться будут сразу несколько позиций в конец списка, и начальство хочет, чтобы сразу начиналась проверка на повтор.


Как будут вставлять? ручками писать, откуда то копировать по одной строке, или сразу много строк копировать и вставлять, либо вообще программно? Откуда если из другого эксель файла то может есть смысл просто считывать отуда нужные данные и ничего никуда не копировать ручками? В общем вопросов больше чем ответов так что ждем.

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


Цитата: Poltava от 26.05.2012, 12:54
Как будут вставлять? ручками писать, откуда то копировать по одной строке, или сразу много строк копировать и вставлять, либо вообще программно? Откуда если из другого эксель файла то может есть смысл просто считывать отуда нужные данные и ничего никуда не копировать ручками? В общем вопросов больше чем ответов так что ждем.

прошу прощения за задержку, на работе нет доступа к инету. Делаю эти задания уже дома, но моих знаний не хватает.
Итак.
1) просто 30 дней
2) Строки будут вставлять, копируя из похожего файла (по столбцам все одинаково, просто в них новые даты). Копировать будут вручную (ctrl+v). Можно по одной, а можно и по несколько сделать — это как Вам и мне удобнее реализовать. как проще. Соответственно начать сравнить — либо сразу, либо по нажатию кнопки — как нам удобнее, проще сделать!
3) надо сравнить по 1 артикулу (1 столбец) и по номеру заказа (3 столбец). Если совпадает, то мы берем последние две даты (послед. 2 столбца), обновляем их в старой строке, а новую-вставленную удаляем.
4)если повтор, обновляем данные, вставленную удаляем(пункт 3)
5) да, в конец будут всталвять 1 или несколько, пофиг, как получится сделать
6)все равно, главное чтобы работало. Но, сегодня покапался в УФ и заметил, что работает оно как-то некоррекотно.
Если делать 1 часть через УФ, что надо писать в формуле?
я понял, что правильно как-то так: =ДАТАЗНАЧ(тут просматриваем каждую ячейку столбца D)+30<ТДАТА()


В общем вот что я понял и как себе представляю. Есть кнопка при нажатии на которую ВСЯ база сравнивается находятся одинаковые артикулы сравниваются их даты и самые поздние даты обновляются на самые новые, а все остальные позиции удаляются.
Чем вас не устроило условное_форматирование ? у меня условие =$D2+30<ТДАТА() а область действия =$A$2:$H$41 но оно не совсем правильная тут для полного счастья нужно использовать динамический диапазон!
Если вам не кровь из носа нужно на завтра то постараюсь в понедельник предложить свой вариант. Кстати вы не думали о том чтоб не вставлять ручками а брать нужные данные из файла автоматом.

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


Цитата: Poltava от 27.05.2012, 00:57
В общем вот что я понял и как себе представляю. Есть кнопка при нажатии на которую ВСЯ база сравнивается находятся одинаковые артикулы сравниваются их даты и самые поздние даты обновляются на самые новые, а все остальные позиции удаляются.
Чем вас не устроило условное_форматирование ? у меня условие =$D2+30<ТДАТА() а область действия =$A$2:$H$41 но оно не совсем правильная тут для полного счастья нужно использовать динамический диапазон!
Если вам не кровь из носа нужно на завтра то постараюсь в понедельник предложить свой вариант. Кстати вы не думали о том чтоб не вставлять ручками а брать нужные данные из файла автоматом.

все верно..
Но почему именно $D2? если поменять на $D3, то получатся уже другие результаты
Сегодня бы хоть что-нибудь показать..


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


Решил задачу с диапазоном. Просто прописал, чтобы пустые ячейки не выделял красным.

Остается вторая задача с добавлением повторных строк


сроки вышли… тема пока закрывается  :(


А я только сел за отладку. Ну ладно если вам не уже не нужно то тогда не буду и делать

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


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