我无法在不使用VBA的情况下获得有效的配方(如果需要我可以使用VBA,但没有经验)。所以我试图做的是获取一个给定的日期,看它是否在列表中是否有日期范围,如果它在某个日期范围内,它应该与它与日期匹配的同一行中的单元格进行比较范围。如果没有,它应继续搜索,直到找到另一个日期范围匹配或耗尽列表并返回值false。
到目前为止,我已经尝试了If(NumbertoMatch(VLOOKUP(AND(Date>Date1,Date<Date2),Table,NumbertoMatch,False),TRUE,FALSE)
编辑#2添加单元格将与之比较的图像。
编辑#3添加公式应该考虑的规则。
提前致谢!
答案 0 :(得分:1)
考虑一下这个截图:
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)
不要在数组公式中使用整列,因为这样会减慢速度。
使用公式,您将只能找到匹配的第一次出现,因此无法返回多个匹配的多个行号。
编辑:MATCH功能的说明。
MATCH(1,(G2>=$C$2:$C$15)*(G2<=$D$2:$D$15),0)
当作为数组函数输入时,将发生以下情况:
(G2>=$C$2:$C$15)
将解析为True或False值的数组,每个单元格一个(G2<=$D$2:$D$15)
将解析为True或False值的数组,每行一个由于数据从第2行开始,我想要绝对行号,我必须在Match中为结果添加1。匹配返回12,因为日期与数据的第12行匹配,即电子表格中的第13行。
您可以使用“公式”功能区上的“评估公式”工具查看这些步骤。
另一个编辑:
如果G列中的日期落在时间范围内且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
答案 1 :(得分:0)
VBA解决方案假设数据在工作表1中,列A,B,C,D,G&amp; 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