如果用以下方法,只可找到查询日期前的一个工作日期,方法是在C1输入公式:
=VLOOKUP(B2,A2:A366,1,TRUE)
即可。如图:
以下是我帮你写一个VBA的程序完全实现你的要求,担心你不会执行宏指令,特设置了一个按键点击即可执行。
源程序:
Private Sub CommandButton1_Click()
Dim i As Integer
Dim a As Date
i = 2
Do While Cells(i + 1, 1) <= Cells(2, 2)
i = i + 1
Loop
a = Cells(i + 1, 1)
If Month(Cells(2, 2)) < Month(a) Then
Do While Cells(i, 1) = ""
i = i - 1
a = Cells(i, 1)
Loop
End If
Cells(2, 3) = a
End Sub
请加分并采纳我的答案。
C1是要判断的日期,E1输入公式:
=IF(ISERROR(MATCH(C1,A2:A366,0)),IF(MONTH(SMALL(INDIRECT("A"&MATCH(C1,A:A,1)&":A366"),2))>MONTH(C1),TEXT(INDEX(A:A,MATCH(C1,A:A,1)),"YYYY-M-D"),TEXT(SMALL(INDIRECT("A"&MATCH(C1,A:A,1)&":A366"),2),"YYYY-M-D")),"非假期")
关键是要找出比查找日期大一点的那个值(日期)。
先用MATCH的搜索参数1,获得刚好比查找日期小的日期位置。由于搜索区域是整个A列,所以得到的其实就是行号。
用INDIRECT函数定义一个从刚才搜到的比查找日期小一点的行,一直到第366行的区域。再用SMALL函数,在这个区域中找第2小的值,其实就是刚好比查找日期大一点的日期。
C1输入:=IF((B1=VLOOKUP(B1,A:A,1))+(MONTH(MIN(INDIRECT("A"&(MATCH(B1,A:A,1)+1)&":A"&(MATCH(B1,A:A,1)+10))))>MONTH(B1)),VLOOKUP(B1,A:A,1),MIN(INDIRECT("A"&(MATCH(B1,A:A,1)+1)&":A"&(MATCH(B1,A:A,1)+10))))