我在工作表中有两列,如下面的列表。
我想要做的是从第二列中提取值,但前提是相应的第一列值与我指定的值匹配。我可以使用Vlookup,但是我也希望能够从第一列匹配的数组中指定行号。
例如,如果我将值设置为“2”并将行号设置为“2”,它将给出值14,因为它与第1列中的第一个值匹配并创建了一个数组,然后给了我第二行那个数组是14。
有什么想法吗?
1 10
1 11
1 12
2 13
2 14
2 15
3 16
3 17
3 18
答案 0 :(得分:1)
答案Selecting the second result of a “Find” with VBA可以扩展到您的案例,使用您要查找的出现次数作为输入。
这是Excel Lookup nth Occurrence/Instance的改编:
Function FindNth(Table As Range, Val1 As Variant, Val1Occrnce As Integer, ResultCol As Integer)
'Finds the Nth value in the first Column of a table that has a stated value on the same row in another Column.
Dim i As Integer
Dim iCount As Integer
Dim rCol As Range
iCount = 0
For i = 1 To Table.Rows.Count
If (Table.Cells(i, 1) = Val1) Then
iCount = iCount + 1
End If
If iCount = Val1Occrnce Then
FindNth = Table.Cells(i, ResultCol)
Exit For
End If
Next i
End Function
以下是使用用户定义函数的结果(公式栏显示单元格G3中的公式):
答案 1 :(得分:1)
如果您的数据按照示例中的顺序排序,即。通过第一列升序,然后第二列升序。然后,您可以使用OFFSET()
,INDEX()
和MATCH()
的组合。
=OFFSET(INDEX(second_column,MATCH(lookup_a,first_column,0)),entry_row-1,0)
首先获取与您的查找值匹配的第一个单元格的INDEX(..., MATCH())
的单元格地址,然后OFFSET()
函数将该区域中的所需行数减少。当然,这完全取决于所描述的分类。
如果您想要未排序的第二列中的第k - 最小条目(但仍然在第一列上分组),那么您可以使用:
=SMALL(OFFSET(second_column,MATCH(lookup_a,first_column,0)-1,0,MATCH(lookup_a,first_column,1)-MATCH(lookup_a,first_column,0)+1,1),entry_row)
如果您移出选区范围,则返回#N/A
的优点是。用IFERROR(...., "")
围绕它。
或者,对于未排序的第二列数据使用第一种方法,只检查偏移量以查看它是否保留查找值,您可以使用:
=IF(OFFSET(OFFSET(INDEX(second_column,MATCH(lookup_a,first_column,0)),entry_row-1,0),0,-1)=lookup_a,OFFSET(INDEX(second_column,MATCH(lookup_a,first_column,0)),entry_row-1,0),"")