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