EXCEL - 将日期与日期范围列进行比较,然后,如果在该范围内,则与行单元格进行比较

时间:2017-07-06 04:01:36

标签: excel date excel-formula

我无法在不使用VBA的情况下获得有效的配方(如果需要我可以使用VBA,但没有经验)。所以我试图做的是获取一个给定的日期,看它是否在列表中是否有日期范围,如果它在某个日期范围内,它应该与它与日期匹配的同一行中的单元格进行比较范围。如果没有,它应继续搜索,直到找到另一个日期范围匹配或耗尽列表并返回值false。

到目前为止,我已经尝试了If(NumbertoMatch(VLOOKUP(AND(Date>Date1,Date<Date2),Table,NumbertoMatch,False),TRUE,FALSE)

的内容

编辑#2添加单元格将与之比较的图像。

enter image description here

编辑#3添加公式应该考虑的规则。

enter image description here

提前致谢!

2 个答案:

答案 0 :(得分:1)

考虑一下这个截图:

enter image description here

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值的数组,每行一个
  • 这两个数组一次乘以一行。如果TRUE乘以TRUE,则结果为1.所有其他组合将为0.
  • 这是匹配1将要检查的范围。将返回第一个1的位置

enter image description here

由于数据从第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.将此代码复制到模块。如果有多行,则用逗号分隔它们,如此截图所示

screenshot

使用此代码

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