Нахождение более короткого периода дней в течение более длительного периода для расчета - PullRequest
0 голосов
/ 29 июня 2018

У меня есть набор дат, всего 7 периодов по 6 месяцев каждый с соответствующим расчетным коэффициентом.

У меня будет пользовательский ввод периода, для которого он хотел бы, чтобы вычисление было выполнено, который может приходиться на один из 6-месячных периодов или охватывать два или более таких периода полностью или частично.

Иллюстрация:

  1. Предустановленные периоды:

enter image description here

  1. Ввод пользователя:

enter image description here

Я получил десятичное значение (в месячном исчислении) периодов, введенных пользователем для расчета. Для первого экземпляра (см. Ввод данных пользователем) десятичное значение для периода с 01-01-2015 по 29-04-2015 будет 3,97 в месячном исчислении. Расчет за этот период будет выглядеть так:

п * 3,97 * 113%

Во втором случае десятичное значение для периода с 30-04-2015 по 30-06-2015 будет равно 2,03, что будет использовано для расчета при 113%, а затем результат будет добавлен к выполненному вычислению. на 119% с использованием десятичного значения 5,65 за период с 01-07-2015 по 20-12-2015:

* 1 029 * (п * 2,03 * 113%) + (N * 5,65 * 119)

Думаю, я справлюсь с разбивкой периодов, так как событие пересмотра проводится раз в два года в определенные даты, но советы по этому поводу приветствуются. Что еще более важно, мне нужна помощь в отслеживании предварительно установленного расчетного коэффициента (скажем, 132%), соответствующего периоду, введенному пользователем, как показано выше. Это возможно?

1 Ответ

0 голосов
/ 03 июля 2018

Я буду использовать стандартный подход для нахождения перекрытия между двумя датами и разделю задачу на три части, как в моем ответе на этот недавний вопрос .

(1) Первая часть находит совпадение между диапазоном дат пользователя и одним или несколькими периодами пересмотра в целых месяцах и нуждается в формуле массива. Я решил использовать функцию Datedif 1 , чтобы получить разницу в месяцах между началом и концом перекрытий. Если перекрытия нет, дата начала, введенная в Datedif, будет после даты окончания, и она возвратит ошибку, которая может быть перехвачена Iferror. Если даты пользователя начинаются в A2 и B2, это дает в C2:

=SUM(IFERROR((DATEDIF(IF(K$2:K$8>A2,K$2:K$8,A2),IF(L$2:L$8<B2,L$2:L$8,B2),"m")+1)*M$2:M$8,0))

, который должен быть введен как формула массива с помощью Ctrl Shift Введите

Приведенный выше результат включает первый и последний месяцы, введенные пользователем, даже если они являются неполными месяцами. Затем необходимо вычесть все пропущенные дни в первый и последний месяцы.

(2) Недостающие дни в первом месяце в виде доли от числа дней в этом месяце в D2:

=SUMIFS($M$2:$M$8,$K$2:$K$8,"<="&A2,$L$2:$L$8,">="&A2)*(A2-EOMONTH(A2,-1)-1)/(EOMONTH(A2,0)-EOMONTH(A2,-1))

Замечание OP, это также можно было сделать с помощью sumproduct, vlookup или index / match.

(3) Пропущенные дни в прошлом месяце как доля дней в этом месяце в E2:

=SUMIFS($M$2:$M$8,$K$2:$K$8,"<="&B2,$L$2:$L$8,">="&B2)*(EOMONTH(B2,0)-B2)/(EOMONTH(B2,0)-EOMONTH(B2,-1))

Всего всего (1) - (2) - (3) или

=C2-D2-E2

Я поместил результаты двух примеров ОП для сравнения в H2 и H3: мои результаты согласуются с ними в первых 3 значимых цифрах.

n*3.97*113%

(n*2.03*113%)+(n*5.65*119)  

Во всех случаях я установил n = 1 и проигнорировал тот факт, что ставка указана в процентах.

enter image description here


Это показывает, как результаты будут рассчитываться вручную:

enter image description here


1 Плюсы использования Datedif:

(1) Работает через границы года в отличие от просто использования функции месяца. (2) Удобно работает с Iferror для определения несовпадающих диапазонов дат.

Минусы использования Datedif:

(1) Это недокументированная функция, которая может быть отозвана в будущем. (2) В данном конкретном случае все вычисления дат выполняются в одном и том же году, поэтому можно использовать месяц.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...