日期介于多个条件之间的行(仅 excel)

Rows with dates between multiple conditions (excel only)

我有 Column A:

str 11/9/2007
end 10/10/2008
str 11/14/2008
end 5/29/2009
str 11/27/2009
end 2/5/2010
str 10/8/2010
end 4/8/2011
str 4/29/2011
end 5/20/2011
str 7/8/2011
end 10/21/2011

Column B:

9/6/2007
9/7/2007
9/10/2007
9/11/2007
9/12/2007
9/13/2007
9/14/2007
9/17/2007
9/18/2007
9/19/2007
9/20/2007
9/21/2007
9/24/2007
9/25/2007
9/26/2007
9/27/2007
9/28/2007
10/1/2007
10/2/2007
10/3/2007
10/4/2007
10/5/2007
10/8/2007
10/9/2007
10/10/2007
10/11/2007
10/12/2007
10/15/2007
10/16/2007

如果 Column B 日期在 startend 范围内,我想在 Column B 旁边的列中插入 1Column A。所以预期的输出是这样的:

0
0
0
1
1
1
1
1
1
1
1
1
1
1

有什么建议吗?

Sub CheckingDates()
Dim Value1 As Date, Value2 As Date, Value3 As Date

For j = 1 To 12 Step 2
    For i = 1 To 29
        Value1 = Right(Range("A" & j), Len(Range("A" & j)) - 4)
        Value2 = Right(Range("A" & j + 1), Len(Range("A" & j + 1)) - 4)
        Value3 = Range("B" & i).Value
            If Value3 > Value1 And Value3 < Value2 Then
                Range("C" & i).Value = "1"
            End If
    Next i
Next j
End Sub

让 s(i) 和 e(i) 表示您的开始和结束日期 (i=1,2,3,...,N),t 表示目标日期。

您需要查找是否存在满足 s(i)<=t<=e(i) 的 i 值。

您可以使用 MATCH 函数来执行此操作。

s(i) 和 e(i) (i=1,2,3,...,N) 应分别按升序排列(如评论者@pnuts 所建议)。让 StartEnd 分别表示包含这些开始日期和结束日期列的范围。让 Target 表示目标日期,t.

=MATCH(Target,Start,1) returns Start 内日期的索引,即目标日期或之前的最新日期。所以它 returns 索引的候选值,i 使得 s(i)<=t。剩下的就是测试这个候选值是否e(i)>=t,即

=INDEX(End,MATCH(Target,Start,1))>=Target

一般来说,如果存在 i 的值满足 s(i)<=t<=e(i),否则会提供 TRUE,否则会提供 FALSE。当目标日期 t 出现在第一个开始日期 s(1) 之前时,就会出现这种情况的例外情况。在这种情况下,传递了错误值 #N/A。您可以使用 IFERROR 函数捕获它以传递 FALSE ,并且您可以使用通常的方法将布尔值 TRUEFALSE 转换为您正在寻找的 0 和 1 结果--(双重否定)运算。

重要的是开始日期和结束日期按升序(从早到晚)排列。否则,此解决方案将不起作用。