数组搜索的多个匹配结果

时间:2017-03-01 23:01:36

标签: excel google-sheets excel-formula spreadsheet

为了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。请注意公式将开始的单元格的注释。

3 个答案:

答案 0 :(得分:1)

在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

答案 1 :(得分:1)

不确定我是否正确理解了所需的结果,但

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

导致79位于其下方的单独单元格中。 \bword 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 :(得分:1)

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

为了给出这个背景,假设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列中同一行的每个值 - 在上下文中,它会获取与标准匹配的每个问题的得分。

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

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