Рассчитать дни каждого месяца в диапазоне дат в формуле Excel

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

Затем для этих дат мне нужно рассчитать сумму денег, которую они получают, пропорционально количеству дней в месяце. (300 долларов США/дни месяца) * дни включают

Пример:

Дата 19.02.2024 - 16.06.2024

Дни, которые мне нужно вычислить:

(февраль: 11 дней)+(март: 31 день)+(апрель: 30 дней)+(май: 31 день)+(июнь: 16 дней)

Всего дней: 119 дней

Сумма, которую мне нужно рассчитать:

(Февраль: (300 долларов США/29 дней)*11 дней)+(Март: (300 долларов США/31 день)*31 день)+(Апрель: (300 долларов США/30 дней)*30 дней)+(Май: (300 долларов США/31 день)*31 день)+(Июнь : (300 долларов США/30 дней)*16 дней)

Общая выплаченная сумма: 1 173,80 долларов США.

Как мне посчитать это в Excel и возможно ли это вообще в одной ячейке?

Преобразование HTML-таблицы в профессиональный документ Excel
Преобразование HTML-таблицы в профессиональный документ Excel
Это самый простой способ создания Excel из HTML-таблицы.
Импорт excel в laravel в базу данных
Импорт excel в laravel в базу данных
Здравствуйте, дорогой читатель, в этой статье я расскажу практическим и быстрым способом, как импортировать файл Excel в вашу базу данных с помощью...
0
0
165
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Используйте функцию DATEDIF().

=DATEDIF(A1,B1,"D")+1

Как это поможет при пропорциональном распределении расходов по различным месяцам?

derpirscher 10.06.2024 08:59

Я не уверен, что именно это вы просите, чтобы получить общую выплаченную сумму:


• Формула, используемая в ячейке B2

=LET(
     _StartDate, TEXTBEFORE(A2," - "),
     _EndDate, TEXTAFTER(A2," - "),
     _FirstDay, EOMONTH(_StartDate,-1)+1,
     _Dates, TEXT(HSTACK(SEQUENCE(_EndDate-_StartDate+1,,_StartDate),
     SEQUENCE(EOMONTH(_EndDate,0)-_FirstDay,,_FirstDay)),"emmm"),
     _Uniq, UNIQUE(TOCOL(_Dates,2)),
     _Output, MAKEARRAY(ROWS(_Uniq),1, LAMBDA(r,c, LET(b, INDEX(_Uniq,r),
    INDEX(SUM(N(b=TOCOL(TAKE(_Dates,,1),2)))*(300/SUM(N(b=TAKE(_Dates,,-1)))),c)))),
     ROUND(SUM(_Output),2))

Используя GROUPBY(), если применимо, тогда:

=LET(
     _StartDate, TEXTBEFORE(A2," - "),
     _EndDate, TEXTAFTER(A2," - "),
     _FirstDay, EOMONTH(_StartDate,-1)+1,
     _Dates, TEXT(SEQUENCE(_EndDate-_StartDate+1,,_StartDate),"emmm"),
     _ActualDates, TEXT(SEQUENCE(EOMONTH(_EndDate,0)-_FirstDay,,_FirstDay),"emmm"),
     ROUND(SUM(DROP(GROUPBY(_Dates,_Dates,ROWS,,0)*
     (300/GROUPBY(_ActualDates,_ActualDates,ROWS,,0)),,1)),2))

Эта формула принимает три части диапазона дат. Начало, конец и промежуточные месяцы. Работает и на старых версиях.

=SUM((EOMONTH(B44,0)-B44+1)*300/(EOMONTH(B44,0)-EOMONTH(B44,-1)),
 IF((YEAR(C44)-YEAR(B44))*12+MONTH(C44)-MONTH(B44)>1,300*((YEAR(C44)-YEAR(B44))*12+MONTH(C44)-MONTH(B44)-1)),
(C44-EOMONTH(C44,-1))*300/(EOMONTH(C44,0)-EOMONTH(C44,-1)))

IF проверяет, есть ли в заданном диапазоне какой-либо полный месяц, и если да, то рассчитывает его значение со ставкой 300 долларов в месяц.

Эта формула работает! но мне все еще нужно понять, как он рассчитывается, для моего будущего понимания. Итак, я понимаю, что из этого следует ((включаемые дни месяца) * 300)/дни месяца), __ тогда мне непонятна часть IF. как вы рассчитываете проверить >1300. а какой номер 1300?

Asifa.K 18.06.2024 10:34

Запятая является знаком разделителя функции. В некоторых языках это может быть десятичное число (как на скриншоте, где разделителем является точка с запятой), но в формуле это разделитель IF между критериями и возвращаемым значением, когда TRUE

Black cat 18.06.2024 10:52

Если у вас есть 365 и каждая дата находится в отдельной ячейке с именем first и last, а сумма за месяц находится в ячейке с именем amt, то:

=LET(
    fullMonths, DATEDIF(
        DATE(YEAR(first), MONTH(first), 1),
        DATE(YEAR(last), MONTH(last) - 1, 1),
        "m"
    ),
    firstFx, (DAY(EOMONTH(first, 0)) - DAY(first) + 1) /
        DAY(EOMONTH(first, 0)),
    lastFx, DAY(last) / DAY(EOMONTH(last, 0)),
    SUM(fullMonths, firstFx, lastFx) * amt
)

Если ваш диапазон дат находится в одной ячейке, вы можете включить функцию TEXTSPLIT для анализа фрагментов.

Если у вас более ранняя версия Excel, вы можете использовать тот же алгоритм с более сложной для понимания формулой:

=(
    DATEDIF(
        DATE(YEAR(first), MONTH(first), 1),
        DATE(YEAR(last), MONTH(last) - 1, 1),
        "m"
    ) +
        (DAY(EOMONTH(first, 0)) - DAY(first) + 1) /
            DAY(EOMONTH(first, 0)) +
        DAY(last) / DAY(EOMONTH(last, 0))
) * 300
Ответ принят как подходящий

Обратите внимание, что вы можете факторизовать свое выражение: сумма является общим коэффициентом, поэтому вам просто нужно умножить 300 на количество полных месяцев, а затем добавить пропорциональные месяцы (февраль и июнь в вашем примере), умноженные на 300.

Зная это, более короткая формула будет такой:

=((DATEDIF(EOMONTH(B1,0)+1,DATE(YEAR(C1),MONTH(C1),1),"m"))*A1)+((((DAY(EOMONTH(B1,0)))-DAY(B1)+1)/(DAY(EOMONTH(B1,0))))*A1)+((DAY(C1)/DAY(EOMONTH(C1,0)))*A1)

простая для понимания формула и она работает. однако возникнет ошибка в ситуации, когда начало и конец приходятся на один и тот же месяц. Например: 1 апреля 2024 г. – 15 апреля 2024 г.

Asifa.K 18.06.2024 10:55

Другие вопросы по теме