Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Работа с функцией DateDiff - Мир MS Excel

Регистрация · Логин: · Пароль: · · Забыли пароль?
  • Страница 1 из 1
  • 1
Модератор форума: _Boroda_, Manyasha, SLAVICK, китин  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Работа с функцией DateDiff (Макросы/Sub)
Работа с функцией DateDiff
Sashagor1982 Дата: Четверг, 10.01.2019, 12:27 | Сообщение № 1
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 189
Репутация: 14 ±
Замечаний: 0% ±

Excel 2007
Подскажите пожалуйста,
[vba]
Код
Function Возраст(Дата As Date) As Date
Возраст=DateDiff("yyyy", Дата, Now)
End function
[/vba]
Вопрос состоит в следующем результатом приведенного кода для человека дата рождения у которого 01.08.1979 будет 40 лет. Подскажите в чем ошибка.
 
Ответить
СообщениеПодскажите пожалуйста,
[vba]
Код
Function Возраст(Дата As Date) As Date
Возраст=DateDiff("yyyy", Дата, Now)
End function
[/vba]
Вопрос состоит в следующем результатом приведенного кода для человека дата рождения у которого 01.08.1979 будет 40 лет. Подскажите в чем ошибка.

Автор - Sashagor1982
Дата добавления - 10.01.2019 в 12:27
StoTisteg Дата: Четверг, 10.01.2019, 12:34 | Сообщение № 2
Группа: Авторы
Ранг: Старожил
Сообщений: 1157
Репутация: 103 ±
Замечаний: 0% ±

Excel 2010
Это не Ваша ошибка, а особенность работы DateDiff — она вычитает именно годы, а не даты. То есть нужно ввести проверку, был ли уже день рождения в текущем году и если нет, уменьшать возраст на 1.


Интуитивно понятный код - это когда интуитивно понятно, что это код.
 
Ответить
СообщениеЭто не Ваша ошибка, а особенность работы DateDiff — она вычитает именно годы, а не даты. То есть нужно ввести проверку, был ли уже день рождения в текущем году и если нет, уменьшать возраст на 1.

Автор - StoTisteg
Дата добавления - 10.01.2019 в 12:34
Gustav Дата: Четверг, 10.01.2019, 12:41 | Сообщение № 3
Группа: Друзья
Ранг: Старожил
Сообщений: 1655
Репутация: 672 ±
Замечаний: 0% ±

начинал с Excel 4.0...
Функция РАЗНДАТ в помощь:
Код
=РАЗНДАТ(ДАТА(1979;8;1);СЕГОДНЯ();"y")


А почитать здесь: http://www.excelworld.ru/publ/funcs/date_time/datedif/8-1-0-18

[p.s.]Если же хотите решить непременно кодом VBA, то тогда здесь посмотрите: http://www.excelworld.ru/forum/10-39277-1
[/p.s.]
Соответственно, моя версия функции (следуя материалу ссылки):
[vba]
Код
Function Возраст(Дата As Date) As Date
    Возраст = Evaluate("DATEDIF(" & CLng(Int(Дата)) & "," & CLng(Int(Now)) & ",""Y"")")
End Function
[/vba]


Мой tip box - яд 41001663842605

Сообщение отредактировал Gustav - Четверг, 10.01.2019, 12:57
 
Ответить
СообщениеФункция РАЗНДАТ в помощь:
Код
=РАЗНДАТ(ДАТА(1979;8;1);СЕГОДНЯ();"y")


А почитать здесь: http://www.excelworld.ru/publ/funcs/date_time/datedif/8-1-0-18

[p.s.]Если же хотите решить непременно кодом VBA, то тогда здесь посмотрите: http://www.excelworld.ru/forum/10-39277-1
[/p.s.]
Соответственно, моя версия функции (следуя материалу ссылки):
[vba]
Код
Function Возраст(Дата As Date) As Date
    Возраст = Evaluate("DATEDIF(" & CLng(Int(Дата)) & "," & CLng(Int(Now)) & ",""Y"")")
End Function
[/vba]

Автор - Gustav
Дата добавления - 10.01.2019 в 12:41
_Boroda_ Дата: Четверг, 10.01.2019, 12:41 | Сообщение № 4
Группа: Модераторы
Ранг: Местный житель
Сообщений: 15195
Репутация: 5972 ±
Замечаний: 0% ±

2003; 2007; 2010; 2013 RUS
Правильно. В справке по функции
https://docs.microsoft.com/ru-ru....%3Dtrue
Цитата
При сравнении 31 декабря с 1 января следующего года функция DateDiff для года ("yyyy") возвращает значение 1, не смотря на то, что разница составляет всего один день.

Можно вот так например
[vba]
Код
Function Возраст(Дата As Date) As Date
Возраст = DateDiff("yyyy", Дата, Now) + (Now < CDate(Format(Дата, "D.M.") & Year(Now)))
End Function
[/vba]


Скажи мне, кудесник, любимец ба’гов...
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995
 
Ответить
СообщениеПравильно. В справке по функции
https://docs.microsoft.com/ru-ru....%3Dtrue
Цитата
При сравнении 31 декабря с 1 января следующего года функция DateDiff для года ("yyyy") возвращает значение 1, не смотря на то, что разница составляет всего один день.

Можно вот так например
[vba]
Код
Function Возраст(Дата As Date) As Date
Возраст = DateDiff("yyyy", Дата, Now) + (Now < CDate(Format(Дата, "D.M.") & Year(Now)))
End Function
[/vba]

Автор - _Boroda_
Дата добавления - 10.01.2019 в 12:41
StoTisteg Дата: Четверг, 10.01.2019, 12:42 | Сообщение № 5
Группа: Авторы
Ранг: Старожил
Сообщений: 1157
Репутация: 103 ±
Замечаний: 0% ±

Excel 2010
[vba]
Код
Function Возраст(Дата As Date) As Date

   If DateSerial(Year(Date), Month(Дата), Day(Дата)) < Date Then Возраст = DateDiff("yyyy", Дата, Date) - 1 Else Возраст = DateDiff("yyyy", Дата, Date)

End Function
[/vba]Где-то так. Правда, не проверял, но должно работать, всё примитивно.


Интуитивно понятный код - это когда интуитивно понятно, что это код.
 
Ответить
Сообщение[vba]
Код
Function Возраст(Дата As Date) As Date

   If DateSerial(Year(Date), Month(Дата), Day(Дата)) < Date Then Возраст = DateDiff("yyyy", Дата, Date) - 1 Else Возраст = DateDiff("yyyy", Дата, Date)

End Function
[/vba]Где-то так. Правда, не проверял, но должно работать, всё примитивно.

Автор - StoTisteg
Дата добавления - 10.01.2019 в 12:42
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Работа с функцией DateDiff (Макросы/Sub)
  • Страница 1 из 1
  • 1
Поиск:

Яндекс цитирования
© 2010-2019 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!