MATCH函数可以在数组公式中返回多个匹配项吗?

时间:2015-07-04 16:38:24

标签: excel vba array-formulas excel-match

我尝试在数组公式中使用MATCH函数来返回多个匹配项(默认情况下,它只返回第一个匹配项)。但是,这似乎不起作用。如果没有复杂,不可读的公式,我该如何解决这个问题?

3 个答案:

答案 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  ) ), "" )

enter image description here

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)将此公式分布在几个单元格中,以便查看多个匹配项。