Страницы: 1 2 3 След.
RSS
Разница дат
 
Всем доброго дня!  
 
Бывает, что нужно посчитать возраст человека, или трудовой стаж (всего и на конкретном месте) и т.д. В-общем, нужно посчитать разницу дат.  
 
Казалось бы, чего проще? Ввел 2 даты, далее вычитание... Но получается так, что Ексель "плюсует" месяц к результату (в приложенном файле см. пример 1, там я считала  трудовой стаж, работник отработал 10 дней, а Ексель показывает 1 мес. и 10 дней).  
 
Я видоизменила формулу расчета, т.е. если ранее было "=E7-E8", то теперь формула стала выглядеть так "=I7-I8-ДЕНЬ(31)" (см. пример № 3) , хотя до конца смысла вот этой добавки "31 день" я так и не поняла. Все бы ничего, теперь разница дат стала правильной, но если работник отработал менее месяца, в итоговой ячейке отображаются решетки, в смысле, отрицательный результат (см. пример № 2).  
 
Прошу поделиться опытом и советами, как считать даты в Екселе. Заранее спасибо!
 
Еще раз добавлю файл, в первом была неточность.
 
Странно - у меня не плюсует ничего. Посмотрите файл.
 
А это не подойдёт?  
 
http://www.planetaexcel.ru/tip.php?aid=24
 
Юрий М, мне нужно получать итог в виде ДД.ММ.ГГ  
 
В Вашем примере указаны только дни и, действительно, все верно. Но стоило мне изменить формат даты на ДД.ММ.ГГ, незамедлительно вылезла упомянутая мною проблема. Снова лишний месяц.
 
Pavel55, спасибо большое! Я зашла по Вашей ссылке, скачала пример, и, о чудо, всЁ получилось!
 
Ну и маленькая поправка. По науке, надо бы к стажу по каждому предприятию добавить 1 день, так что, к этому посту я прилагаю обновленную версию расчета стажа.  
 
Общий стаж я считала так: сначала сложила даты ув-ний, потом сложила даты приема, потом из числа 1 вычла число 2. Если же считать стаж по каждому предприятию, а потом складывать, то получится результат типа 5 лет 16 мес. 54 дня. А потом переводить это в привычную систему дат - эх, жесть!
 
---  
Добрый вечер.    
 
Но вот информацию ниже доброй не назовешь, к сожадению.  
Функция РАЗНДАТ() иногда глючит.  
 
Например, возьмем рекомендованную формулу:  
=РАЗНДАТ(дата1; дата2;"y") & " г. " & РАЗНДАТ(дата1; дата2;"ym") & " месс. " & РАЗНДАТ(дата1; дата2;"md") & " дн."  
 
Результаты ниже приведены в формате записи:  
дата1; дата2;  результат; что должно быть  
 
Ошибка, которая случается только в excel 2007:  
06.02.2008; 03.03.2008; 0 г. 0 мес. 28 дн.; 0 г. 0 мес. 26 дн.  
 
Ошибки во всех версиях (записи в том же формате).  
Отрицательные значения дней:  
31.01.2006; 01.03.2006; 0 г. 1 мес. -2 дн.; 0 г. 1 мес. 1 дн.  
31.01.2007; 01.03.2007; 0 г. 1 мес. -2 дн.; 0 г. 1 мес. 1 дн.  
31.01.2008; 01.03.2008; 0 г. 1 мес. -1 дн.; 0 г. 1 мес. 1 дн.  
Ошибка в определении дней:  
03.02.2000; 01.12.2007; 7 г. 9 мес. 28 дн.; 7 г. 9 мес. 27 дн.  
30.01.2007; 01.03.2008; 1 г. 1 мес. 0 дн.; 1 г. 1 мес. 2 дн.  
28.02.2007; 01.03.2008; 1 г. 0 мес. 2 дн.; 1 г. 0 мес. 1 дн.  
---  
ZVI
 
---  
Вместо РАЗНДАТ() для определения разности в годах, месяцах и днях можно применять такую функцию:  
 
' ZVI:2008-10-04 Функция взамен РАЗНДАТ()  
' =РазностьДат(Дата1;Дата2) дает строку: "A л. B мес. C дн."  
' =РазностьДат(Дата1;Дата2;0) дает то же самое: "A л. B мес. C дн."  
' =РазностьДат(Дата1;Дата2;1) дает количество лет: A  
' =РазностьДат(Дата1;Дата2;2) дает количество месяцев: B  
' =РазностьДат(Дата1;Дата2;3) дает количество дней: C  
Function РазностьДат(Дата1 As Date, Дата2 As Date, Optional Формат = 0)  
 Dim d1 As Date, d2 As Date, y$, Лет&, Месяцев&, Дней&, ДнейМесяц1&, ДнейМесяц2&  
 d1 = Int(Дата1):  d2 = Int(Дата2)  
 If Дата1 = Empty Or Дата2 = Empty Or d1 > d2 Then РазностьДат = vbNullString: Exit Function  
 If Year(d2) <= Year(d1) Then  
   Лет = 0  
 Else  
   Лет = DateDiff("yyyy", d1, d2)  
   If Month(d2) = Month(d1) Then  
     If Day(d2) < Day(d1) Then Лет = Лет - 1  
   ElseIf Month(d2) < Month(d1) Then  
     Лет = Лет - 1  
   End If  
 End If  
 Месяцев = (DateDiff("m", DateSerial(Year(d1), Month(d1), 1), _  
            DateSerial(Year(d2), Month(d2), 1)) + IIf(Day(d2) < Day(d1), -1, 0)) Mod 12  
 ДнейМесяц1 = Day(DateSerial(Year(d1), Month(d1) + 1, 0))  
 ДнейМесяц2 = Day(DateSerial(Year(d2), Month(d2) + 1, 0))  
 If Day(d1) <= Day(d2) Then  
   Дней = Day(d2) - Day(d1)  
 Else  
   Дней = ДнейМесяц1 - Day(d1) + Day(d2)  
 End If  
 Select Case Лет Mod 10  
   Case 1 To 4: y = " г. "  
   Case Else:   y = " л. "  
 End Select  
 Select Case Формат  
   Case 1: РазностьДат = Лет  
   Case 2: РазностьДат = Месяцев  
   Case 3: РазностьДат = Дней  
   Case Else: РазностьДат = Лет & y & Месяцев & " мес. " & Дней & " дн."  
 End Select  
End Function  
 
---  
ZVI
 
Подскажите как эту функцию подключить?
 
{quote}{login=}{date=05.10.2008 12:58}{thema=}{post}Подскажите как эту функцию подключить?{/post}{/quote}  
---  
Пример подключения функции РазностьДат() к конкретной книге прилагается. В примере приведено сравнение её результатов с результатами встроенной недокументированной функции Excel РАЗНДАТ().  
 
Чтобы функция РазностьДат() работала со всеми книгами, нужно скопировать её код в книгу персональных макросов, или подключить её как надстройку. Если в этом есть необходимость, то могу подготовитьь такую надстройку с простейшим инсталлятором. Надстройку, в общем-то, легко можно получить из приложенной книги, удалив все с Листа1 и сохранив книгу как надстройку XLA.  
 
Интересно отметить, что у Chip Pearson есть функция Age() (см  http://www.cpearson.com/excel/DateTimeVBA.htm) которая тоже, к сожалению, глючит.  
Например, для дат 28.02.2007 и 01.03.2008 Age() выдает:  
"1 years 0 months 5 days" вместо  
"1 years 0 months 1 days"  
а также завышает на 1 день там, где РАЗНДАТ() выдает отрицательные дни.  
---  
ZVI
 
ZVI, а можно попросить Вас объяснить мне, как не слишком продвинутому эксельщику, что именно нужно делать, что копировать, какие строки, одним словом, нужна пошаговая инструкция по установке этой надстройки. Потому как пока, без дополнительных загрузок РАЗНОСТЬДАТ не срабатывает...
 
См. файл с вариантами
 
P.S.  
Function РазностьДат находится в Макросе
 
Ан13, всё отлично, теперь попробуем посчитать общий стаж. Начало нехитрое: считаем сумму дат приема, далее считаем сумму дней увольнения, далее считаем разницу... Вот уже и показались годы, цифры, и месяцы. А теперь вот вопросик: как бы к этой величине прибавить еще кол-во дней, по одному дню на каждую запись. Т.е. если у чела в трудовой книжке 3 записи о работе, то прибавляем 3 дня, если же чел отработал на 10 предприятиях, то нужно прибавить 10 дней. Пока у меня не получилось сложить эти величины. См. в приложенном файле лист "Общий стаж".
 
{quote}{login=ГлавБух}{date=05.10.2008 09:21}{thema=}{post}ZVI, а можно попросить Вас объяснить мне, как не слишком продвинутому эксельщику, что именно нужно делать, что копировать, какие строки, одним словом, нужна пошаговая инструкция по установке этой надстройки. Потому как пока, без дополнительных загрузок РАЗНОСТЬДАТ не срабатывает...{/post}{/quote}  
---  
Создание надстройки:  
1. Открыть книгу Пример_РазностьДат.xls  
2. Удалить все  на листе1 этой книги  
3. Меню: Файл - Сохранить как – Тип файла: Надстройка Microsoft Office (*.xla) – Сохранить  
 
Подключение надстройки:  
Меню: Сервис – Надстройки – найти в списке надстройку, поставить галочку, нажать OK  
 
После этого на данном компьютере можно использовать функцию РазностьДат() в любой книге.  
 
На другом компьютере нужно или проделать то же самое, или скопировать файл созданноцй надстройки (XLA) в какую-нибудь папку и подключить ее, например так:  
Меню: Сервис – Надстройки – Обзор - найти папку с надстройкой, выбрать файл надстройки и нажать OK.  
 
По поводу общего стажа, подозреваю, что должны существовать формальные правила (нормативы) на тот случай, если сумма дней на разных работах станет больше 30...31.    
Например, получили сумму 45 дней, сколько из них должно посчитатья за один месяц стажа, 30 или 31?    
Или может (вряд ли) 28...29 если есть какая-то ассоцииация с февралем?  
---  
ZVI
 
---  
Далек от проблем учета кадров, просто даю первую попавшуюся ссылку. С помощью вот этой программки:  
http://seniority.narod.ru/Staj.exe  
получаем стаж:  
прием: 01.10.2008 увольнение: 30.10.2008 стаж 1 месяц;  
прием: 01.10.2008 увольнение: 31.10.2008 стаж 1 месяц 1 день;  
прием: 01.10.2008 увольнение: 01.11.2008 стаж 1 месяц 1 день (сравните с предыдущим);  
 
Похоже, также, что расчет стажа производится исходя из 30 дней для февраля.  
 
В справке программы есть ссылка на постановление  Правительства РФ №555 от 24.07.2002), что каждые 30 дней переводятся в месяцы, а каждые 12 месяцев переводятся в полные годы.    
 
---  
ZVI
 
ZVI, спасибо, очень полезная ссылка! Жаль, что нельзя сохранить результаты в виде файлов.
 
{quote}{login=ГлавБух}{date=05.10.2008 08:11}{thema=}{post}ZVI, спасибо, очень полезная ссылка! Жаль, что нельзя сохранить результаты в виде файлов.{/post}{/quote}  
---  
Еще одна ссылка на программу для расчета выслуги лет.  
http://download.ware.ru/win/6496_RVLsetup244.exe  
В ней есть возможность сохранить/загрузить.  
Методика учета 31-го числа отличается от предыдущей программы.  
---  
Удачи Вам,  
ZVI
 
А не нужно ли добавлять один день к вычислениям? Я вот о чем - устроился на работу  
01.01.2000, уволился  
02.01.2002.  
Ведь день увольнения - последний рабочий день. Тогда должно быть два дня (чловек работал 1-го и 2-го). А функция возвратит 1 день.
 
{quote}{login=}{date=06.10.2008 01:51}{thema=}{post}А не нужно ли добавлять один день к вычислениям? Я вот о чем - устроился на работу  
01.01.2000, уволился  
02.01.2002.  
Ведь день увольнения - последний рабочий день. Тогда должно быть два дня (чловек работал 1-го и 2-го). А функция возвратит 1 день.{/post}{/quote}  
---  
Если Вы о функции РазностьДат(), то она лишь устраняет ошибки недокумментированной функции Excel РАЗНДАТ().  
И обе эти функции ничего не знают о российских правилах определения стажа. Что-то про это знают программы, на которые даны ссылки, с подозрением на 360-дневную годовую  систему счисления.  
 
Можно было бы реализовать функцию определения выслуги лет и в Excel-е, если бы кто-то четко сформулирует правила.  
Но ни здесь, ни в обсуждении раздела http://www.planetaexcel.ru/tip.php?aid=24 такие правила не сформулированы и, судя по вопросам, в этом и проблема.  
---  
ZVI
 
Попробуем посчитать общий стаж.  
См. файл
 
Попалась на глаза старая но интересная тема с прошлого года, кое что изменил но осталось одна неувязка. Модуль работает правильно за исключением 3-х цифр. Не поможете добавить исправление в модуле чтоб прописывало 11лет, 12лет, 13лет, 14лет а то он пишет года.
С уважением Тиго.
 
Посмотрел файл ZVI, увидел некоторые ошибки.  
Первая, не существенная,- считает с "с *** - до ***", а для стажа нужно "с*** по*** ". Правда, это вопрос спорный, и легко обходится.    
Вторая - некоторые даты считает неправильно. Формулы я написал, тестировал долго, вроде ошибок не увидел... А исправить функцию - тямы не хватет... да и автор есть - посчитает нужным, исправит.
 
{quote}{login=Тиго}{date=03.01.2010 12:05}{thema=}{post}Попалась на глаза старая но интересная тема с прошлого года, кое что изменил но осталось одна неувязка. Модуль работает правильно за исключением 3-х цифр. Не поможете добавить исправление в модуле чтоб прописывало 11лет, 12лет, 13лет, 14лет а то он пишет года.{/post}{/quote}  
Добавил склонение падежей для лет.
 
{quote}{login=Михаил}{date=03.01.2010 12:50}{thema=}{post}Посмотрел файл ZVI, увидел некоторые ошибки.  
Первая, не существенная,- считает с "с *** - до ***", а для стажа нужно "с*** по*** ". Правда, это вопрос спорный, и легко обходится.    
Вторая - некоторые даты считает неправильно. Формулы я написал, тестировал долго, вроде ошибок не увидел... А исправить функцию - тямы не хватет... да и автор есть - посчитает нужным, исправит.{/post}{/quote}  
Михаил, это функция не для расчета стажа, а для замены существующей =РАЗНДАТ()  
Для стажа где-то у меня валяется давно готовая надстройка, но без справки.  
Насчет ошибок буду Вам признателен, если приведете примеры.
 
"Насчет ошибок буду Вам признателен, если приведете примеры."  
*****************  
В моем файле (post_88281.xls) красным выделено.
 
{quote}{login=Михаил}{date=03.01.2010 01:34}{thema=}{post}В моем файле (post_88281.xls) красным выделено.{/post}{/quote}  
Спасибо, Михаил - посмотрю
 
Вот сравнение именно по Раность_дат, без учета последнего дня и всяких других правил.
 
В файле post_88293.xls, в формуле расчета дней маленькая ошибка, вчера сразу не обратил внимания...  
вот исправленный файл
Страницы: 1 2 3 След.
Наверх