我尝试MATCH
在数组公式中使用该函数来返回多个匹配项(默认情况下它只返回第一个匹配项)。但是,这似乎不起作用。如果没有复杂的、难以理解的公式,我该如何解决这个问题?
3 回答
这个怎么样,没有VBA?[使用 CTRL + SHIFT + ENTER 作为数组公式在单元格 C9 上输入,其中您的搜索列是 A9:A24,您的搜索词在 B1:B4 中],然后向下拖动以查找多个匹配项?
=SMALL(IFERROR(MATCH($B$1:$B$4,$A$9:$A$24,0),""),ROW()-ROW($C$8))
这首先使用数组公式显示搜索列中匹配的任何搜索词的每个“命中”,然后使用 Small 函数参考当前单元格的行,它返回最早的命中,然后是第二个命中,然后第三击等
超出这一点,可以根据需要使用搜索到的数组的参考点(转换为索引函数的行位置等)。
编辑 在进一步查看该公式的结果时,它只为每个搜索词返回一个命中,即使该搜索词出现多次。为了解决这个问题,我首先使用了以下公式:
=SMALL(IF($A$9:$A$24=$B$1,ROW($A$9:$A$24),""),ROW()-ROW($E$8))
这显示了在 B1 中找到的搜索词匹配的每个匹配项。这是我卡住的地方。我只能弄清楚如何使用公认的手册来解决:
=SMALL(IF($A$9:$A$24={"a","b","c"},ROW($A$9:$A$24),""),ROW()-ROW($E$8))
有关如何改进以允许多个术语的多次点击的任何建议?
编辑 - 附加选项
好的,我已经确定了另一种获取多个命中的方法。这个依赖于考虑之前已经进行的比赛的位置。根据您希望结果向量的样子(OP 从未指定),由此得出的结果很干净,但公式相当混乱。
第一个单元格看起来像这样,在单元格 H9 中: =ADDRESS(MIN(IFERROR(MATCH($B$1:$B$4,$A$9:$A$24,0),""))+ROW($A$8) ,1)
这使用上面提到的公式显示了与任何搜索词匹配的第一个单元格的地址。
下面的单元格(以及之后的每个单元格)都有这个(也是一个数组公式):
=ADDRESS(MIN(IFERROR(MATCH($B$1:$B$4,INDIRECT(ADDRESS(ROW(INDIRECT(H9))+1,1)):$A$25,0),""))+ROW(INDIRECT(H9)),1)
这将获取在上面的行中找到的单元格的地址(添加 1 行以避免重新命中相同的术语),并从该点到终点的新搜索列(添加 1 行以便它正确停止在最后一个结尾命中),它会重新搜索任何术语。
这又是一个,不是那么干净[是的,我知道我可以做一些改进来确定搜索应该是什么 - 使用文本操作函数,甚至做一个相对名称引用,当你向下移动列时会发生变化],但它是自动化的,而且我认为它比 VBA 模块更干净。特别是,根据您想要的结果向量,这可能要简单得多。
在@Grade'Eh'Bacon 发布的公式上工作\开发最终使用此公式来检索匹配函数的所有结果,其中多个项目具有多个匹配项。
假设输入范围是B2:B17
,并且要匹配的项目的范围是在中F3:F5
输入FormulaArray
H3
=IFERROR( SMALL( IF( $B$3:$B$17 = TRANSPOSE( $F$3:$F$5 ),
1 + ROW( $B$3:$B$17 ) - ROW( $B$3 ), "" ), ROWS($2:2 ) ), "" )
这是FormulaArray
返回多个项目的所有匹配项
所有优点都归功于@Grade'Eh'Bacon 在这个主题上的出色工作。
使用内置 MATCH 是不可能的,但是,使用 VBA 宏,您可以实现:
Public Function MATCH_RANGE(values As Variant, ary As Variant, match_type As Integer)
Dim i As Integer
Dim elementCount As Integer
Dim result()
Dim value As Variant
Dim arySize As Integer
arySize = UBound(ary.Value2, 1)
Dim valueSize As Integer
valueSize = UBound(values.Value2, 1)
ReDim result(0 To arySize, 0 To 1)
elementCount = 0
For i = 1 To arySize
For j = 1 To valueSize
value = values(j, 1)
If (match_type = -1 And ary(i, 1) <= value) Or (match_type = 0 And ary(i, 1) = value) Or (match_type = 1 And ary(i, 1) >= value) Then
result(elementCount, 0) = i
elementCount = elementCount + 1
End If
Next j
Next i
For i = elementCount To arySize
result(i, 0) = -100000000
Next i
MATCH_RANGE = result
End Function
此函数既返回多个匹配项,又允许您传递要匹配的多个值的范围。我多次发现这很有用。欢迎提供反馈以帮助改进这一点。
注意:您必须使用数组公式 (CRTL-SHIFT-ENTER) 将此公式分布在几个单元格中,以便查看多个匹配项。