查找匹配范围的地址

时间:2019-02-21 12:22:03

标签: excel excel-formula

在下图中,我正在尝试查找所有匹配单元格的地址。也就是说,如果在3行中找到了OneSource(例如,它将始终是连续的行),那么我需要显示类似F2:F4的地址。

enter image description here

如您在图片中看到的,我创建了一个公式,该公式为我提供了比赛的第一个实例的地址,但没有给出全部范围的地址。

=CELL("address",INDEX($F$2:$F$12,MATCH(A2,$F$2:$F$12,0),1))

如何获取完整范围的地址?

3 个答案:

答案 0 :(得分:3)

假设数据已排序,则公式中将需要两部分,第一部分获取第一个单元格的地址,第二部分获取最后一个单元格的地址。您已经掌握了第一部分。对于第二部分,您可以使用类似的公式,但是请注意MATCH的不同之处:

=CELL("address",INDEX($F$2:$F$16,MATCH(A2,$F$2:$F$16,0)))&":"&CELL("address",INDEX($F$2:$F$16,MATCH(A2,$F$2:$F$16,1)))

enter image description here


编辑:我早些时候错过了更简单的MATCH解决方案。如果您仍然对以前的数组公式感兴趣,请执行以下操作:

=CELL("address",INDEX($F$2:$F$16,MATCH(A2,$F$2:$F$16,0)))&":"&CELL("address",INDEX($F$2:$F$16,MAX(IF($F$2:$F$16=A2,ROW($F$2:$F$16)-1))))

答案 1 :(得分:2)

排序的数据使您可以利用二进制查找匹配。这些代码比未排序的查询更易于编写,并且在功能上更快。

=ADDRESS(MATCH(A2, E:E, 0), 5, 4)&":"&ADDRESS(MATCH(A2&" ", E:E), 5, 4)

第一个地址是常规的精确匹配。第二个地址是通过在后缀列表中查找后一个空格并附加后缀空格字符来实现的。

由于您要处理的是已知的列,因此我抛弃了CELL函数,转而使用ADDRESS构造函数。

enter image description here

这种对分类数据进行二进制匹配的方法将对未分类数据产生不可靠的结果(结果,不是错误,可能正确或可能不正确)。

答案 2 :(得分:0)

如果您对使用VBA更改事件感兴趣,可以尝试:

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)

    Dim LastrowA As Long, LastrowF As Long, i As Long, y As Long
    Dim Source As String, strAddress As String
    Dim ws As Worksheet

    'Set the sheet which you will use
    Set ws = ThisWorkbook.Worksheets("Sheet1")

    With ws
        'Find Last rows for Column A & F
        LastrowA = .Cells(.Rows.Count, "A").End(xlUp).Row
        LastrowF = .Cells(.Rows.Count, "F").End(xlUp).Row
    End With

    'Chek if the changes intersect our ranges

    If Not Intersect(Target, Range("A:A", "F:F")) Is Nothing Then

        For i = 2 To LastrowA

            Source = ws.Range("A" & i).Value

            Application.EnableEvents = False
                'Count Times
                ws.Range("B" & i).Value = Application.WorksheetFunction.CountIf(ws.Range("F2:F" & LastrowF), Source)

                strAddress = ""
                'Import Address
                For y = 2 To LastrowF
                    If ws.Range("F" & y).Value = Source Then
                        If strAddress = "" Then
                            strAddress = ws.Range("F" & y).Address
                        Else
                            strAddress = strAddress & "," & ws.Range("F" & y).Address
                        End If
                    End If
                Next y

                ws.Range("C" & i).Value = strAddress

            Application.EnableEvents = True

        Next i

    End If

End Sub

结果:

enter image description here