[英]Excel - count days in each month between two dates (both dates available)
我發現解決方案認為分享會很好:
所以公式應該是: =((MAX(CT$6-$N8,0)-MAX(EOMONTH(CT$6,-1)-$N8,0))-(MAX(CT$6-$O8,0)- MAX(EOMONTH(CT$6,-1)-$O8,0))+(EOMONTH(CT$6,0)=EOMONTH($N8,0)))*1
:)
我正在嘗試編寫一個 excel 公式,該公式可以拖過一行單元格以給出兩個指定日期之間每個月的天數。 例如:
我嘗試使用來自同一網站的 if 和 sum product 公式,但由於某種原因,它無法識別上個月的天數。 想知道是否有人可以幫助解釋這個公式的作用以及如何糾正它。
=IFERROR(IF(AND(CS$6>=$M9,CS$6<=$N9),SUMPRODUCT(--(MONTH(ROW(INDIRECT($M9&":"&IF($N9="",TODAY(), $N9))))=MONTH(CS$6))),),"")
一種潛在的解決方案是使用 MIN 和 MAX 函數比較日期,如下所示:
=IF(MIN($B2+1,D$1)-MAX($A2,C$1)<0,"",MIN($B2+1,D$1)-MAX($A2,C$1))
此解決方案使用月份開始日期(例如,2021 年 2 月 1 日),但它可以改為使用月份結束日期(例如,2021 年 2 月 28 日)。
這個想法是你取完成日期或月結束日期中的較晚者減去開始日期或月份開始日期中的較小者。 對於第一個月和最后幾個月,這將返回該范圍內的天數,包括第一天和最后一天。 對於第一個月和最后一個月之間的所有月份,它返回該月的天數。
最小結束日期的 +1 似乎有點違反直覺,但有必要在計數中包括第一天和最后一天。 如果沒有它,您將在 2022 年 3 月獲得 14 天而不是 15 天。
“如果小於零”函數使它在 dat 范圍之外的任何月份返回一個空白(或零,如果你願意)。
此解決方案未按月匯總(例如,2021 年 2 月為 19 天,2022 年為 28 天,2 月總共為 47 天),但這與您提供的示例一致。 評論還表明您還想考慮年份。
第二次修訂 (R2)
根據跨越的年份,R2 代表不太有利的結果重新空間(將需要更多的列)。 在這種情況下,匹配堆疊視圖所需的附加列數 ~100 (!!)。
基於@Charlotte.Sarah.Smith 反饋的第一次修訂 (R1) 等
假設我們想通過按年份堆疊日期來擴展@Will 的解決方案,以便列標題可以根據不同的開始日期而變化(而不是恰好出現的第一個開始日期)......
例如,如果下一行包括“開始 = 10/02/16”到“結束 = 15/03/19”的日期范圍 - 您會意識到跨越 Jan-Dec ('16)、Jan 的列數-Dec ('17),...直到(包括)第一行中的范圍(21 年 1 月 - 23 年 3 月)變得笨拙。
通過使用數據表(請參閱此處),您可以生成每月天數的“堆疊”視圖,而不管年份(!) - 請參閱下面的屏幕截圖並鏈接到此[更新/更正]工作表。
R2截圖:
修訂
請參閱末尾的驗證/對帳列
*視覺表示 - 可用於評估趨勢等。
在 3D 中也很有趣!
1]紅色字體:定義數據表結構的第一行:以“10/02/2021-15/08/2023”格式輸入日期范圍
單元格 E3 eqn(向右拖動):
=IFERROR(IF($A3>EDATE(E$2,1),0,MAX(,IFERROR(IF(MIN($B3,MIN(EDATE(E$2,1),$B3))=E$2-1,0,MIN($B3,MIN(EDATE(E$2,1),$B3))),"")-MAX($A3,E$2))),0)
(類似於我們之前看到的)
2] 紅色字體下方的表格:根據需要/要求在 A、B 列中輸入任何開始日期(作為常規日期,例如 dd/mm/yyyy)< 結束日期(同樣為常規日期)。
數據表
3]數據表(列數據):在單元格c4中輸入以下內容(按要求向下拖動)
=TEXT(A4,"dd/mm/yyyy")&"-"&TEXT(B4,"dd/mm/yyyy")
4]數據表(突出顯示單元格c3:d42,插入數據表,為“行輸入”選擇空白/空單元格,為“列輸入”選擇c2)
否則,數據表應該“栩栩如生”(計算表,Shift + F9)。
過濾器XML
5] 通過分隔符“|”分割結果使用 FilterXML 如下(單元格 E4,僅向下拖動,而不是向右拖動):
=IFERROR(TRANSPOSE(FILTERXML("<AllText><Num>"&SUBSTITUTE(LEFT(MID(D4,2,LEN(D4)-1),LEN(MID(D4,2,LEN(D4)-1))-1),"|","</Num><Num>")&"</Num></AllText>","//Num")),"")
驗證
請注意檢查列:日期差異 = 表格中的天數總和(默認單元格顏色否則為紅色):
修訂 2
這是上述靜態版本的公式(即沒有按年份堆疊,相反,列標題中的每個日期都是不同的重新計算) - 它已經在帶有紅色字體的行中可用(!!)
=IFERROR(IF($A3>EDATE(C$2,1),0,MAX(,IFERROR(IF(MIN($B3,MIN(EDATE(C$2,1),$B3))=C$2-1,0,MIN($B3,MIN(EDATE(C$2,1),$B3))),"")-MAX($A3,C$2))),0)
中提琴!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.