我尝试在数组公式中使用MATCH
函数来返回多个匹配项(默认情况下,它只返回第一个匹配项)。但是,这似乎不起作用。如果没有复杂,不可读的公式,我该如何解决这个问题?
答案 0 :(得分:2)
如果没有VBA,这怎么样? [在单元格C9上输入为CTRL + SHIFT + ENTER的数组公式,其中您的搜索列为A9:A24,搜索条件为B1:B4],并向下拖动以查找多个匹配?
=SMALL(IFERROR(MATCH($B$1:$B$4,$A$9:$A$24,0),""),ROW()-ROW($C$8))
首先使用数组公式来显示每个' hit'对于搜索列中匹配的任何搜索项,然后使用参考当前单元格行的小函数,它返回最早的命中,然后是第二次命中,然后是第3次命中等等。
除此之外,可以根据需要使用搜索到的数组的引用点(转换为索引函数的行位置等)。
修改强> 在进一步审查此公式的结果时,它只返回每个搜索词的单击,即使该搜索词出现多次。为了解决这个问题,我首先使用了公式:
=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模块更清洁。特别是,根据你想要的结果向量,这可能会更简单。
答案 1 :(得分:2)
根据@ 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'培根,因为他在这个问题上所做的出色工作。
答案 2 :(得分:-1)
使用内置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)将此公式分布在几个单元格中,以便查看多个匹配项。