日期介于多个条件之间的行(仅 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
日期在 start
和 end
范围内,我想在 Column B
旁边的列中插入 1
在 Column 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 所建议)。让 Start
和 End
分别表示包含这些开始日期和结束日期列的范围。让 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
,并且您可以使用通常的方法将布尔值 TRUE
和 FALSE
转换为您正在寻找的 0 和 1 结果--
(双重否定)运算。
重要的是开始日期和结束日期按升序(从早到晚)排列。否则,此解决方案将不起作用。
我有 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
日期在 start
和 end
范围内,我想在 Column B
旁边的列中插入 1
在 Column 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 所建议)。让 Start
和 End
分别表示包含这些开始日期和结束日期列的范围。让 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
,并且您可以使用通常的方法将布尔值 TRUE
和 FALSE
转换为您正在寻找的 0 和 1 结果--
(双重否定)运算。
重要的是开始日期和结束日期按升序(从早到晚)排列。否则,此解决方案将不起作用。