我有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
如果1
日期位于Column B
和Column B
范围内,我希望在start
旁边的列中插入end
在Column A
。所以预期的输出是这样的:
0
0
0
1
1
1
1
1
1
1
1
1
1
1
请提示?
答案 0 :(得分: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
答案 1 :(得分:1)
设s(i)和e(i)表示您的开始和结束日期(i = 1,2,3,...,N)和目标日期。
你需要找出是否存在i的值,使得s(i)&lt; = t&lt; = e(i)。
您可以使用MATCH
功能执行此操作。
s(i)和e(i)(i = 1,2,3,...,N)应按升序排列(按照评论者@pnuts的建议)。让Start
和End
分别表示包含这些开始日期和结束日期列的范围。让Target
表示目标日期,t。
=MATCH(Target,Start,1)
返回Start
内日期的索引,该日期是目标日期或之前的最新日期。因此,它返回索引的候选值,i使得s(i)<= t。剩下的就是测试该候选值的e(i)> = t,即
=INDEX(End,MATCH(Target,Start,1))>=Target
通常,如果存在i的值,则这将传递TRUE
,否则s(i)&lt; = t&lt; = e(i)和FALSE
。当目标日期t出现在第一个开始日期s(1)之前时,会发生这种情况的例外。在这种情况下,传递错误值#N/A
。你可以使用IFERROR
函数来识别这一点来代替FALSE
,你可以将布尔值TRUE
和FALSE
转换为你想要的0和1结果--
(双重否定)操作。
重要的是,开始日期和结束日期按升序(最早的第一个)顺序排列。如果不是这个解决方案将不起作用。