数组搜索的多个匹配结果
Multiple Match Results From Array Search
为了 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:$BO,1))),ROW($AP:$BO),"")),1))
和
=IFERROR(INDEX($AP:$BO,SMALL(IF($AP:$BO=AQ22,ROW($AP:$BO)-4),ROW(A1)),2),"")
甚至是赫赫有名的
=IF(ISERROR(INDEX($AP:$BO,SMALL(IF($AP:$BO=AQ22,ROW($AP:$BO)),ROW(1:1)),2)),"",INDEX($AP:$BO,SMALL(IF($AP:$BO=AQ22,ROW($AP:$BO)),ROW(1:1)),2))
这里有一个 toy sheet 可以使用这些信息来测试想法。请注意公式将开始的单元格上的注释。
在 Excel 中,您可以在没有 CSE
输入公式的情况下执行此操作,但我不知道 AGGREGATE
函数在表格中是否可用:
=IFERROR(AGGREGATE(15,6,1/((AQ=arr)*(LEN(arr)>0))*ROW(arr),ROWS(:1)),"")
对于输入公式的数组:
=IFERROR(SMALL(IF((AQ=arr)*(LEN(arr)>0),ROW(arr),""),ROWS(:1)),"")
对于这些公式中的任何一个,输入 AQ24,然后向下填写,直到出现空白,然后交叉。向下填充时,可以隐藏"target rows"的none(否则公式的结果会被隐藏)。
arr
refers to $AP:$BO
不确定我是否正确理解了想要的结果,但是
= IfError( Filter( Row($AL:$AL), RegExMatch( $AL:$AL, "\b" & AQ22 & "\b" ) ), "")
结果为 7
, 9
在其下方的单独单元格中。 \b
是在字母数字和非字母数字字符之间匹配的 word boundary。如果你想要一个单元格中的结果,你可以加入它们:
=IfError(Join(",", Filter(Row($AL:$AL), RegExMatch($AL:$AL, "\b"&AQ22&"\b"))), "")
您也可以匹配多个值:
=IfError(Filter(Row($AL:$AL), RegExMatch($AL:$AL, "\b(" & Join("|", AQ22:AZ22) & ")\b")), "")
虽然这是一个非常具体的应用程序来回答这个问题,但为了知识库,我想展示一下我是如何处理多个匹配值的实例的。可能有更好的方法,但这是一种方法。
为了给出这个上下文,假设 LIST_CELL
是一个问题编号列表
(作为 header 行输入,称为范围 QUESTIONS
)在符合特定标准的测试中,目标是仅对符合标准的问题进行平均列表是写的,并且是针对每个学生的。使用
=iferror(join(",",ArrayFormula(match(split(LIST_CELL,","),QUESTIONS,FALSE))),"")
split 函数用逗号拆分 hand-entered 问题列表,match 函数 returns 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
列中的每个值 - 在上下文中,它获取与标准匹配的每个问题的分数。
最后,平均值是 self-explanatory,显然确实以数组作为输入。
这两个函数的组合允许在数组公式中使用间接单元格引用,并解决了很多人提出的 "how do I include multiple matches in a calculation" 问题。至少在这个特定的上下文中。
为了 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:$BO,1))),ROW($AP:$BO),"")),1))
和
=IFERROR(INDEX($AP:$BO,SMALL(IF($AP:$BO=AQ22,ROW($AP:$BO)-4),ROW(A1)),2),"")
甚至是赫赫有名的
=IF(ISERROR(INDEX($AP:$BO,SMALL(IF($AP:$BO=AQ22,ROW($AP:$BO)),ROW(1:1)),2)),"",INDEX($AP:$BO,SMALL(IF($AP:$BO=AQ22,ROW($AP:$BO)),ROW(1:1)),2))
这里有一个 toy sheet 可以使用这些信息来测试想法。请注意公式将开始的单元格上的注释。
在 Excel 中,您可以在没有 CSE
输入公式的情况下执行此操作,但我不知道 AGGREGATE
函数在表格中是否可用:
=IFERROR(AGGREGATE(15,6,1/((AQ=arr)*(LEN(arr)>0))*ROW(arr),ROWS(:1)),"")
对于输入公式的数组:
=IFERROR(SMALL(IF((AQ=arr)*(LEN(arr)>0),ROW(arr),""),ROWS(:1)),"")
对于这些公式中的任何一个,输入 AQ24,然后向下填写,直到出现空白,然后交叉。向下填充时,可以隐藏"target rows"的none(否则公式的结果会被隐藏)。
arr
refers to$AP:$BO
不确定我是否正确理解了想要的结果,但是
= IfError( Filter( Row($AL:$AL), RegExMatch( $AL:$AL, "\b" & AQ22 & "\b" ) ), "")
结果为 7
, 9
在其下方的单独单元格中。 \b
是在字母数字和非字母数字字符之间匹配的 word boundary。如果你想要一个单元格中的结果,你可以加入它们:
=IfError(Join(",", Filter(Row($AL:$AL), RegExMatch($AL:$AL, "\b"&AQ22&"\b"))), "")
您也可以匹配多个值:
=IfError(Filter(Row($AL:$AL), RegExMatch($AL:$AL, "\b(" & Join("|", AQ22:AZ22) & ")\b")), "")
虽然这是一个非常具体的应用程序来回答这个问题,但为了知识库,我想展示一下我是如何处理多个匹配值的实例的。可能有更好的方法,但这是一种方法。
为了给出这个上下文,假设 LIST_CELL
是一个问题编号列表
(作为 header 行输入,称为范围 QUESTIONS
)在符合特定标准的测试中,目标是仅对符合标准的问题进行平均列表是写的,并且是针对每个学生的。使用
=iferror(join(",",ArrayFormula(match(split(LIST_CELL,","),QUESTIONS,FALSE))),"")
split 函数用逗号拆分 hand-entered 问题列表,match 函数 returns 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
列中的每个值 - 在上下文中,它获取与标准匹配的每个问题的分数。
最后,平均值是 self-explanatory,显然确实以数组作为输入。
这两个函数的组合允许在数组公式中使用间接单元格引用,并解决了很多人提出的 "how do I include multiple matches in a calculation" 问题。至少在这个特定的上下文中。