【问题标题】:Can MATCH function in an array formula to return multiple matches?数组公式中的 MATCH 函数可以返回多个匹配项吗?
【发布时间】:2015-07-04 16:38:23
【问题描述】:

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

【问题讨论】:

  • 这很有必要,我以前做过这个并且得到了多个 cmet,因为人们不喜欢我回答我自己的问题。仅仅因为 SO 有规则并不意味着人们知道它们。
  • 您能否举一个带有预期结果的小例子来说明您的查询?
  • 您能否将答案作为问题的一部分插入并说出类似“这就是我目前正在使用的”之类的内容?这将有可能在答案而不是 cmets 中进行有趣的讨论。例如,您当前的代码仅允许范围参数,但可以变得更加灵活和紧凑。事实上,甚至可能不需要代码,因为有执行此操作的本机功能。
  • @pnuts 感谢您的链接。恕我直言,无论如何代码都是多余的,因为有一个可用的本地方法:application.match 可以输出具有范围或数组作为输入参数的值数组。
  • @puts,这就是为什么到目前为止的回应还没有定论。但该问题可能会吸引搜索点击,并且当前的答案对读者来说似乎有些误导,因此在没有进一步说明的情况下最好另作说明。

标签: excel vba array-formulas excel-match


【解决方案1】:

如果没有 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))

这首先使用数组公式显示搜索列中匹配的任何搜索词的每个“命中”,然后使用 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 行以便它正确停止在最后一个结尾命中),它会重新搜索任何术语。

这又是一个,不是那么干净[是的,我知道我可以做一些改进来确定搜索应该是什么 - 使用文本操作功能,甚至做一个相对名称引用,当你向下移动时会发生变化column],但它是自动化的,而且我认为它比 VBA 模块更干净。特别是,根据您想要的结果向量,这可能会简单得多。

【讨论】:

  • (稍微)与您的功能不同,但就可读性而言,我会说这比 50 行代码更简洁。
  • 啊,在进一步的测试中,这实际上并没有显示同一个搜索词的多个命中 - 它只显示每个搜索词的第一个命中,没有特定的顺序。这是在相同方法下显示同一术语的多个命中的内容: =SMALL(IF($A$9:$A$24=$B$1,ROW($A$9:$A$24),""),ROW( )-ROW($E$8)) ;我正在努力结合这两个功能。
【解决方案2】:

在@Grade'Eh'Bacon 发布的公式上工作\开发最终使用这个公式来检索匹配函数的所有结果,其中多个项目有多个匹配项。

假设输入范围是B2:B17,并且要匹配的项目范围是F3:F5,在H3中输入这个FormulaArray

=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 在该主题上的出色工作。

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 我不确定在澄清问题并让其他人有机会回答之前发布您自己的答案是否合适!
    • @pnuts 好的,谢谢。和 MgSam:道歉。尽管如此,这对我来说仍然很奇怪,特别是考虑到该答案的开场白“不可能......”并且缺乏澄清。所以一个职位可以保持这样吗?自行回答并且没有回复该帖子的 cmets?
    • @pnuts 也许,虽然考虑到“复杂”在这里是一个主观术语,但如果 OP 可以举一个他们认为刚刚跨越“非-复杂”和“复杂”。 (就此而言,他们可能还想重新划分“可读”和“不可读”之间的界限。)
    • 请您解释一下应该如何使用它。我正在尝试在一个范围内匹配两个项目:=MATCH_RANGE( B8:B10 , B7:B21 , 0 ) 它返回 #VALUE!
    猜你喜欢
    • 1970-01-01
    • 2021-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-08
    • 2022-01-02
    • 1970-01-01
    相关资源
    最近更新 更多