Показать сообщение отдельно
Старый 02.03.2012, 13:49   #14  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Формулки для тёти бухгалтера (кадровика) в Excel
Пришлось тут наваять версию алгоритма для Excel на уровне формул в соседних колонках. Делал по мотивам своей вышеприведенной процедурки VBA_TestDifferenceBetweenTwoDates.

Произошло очередное укрепление убеждения в том, что разность между двумя датами - это кол-во полных месяцев + дополнительные дни (сверх полных месяцев). Всё остальное - полные годы, доп.месяцы (сверх полных лет), недели, кварталы и что еще заблагорассудится - можно получить простыми операциями деления или получения остатка от деления.

Завязываю узелок на память: в виде файла и в виде формул (для русского Excel). В виде формул - для большей наглядности (не надо лезть в файл), а также для гостей форума, для которых файл может быть недоступен.

A1: Дата 1
B1: Дата 2
C1: Полн.Месяцы предв.
D1: Полн.Месяцы оконч.
E1: Полн.Годы
F1: Месяцы сверх полн.лет
G1: Дни сверх полн. мес.

A2: 23.09.1984
B2: 15.12.2011
C2: =(ГОД(B2)-ГОД(A2))*12+МЕСЯЦ(B2)-МЕСЯЦ(A2)
D2: =C2+ЕСЛИ(B2-ДАТАМЕС(A2;C2)<0; ЕСЛИ(B2>A2;-1; 0); ЕСЛИ(B2>A2; 0; 1))
E2: =ОТБР(D2/12)
F2: =D2-E2*12
G2: =B2-ДАТАМЕС(A2;D2)

Разность (Дата 1 - Дата 2) может быть с любым знаком, формулы корректно считают и в плюс, и в минус.


P.S.05.03.2012. Ну что ж, как часто бывает в подобных случаях, когда надо "быстро-быстро" и "вчера", после внедрения начинаешь рассуждать спокойно, литературку почитаешь, по Сети поползаешь и поймешь, что существует (и давно) решение гораздо более изящное. Так и в этот раз - нашлась в Excel суперподходящая под задачу функция РАЗНДАТ (в англ. DATEDIF; не путать с ф-цией DateDiff VBA - при похожем названии возможности несколько различаются). Функция РАЗНДАТ является недокументированной, поэтому не появляется в списках выбора, отсутствует в справке и существует в Excel в основном для совместимости с Лотусом 1-2-3.

Функция РАЗНДАТ идеальна для вычисления возраста (количества полных лет), поскольку абсолютна точна (в отличие от встречающихся в И-нете предложений делить разницу в днях на 365 или 365.25), а также для вычисления стажа (годы, месяцы, дни). Почитать про функцию можно, например, здесь: http://www.excel2003.ru/vichislenie-...ili-staja.html:
Цитата:
Синтаксис функции следующий:

РАЗНДАТ(начальная_дата; конечная_дата; способ_измерения)

Самый интересный аргумент, конечно, последний. Он определяет, каким именно образом и в каких единицах будет измеряться интервал между начальной и конечной датами. Этот параметр может принимать следующие значения:

"y" разница в полных годах
"m" в полных месяцах
"d" в полных днях
"yd" разница в днях с начала года без учета лет
"md" разница в днях без учета месяцев и лет
"ym" разница в полных месяцах без учета лет
Дам свою, надеюсь, более понятную интерпретацию трех последних опций:
"yd" - количество дней сверх полных лет (от 0 до 365)
"md" - количество дней сверх полных месяцев (от 0 до 30)
"ym" - количество месяцев сверх полных лет (от 0 до 11)

Таким образом, полный интервал между двумя датами может быть представлен одним из следующих вариантов:
* количество дней РАЗНДАТ(дата1,дата2,"d") (или просто разница дат без использования РАЗНДАТ: дата2 - дата1)
* кол-во полных лет РАЗНДАТ(дата1,дата2,"y") + кол-во дней сверх полных лет РАЗНДАТ(дата1,дата2,"yd")
* кол-во полных месяцев РАЗНДАТ(дата1,дата2," m") + кол-во дней сверх полных месяцев РАЗНДАТ(дата1,дата2,"md")
* случай расчета стажа: кол-во полных лет РАЗНДАТ(дата1,дата2,"y") + кол-во полных месяцев сверх полных лет РАЗНДАТ(дата1,дата2,"ym") + кол-во дней сверх полных месяцев РАЗНДАТ(дата1,дата2,"md")

Да, и конечная дата должна быть больше начальной даты, т.е. в минус функция РАЗНДАТ автоматически не считает (в этом случае следует поменять даты местами).

Добавил в прилагаемый файл формулы с РАЗНДАТ.
Вложения
Тип файла: xls TestDifferenceBetweenTwoDates2.xls (30.5 Кб, 472 просмотров)

Последний раз редактировалось Gustav; 05.03.2012 в 10:32.