【问题标题】:Multiple Match Results From Array Search数组搜索的多重匹配结果
【发布时间】:2017-03-01 23:01:36
【问题描述】:

为了 MWE,我在 $AP$4:$BO$20 中有一个数组,每个单元格中有一个字符串。每个单元格中的数据是一个字母数字代码,如1,1a,2b,3c等。

第 22 行,从 AQ 列开始,包含一个与上述数组中的一个或多个字符串匹配的字符串。目标:使用 AQ22:AO22 中的每个字符串,创建一个公式,提取数组 $AP$4:$BO$20 中包含 AQ22:AO22 中的值的单元格的每个行号。

在不使用数组公式的情况下这样做的好处。 VBA 不是一个选项,因为这是 Google 表格,我真的更愿意避免使用 g-apps-script。

我尝试过使用

  =INDIRECT(ADDRESS(MIN(IF(NOT(ISERROR(FIND(AQ22,$AP$4:$BO$20,1))),ROW($AP$4:$BO$20),"")),1))

=IFERROR(INDEX($AP$4:$BO$20,SMALL(IF($AP$4:$BO$20=AQ22,ROW($AP$4:$BO$20)-4),ROW(A1)),2),"")

甚至是杰出的

=IF(ISERROR(INDEX($AP$4:$BO$20,SMALL(IF($AP$4:$BO$20=AQ22,ROW($AP$4:$BO$20)),ROW(1:1)),2)),"",INDEX($AP$4:$BO$20,SMALL(IF($AP$4:$BO$20=AQ22,ROW($AP$4:$BO$20)),ROW(1:1)),2))

这里有一个toy sheet,可以使用这些信息来测试想法。注意公式开始的单元格上的注释。

【问题讨论】:

    标签: excel google-sheets excel-formula spreadsheet


    【解决方案1】:

    不确定我是否正确理解了预期的结果,但是

    = IfError( Filter( Row($AL$4:$AL$16), RegExMatch( $AL$4:$AL$16, "\b" & AQ22 & "\b" ) ), "")
    

    导致79 在其下方的单独单元格中。 \b 是一个word boundary,匹配字母数字和非字母数字字符。如果您希望结果在一个单元格中,您可以加入它们:

    =IfError(Join(",", Filter(Row($AL$4:$AL$16), RegExMatch($AL$4:$AL$16, "\b"&AQ22&"\b"))), "")
    

    你也可以匹配多个值:

    =IfError(Filter(Row($AL$4:$AL$16), RegExMatch($AL$4:$AL$16, "\b(" & Join("|", AQ22:AZ22) & ")\b")), "")
    

    【讨论】:

    • 这些工作很漂亮,并且代码可以将结果作为列表输出。谢谢。
    【解决方案2】:

    在 Excel 中,您可以在不输入 CSE 公式的情况下执行此操作,但我不知道 AGGREGATE 函数在表格中是否可用:

    =IFERROR(AGGREGATE(15,6,1/((AQ$22=arr)*(LEN(arr)>0))*ROW(arr),ROWS($1:1)),"")
    

    对于数组输入公式:

    =IFERROR(SMALL(IF((AQ$22=arr)*(LEN(arr)>0),ROW(arr),""),ROWS($1:1)),"")
    

    对于其中任何一个公式,输入 AQ24,然后填写直到出现空白,然后越过。当您填写时,不能隐藏任何“目标行”(否则公式的结果将被隐藏)。

    arr 指的是$AP$4:$BO$20

    【讨论】:

    • =IFERROR(AGGREGATE(15,6,1/((AQ$22=$AP$4:$BO$20)*(LEN(arr)>0))*ROW($AP$4:$BO$20),ROWS($1:1)),"") 产生空白,=ArrayFormula(IFERROR(SMALL(IF((AQ$22=$AP$4:$BO$20)*(LEN(arr)>0),ROW($AP$4:$BO$20),""),ROWS($1:1)),"")) 产生空白,有趣的是,因为它看起来应该可以工作。你在玩具数据表上试过了吗?
    • @Zediiiiii 是的,当下载到 Excel 中时,它在数据表上工作。如果没有可返回的内容,它只会返回空白。让我看看我能不能用床单试试。
    • 啊,这就是问题所在,它在 excel 中确实有效,但由于某种原因,在表格中无效。感谢您的大力投入。我在工作表中看到了一些奇怪的数据类型转换问题,这些问题在 Excel 中不存在,不知道是不是这个原因?
    • @Zediiiiii 好的,正如预期的那样,AGGREGATE 函数在表格中不存在,因此无法正常工作。但是,另一个公式可以正常工作。您的问题是您没有在 LEN 函数中替换 arr 。应阅读:=ArrayFormula(IFERROR(SMALL(IF((AQ$22=$AP$4:$BO$20)*(LEN($AP$4:$BO$20)>0),ROW($AP$4:$BO$20),""),ROWS($1:1)),""))
    • 确实如此,这很好用。谢谢。我确信过滤器/正则表达式组合比数组公式更有效,但这仍然很有效,并且不需要正则表达式 - 对于像我这样的非编码人员来说这是一个奖励。
    【解决方案3】:

    虽然这是一个非常具体的应用程序来回答这个问题,但为了知识库,我想展示我如何处理多个匹配值的实例。可能有更好的方法,但这里有一种方法。

    为了给出这个上下文,假设LIST_CELL 是一个问题编号列表 (作为标题行输入,称为范围QUESTIONS)在与某些标准相对应的测试中,目标是仅对与编写列表旁边的标准相对应的问题进行平均,并且对于每个学生。使用

    =iferror(join(",",ArrayFormula(match(split(LIST_CELL,","),QUESTIONS,FALSE))),"")
    

    split 函数将手动输入的问题列表拆分为逗号,match 函数返回QUESTIONS 中特定问题的列号,join 函数将数据重新连接在一起。 ArrayFormula 允许在数组上执行匹配,而不仅仅是第一个值。

    另一个单行标题列出了每个问题已通过LIST_CELL 中的逗号分隔列表匹配(可能匹配多个标准)的标准。对于 A:A 中的学生列列表,每个标准需要对标准旁边列出的每个问题的分数进行平均。这是由漂亮的(如果笨重的话)完成的:

    average(ArrayFormula(hlookup(split(vlookup(LOOKUP_VAL,SEARCH_RANGE,COL_W_LIST),","),DATA_SOURCE,row(CURRENT_CELL))))
    

    从中心向外分解:

    LOOKUP_VAL 是正在查找的值(具有多个匹配项的值);在示例上下文中,它是标准。

    SEARCH_RANGE 是一系列单元格,其中包含查找值列表(上下文中的标准)和第一个函数生成的以逗号分隔的列号列表。 COL_W_LIST 是数组SEARCH_RANGE 中的列号,其中包含与LIST_CELL 匹配的行号列表。

    Split 将元素分开并将它们放在一个临时数组中,以便可以对每个元素执行hlookup。通过ArrayFormula hlookup 在相应的QUESTIONS 列中获取同一行中的每个值 - 在上下文中,它获取与标准匹配的每个问题的分数。

    最后,average 是不言自明的,并且显然将数组作为输入。

    这两个函数的组合允许在数组公式中使用间接单元格引用,并解决了很多被问到的问题,“我如何在计算中包含多个匹配项”问题。至少在这个特定的上下文中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-03-10
      • 2014-04-28
      • 1970-01-01
      • 1970-01-01
      • 2017-08-12
      • 1970-01-01
      • 2011-04-24
      相关资源
      最近更新 更多