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

EXCEL-将日期与日期范围列进行比较,如果在范围内,则与行单元格进行比较,excel,date,excel-formula,Excel,Date,Excel Formula,我在没有使用VBA的情况下很难得到一个工作公式(如果需要,我可以使用VBA,但没有经验)。所以我试图做的是取一个给定的日期,看看它是否在日期范围内的列表中,如果它在某个日期范围内,它应该与它与日期范围匹配的同一行中的单元格进行比较。如果没有,它应该继续搜索,直到找到另一个日期范围匹配,或者耗尽列表并返回值false 到目前为止,我已经尝试了一些类似于If(NumbertoMatch(VLOOKUP)和(Date>Date1,Date的东西,请考虑以下屏幕截图: J2中的公式为 =IF(SUMP

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


到目前为止,我已经尝试了一些类似于
If(NumbertoMatch(VLOOKUP)和(Date>Date1,Date的东西,请考虑以下屏幕截图:

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,"")
不要在数组公式中使用整列,因为这样会减慢速度

使用公式,您只能找到匹配的第一个匹配项,因此无法为多个匹配项返回多个行号

编辑:匹配函数的说明

MATCH(1,(G2>=$C$2:$C$15)*(G2<=$D$2:$D$15),0)
再次使用Ctrl+Shift+Enter进行确认。此外,如果存在多个匹配项,则只有第一个匹配项才会触发TRUE

或者,如果您只需要行数

=MATCH(1,(G2>=$C$2:$C$16)*(G2<=$D$2:$D$16)*(H2=$A$2:$A$16),0)+1

=匹配(1,(G2>=$C$2:$C$16)*(G2考虑以下屏幕截图:

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,"")
不要在数组公式中使用整列,因为这样会减慢速度

使用公式,您只能找到匹配的第一个匹配项,因此无法为多个匹配项返回多个行号

编辑:匹配函数的说明

MATCH(1,(G2>=$C$2:$C$15)*(G2<=$D$2:$D$15),0)
再次使用Ctrl+Shift+Enter进行确认。此外,如果存在多个匹配项,则只有第一个匹配项才会触发TRUE

或者,如果您只需要行数

=MATCH(1,(G2>=$C$2:$C$16)*(G2<=$D$2:$D$16)*(H2=$A$2:$A$16),0)+1

=MATCH(1,(G2>=C$2:$C$16)*(G2VBA解决方案假设数据位于工作表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
Sub FindRow()
将ws设置为工作表:设置ws=Active工作簿。工作表(1)
Dim collDateRng As Range:设置collDateRng=ws.Range(“G2”,ws.Range(“G2”).End(xlDown))
变暗rng As范围
Dim resultsRng As范围
变暗rowRng As范围
将结果变暗为字符串
Application.ScreenUpdating=False
与ws
collDateRng.Offset(0,2).ClearContents
对于collDateRng中的每个rng
如果.AutoFilterMode,则.AutoFilterMode=False
带.Cells(1,1).CurrentRegion
.AutoFilter字段:=1,准则1:=rng.Offset(0,1).Value
.AutoFilter字段:=3,标准1:=“”&rng.Value
使用.Resize(.Rows.Count-1,4).Offset(1,0)
如果是CBool(Application.Subtotal(103.Cells)),则
.选择
Set resultsRng=Selection.SpecialCells(xlCellTypeVisible)
其他的
找不到任何东西
如果结束
以
以
对于resultsRng.Rows中的每个rowRng
如果结果为“”,则
result=result&“,”和rowRng.Row
其他的
结果=rowRng.Row
如果结束
下一轮
rng偏移量(0,2)。值=结果
result=“”
没有发现:
下一个rng
如果.AutoFilterMode,则.AutoFilterMode=False
.单元格(1,1)。选择
以
Application.ScreenUpdating=True
端接头

VBA解决方案假定数据位于工作表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
Sub FindRow()
将ws设置为工作表:设置ws=Active工作簿。工作表(1)
Dim collDateRng As Range:设置collDateRng=ws.Range(“G2”,ws.Range(“G2”).End(xlDown))
变暗rng As范围
Dim resultsRng As范围
变暗rowRng As范围
将结果变暗为字符串
Application.ScreenUpdating=False
与ws
collDateRng.Offset(0,2).ClearContents
对于collDateRng中的每个rng
如果.AutoFilterMode,则.AutoFilterMode=False
带.Cells(1,1).CurrentRegion
.AutoFilter字段:=1,准则1:=rng.Offset(0,1).Value
.AutoFilter字段:=3,标准1:=“”&rng.Value
使用.Resize(.Rows.Count-1,4).Offset(1,0)
如果是CBool(Application.Subtotal(103.Cells)),则
.选择
Set resultsRng=Selection.SpecialCells(xlCellTypeVisible)
其他的
找不到任何东西
如果结束
以
以
对于resultsRng.Rows中的每个rowRng
如果结果为“”,则
result=result&“,”和rowRng.Row
其他的
结果=rowRng.Row
如果结束
下一轮
rng偏移量(0,2)。值=结果
result=“”
没有发现:
下一个rng
如果.AutoFilterMode,则.AutoFilterMode=False
.单元格(1,1)。选择
以
Application.ScreenUpdating=True
端接头

=索引(C2:C6,SUMPRODUCT(-)(日期()>A2:A6),-(日期
=索引(C2:C6,匹配(1)(日期>A2:A6)*(日期你能用几行样本数据发布数据布局的屏幕截图,并手动模拟所需结果吗?如果我们所拥有的只是一个不起作用的公式,那么很难想象你想要实现什么。编辑你的问题以添加屏幕截图和解释。不要在评论中这样做。然后发布评论并提及@teylyn以通知您的更改。@teylyn完成。因此,我想我还应该注意,它是Excel 2016 Mac,最后一行是我最终想要的,但我也很乐意从真/假第二行到最后一行。公式将取单元格G2或H2,然后将其与所有其他日期和单元格进行比较,以进行匹配。单元格G2和H2是l墨水,就像