EXCEL – 将date与date范围列进行比较,然后在范围内与行单元格进行比较
我无法得到一个工作公式,而不使用VBA(如果需要,我可以使用VBA,但没有经验)。 所以我试图做的是采取一个给定的date,看它是否在一个列表如果date范围,如果它是在一个特定的date范围内,它应该比较与它匹配的date在同一行的单元格范围。 如果没有,它应该继续search,直到find另一个date范围匹配或耗尽列表并返回false值。
到目前为止,我已经沿着If(NumbertoMatch(VLOOKUP(AND(Date>Date1,Date<Date2),Table,NumbertoMatch,False),TRUE,FALSE)
编辑#2添加一个图像的细胞将比较。
编辑#3添加公式应该考虑的规则。
在这里input图像说明
提前致谢!
考虑这个屏幕截图:
J2中的公式是
=IF(SUMPRODUCT((G2>=$C$2:$C$15)*(G2<=$D$2:$D$15)),MATCH(1,(G2>=$C$2:$C$15)*(G2<=$D$2:$D$15),0)+1,"")
这是一个数组公式,并且必须用Ctrl + Shift + Enter确认。
I2中的公式使用该行号,并将该行中的标识符与H2中的值进行比较。 如果没有匹配,那么比较将会抛出一个错误,所以IfError会捕获这个错误并将其变成一个FALSE。
=IFERROR(INDEX(A:A,J2)=H2,FALSE)
不要在数组公式中使用整列,因为这会降低速度。
有了公式,你将只能find匹配的第一次出现,所以返回多个匹配的行号是不可能的。
编辑:MATCHfunction的说明。
MATCH(1,(G2>=$C$2:$C$15)*(G2<=$D$2:$D$15),0)
作为数组函数input时,将发生以下情况:
-
(G2>=$C$2:$C$15)
将parsing为True或False值的数组,每个单元格一个 -
(G2<=$D$2:$D$15)
将parsing为一个True或False值的数组,每行一个 - 这两个数组一次乘以一行。 如果TRUE与TRUE相乘,则结果为1.所有其他组合将为0。
- 这是匹配1将被检查的范围。第一个1的位置将被返回
由于数据在第2行开始,我想要绝对行号,我必须添加1来匹配的结果。 匹配会返回12,因为date与数据的第12行(电子表格中的第13行)匹配。
您可以看到这些步骤使用公式function区上的“评估公式”工具进行。
另一个编辑:
如果列G中的date落在时间范围内,并且列H中的标识符与列A中的标识符相同,则此公式将仅返回TRUE:
=IFERROR(INDEX(A:A,IF(SUMPRODUCT((G2>=$C$2:$C$15)*(G2<=$D$2:$D$15)),MATCH(1,(G2>=$C$2:$C$15)*(G2<=$D$2:$D$15)*(H2=$A$2:$A$15),0)+1,""))=H2,FALSE)
再次按Ctrl + Shift + Enter确认。 此外,如果有多个匹配,只有第一个匹配将触发TRUE。
或者如果你只想要行号
=MATCH(1,(G2>=$C$2:$C$16)*(G2<=$D$2:$D$16)*(H2=$A$2:$A$16),0)+1
VBA解决scheme假定数据在工作表1中,列A,B,C,D,G和H填充。 代码将抓取匹配的行#到列I.将此代码复制到一个模块。 如果有多行,那么它将用逗号隔开,如此截图所示
使用这个代码
Sub FindRow() Dim ws As Worksheet: Set ws = ActiveWorkbook.Worksheets(1) Dim collDateRng As Range: Set collDateRng = ws.Range("G2", ws.Range("G2").End(xlDown)) Dim rng As Range Dim resultsRng As Range Dim rowRng As Range Dim result As String Application.ScreenUpdating = False With ws collDateRng.Offset(0, 2).ClearContents For Each rng In collDateRng If .AutoFilterMode Then .AutoFilterMode = False With .Cells(1, 1).CurrentRegion .AutoFilter field:=1, Criteria1:=rng.Offset(0, 1).Value .AutoFilter field:=3, Criteria1:="<" & rng.Value .AutoFilter field:=4, Criteria1:=">" & rng.Value With .Resize(.Rows.Count - 1, 4).Offset(1, 0) If CBool(Application.Subtotal(103, .Cells)) Then .Select Set resultsRng = Selection.SpecialCells(xlCellTypeVisible) Else GoTo NothingFound End If End With End With For Each rowRng In resultsRng.Rows If result <> "" Then result = result & ", " & rowRng.Row Else result = rowRng.Row End If Next rowRng rng.Offset(0, 2).Value = result result = "" NothingFound: Next rng If .AutoFilterMode Then .AutoFilterMode = False .Cells(1, 1).Select End With Application.ScreenUpdating = True End Sub