2017-05-09 135 views
2

下面是一個可以幫助我預防偏頭痛的方法嗎? :-)計算多個日期範圍中的獨特日期

我有一張表中的一列包含開始日期和另一個結束日期。我有第三列來計算開始日期和結束日期之間有多少天(添加1以獲得正確的計數,因爲開始日期等於結束日期需要計爲一天,而不是零)。

然而,不同的行的時間段可以重疊,所以可具有介於(警告:英國日期格式DD/MM/YY):

Start  End   Days 
22/01/17 26/01/17 5 
24/01/17 24/01/17 1 

因爲第24是在第一行中已經計數,我當我得到所有日子的總數時,不想再次數它。我怎樣才能做到這一點?

在此先感謝!

Lucien。

回答

1

長話短說 - 我想不出一個好的和明確的方式來做到這一點,只需用Excel。 然而,VBA有一個好辦法:

Option Explicit 

Public Sub TestMe() 

    Dim lngCounter   As Long 
    Dim dtStartDate   As Date 
    Dim dtEndDate   As Date 
    Dim collDates   As New Collection 

    dtStartDate = CDate("22.01.2015") 
    dtEndDate = CDate("25.01.2015") 

    For lngCounter = dtStartDate To dtEndDate 
     If Not Contains(collDates, lngCounter) Then 
      collDates.Add lngCounter 
     End If 
    Next lngCounter 

    dtStartDate = CDate("23.01.2015") 
    dtEndDate = CDate("28.01.2015") 

    For lngCounter = dtStartDate To dtEndDate 
     If Not Contains(collDates, lngCounter) Then 
      collDates.Add lngCounter 
     End If 
    Next lngCounter 

    For lngCounter = 1 To collDates.Count 
     Debug.Print CDate(collDates(lngCounter)) 
    Next lngCounter 

End Sub 

Public Function Contains(ByRef col As Collection, ByRef key As Variant) As Boolean 

    Dim lngCounter As Long 

    Contains = True 

    For lngCounter = 1 To col.Count 
     If col(lngCounter) = key Then Exit Function 
    Next lngCounter 

    Contains = False 

End Function 

你給兩次dtStartDatedtEndDate和你之間的數字保存日期的集合collDates中,如果它們已經不存在。

+0

感謝。這是類似的解決方案的人在其他地方建議,我開始使用: '顯式的選項 功能UniqueDayCount(RSTART量程,雷德作爲範圍)只要 昏暗的山坳作爲收藏 昏暗的vStart爲Variant,鬻爲Variant 暗淡我作爲龍,J只要 的vStart = RSTART 鬻=雷德 上的錯誤繼續下一步 集山坳=新集合 對於i = 1到UBound函數(的vStart) 對於J =的vStart(I,1)爲販賣(I, 1) col.Add Item:= J,Key:= CStr(J) Next J Next I On Error轉至0 UniqueDayCount = col.Count End Function ' –

+0

您可以將代碼放入pastebin.com嗎?並給一個鏈接? :) – Vityata

0

如果在列A中有開始日期,列B中的結束日期和列C中的結果日期差異,則可以在列D和E中使用以下兩個數組公式計算雙精度值(此解決方案不需要升序)。

請注意,這這些都是數組公式,您有按Ctrl +確認他們 + 輸入,而不是僅按輸入 - 鍵。

列d:

=COUNT(IF(ISNUMBER(SEARCH(A2-1+(ROW(INDIRECT("A1:A"&C2))),E1)),"",A2-1+(ROW(INDIRECT("A1:A"&C2))))) 

E列:

=TEXTJOIN(",",TRUE,IF(ISNUMBER(SEARCH(A2-1+(ROW(INDIRECT("A1:A"&C2))),E1)),"",A2-1+(ROW(INDIRECT("A1:A"&C2)))),E1) 

您需要的Excel 2016,所以你可以達到預期的效果,因爲textjoin() - 函數是一個新的。

count distinct textjoin

它是如何工作的: 數組公式分裂所有起始日期和結束日期之間的日期爲行和搜索它們作爲連接字符串的一個整數,如果有比賽,該日期將被「空白」,其他不同的結果將與先前保存在不斷增長的字符串中的不同結果連接起來。

+0

非常聰明。我一直在思考相同的問題,但無法完成它的工作。這可以'隱形'完成嗎?考慮到它的累積性,性能不會比UDF /宏慢嗎? –

1

如果要求每行和每列都總天數,那麼你可以總是有一個單獨的列中添加獨特的天(假定起始日期是按日期順序排列) enter image description here

+0

不幸的是,訂單不能保證,並且日期間有重疊和間隔。 –

0

另一種方法來使所使用的日期的列表是通過產生過日期的整個範圍內(到最近的結束日期從最早的開始日期)的陣列,以使用一個「篩子」的方法則在所使用的那些填充

=SUMPRODUCT(SIGN(COUNTIFS(A2:A10,"<="&ROW(INDIRECT(MIN(A2:A10)&":"&MAX(B2:B10))),B2:B10,">="&ROW(INDIRECT(MIN(A2:A10)&":"&MAX(B2:B10)))))) 

enter image description here

(D列中的數字剛剛作爲支票手動輸入,並未在計算中使用)。

這顯示了數組的樣子

enter image description here

+0

Tom在哪裏存儲數組? –

+0

該陣列只是暫時的,它不存儲在任何地方。如果您取公式= SIGN(COUNTIFS(A2:A10,「<=」&ROW(INDIRECT(MIN(A2:A10)&「:」&MAX(B2:B10))), B2:B10「 > =「&ROW(INDIRECT(MIN(A2:A10)&」:「&MAX(B2:B10)))))並將其作爲數組公式輸入到一個單元格區域中,您會看到該數組映射爲一系列0(不使用日期)和1(使用日期)。 –