在下图中,我正在尝试查找所有匹配单元格的地址。也就是说,如果在3行中找到了OneSource(例如,它将始终是连续的行),那么我需要显示类似F2:F4的地址。
如您在图片中看到的,我创建了一个公式,该公式为我提供了比赛的第一个实例的地址,但没有给出全部范围的地址。
=CELL("address",INDEX($F$2:$F$12,MATCH(A2,$F$2:$F$12,0),1))
如何获取完整范围的地址?
答案 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)))
编辑:我早些时候错过了更简单的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构造函数。
这种对分类数据进行二进制匹配的方法将对未分类数据产生不可靠的结果(结果,不是错误,可能正确或可能不正确)。
答案 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
结果: