这是我的头脑,所以也许有人可以帮助预防偏头痛? : - )
我有一张表,其中一列包含开始日期,另一列包含结束日期。我有第三列计算开始日期和结束日期之间的天数(添加1以获得正确的计数,因为等于结束日期的开始日期需要计为一,而不是零)。
然而,在不同的行之间,期间可以重叠,所以我可以(警告:英国日期格式dd / MM / yy):
Start End Days
22/01/17 26/01/17 5
24/01/17 24/01/17 1
因为第24行已计入第一行,所以当我得到所有日子的总数时,我不想再计算它。我怎么能实现这个?
提前致谢!
吕西安。
答案 0 :(得分: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
您提供两次dtStartDate
和dtEndDate
,并将日期保存为集合collDates
中的数字,如果它们不存在的话。
答案 1 :(得分:1)
答案 2 :(得分:0)
如果您在A列中有开始日期,B列中的结束日期和C列中的日期差异,则可以使用D和E列中的以下两个数组公式计算不加倍数(此解决方案不需要提升顺序)。
请注意,这些是数组公式,您必须使用 Ctrl + Shift + 输入来确认它们,而不是仅按下输入 - 键。
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() - 函数是一个新的。
它是如何工作的: 数组公式将开始日期和结束日期之间的所有日期拆分为行,并在连接字符串中将它们作为整数进行搜索,如果匹配,则日期将为"空白" out和其他不同的结果将与之前保存在不断增长的字符串中的不同结果连接在一起。
答案 3 :(得分:0)