返回来自多个匹配行的值
首先,如果可能的话,我想不使用 VB,所以我不必经历教授接收者如何启用macros的麻烦。
现在,我相信我想做的事很简单,但答案可能是复杂的公式。 我试图在新列中列出来自指定列的行中具有来自其他两列的匹配值的行的值。 听起来很棘手,我敢肯定,但一个例子应该非常有帮助…
假设我有以下数据:
------------------ | sts | pos | bye | ------------------ | 0 | QB | 8 | | 2 | WR | 3 | | 2 | QB | 10 | | 0 | QB | 4 | | 2 | QB | 7 | | 0 | WR | 11 | | 2 | WR | 9 | | 2 | QB | 5 | ------------------
这是我的来源。 我想列出每个pos
各个sts = 2
所有行的bye
值。 换句话说,从上面的源数据,我想看看下面的结果集:
-------------------------- | pos | byes | -------------------------- | QB | 10 | 7 | 5 | | | WR | 3 | 9 | | | --------------------------
…因为这些是sts = 2
和pos
等于结果表中相应pos
的行中的bye
值。
再次,我想避免macros,如果可能的话,只是在结果表的bye
单元格中使用公式。
希望对你有足够的理解来刺激它。 谢谢!
跟进:
@理查德 – 摩根我试图使用你的公式,但不能得到它的工作。 以下是我的实际电子表格的截图,所以我们可以使用实际的单元格引用:
所以sts
是B2:B303
, pos
是D2:D303
, bye
是E2:E303
。 那么我想列出U
到Y
列的字句。 它看起来像你的答案,如果我足够聪明来实现它,将得到我所需要的,所以任何帮助,你可以提供给我到终点非常感激!
可以使用以下几行:
{=INDEX(tbl, SMALL(IF(COUNTIF(G$3, $A$2:$A$9) *COUNTIF(G$4, $B$2:$B$9), ROW(tbl)-MIN(ROW(tbl))+1), ROW($C1)), COLUMN($C1))}
A列为sts,B列为pos,C列再见。 variablestbl是数据的范围(不是标题)。 G $ 3是stsfilter,G $ 4是posfilter。
复制数组公式向下查找所有匹配的字节; #NUM! 会在找不到更多匹配后出现。 如果这会影响用户,则可以添加一个ISERROR或一个棘手的条件格式,使文本变成白色。
然后,您可以将公式复制到下一列并input新的filter值。
GH sts Search 2 2 pos Search QB WR 10 3 7 9 5 #NUM! #NUM!#NUM!
如果您的用户对数据透视表感到满意,那么使用它们会更容易。
编辑使公式“转置”是有点棘手,我没有任何突破如何解决这个问题。 但是,如果您想手动编辑列公式,这是你想要的。
(我假定S是stsfilter,也许你只是在那里计数,但是我没有看到你进入sts的filter,如果S不是stsfilter,更新公式到点到哪里sts是2或其他)
U2:
{=INDEX(tbl, SMALL(IF(COUNTIF($S2, $B$2:$B$303)*COUNTIF($R2, $D$2:$D$303), ROW(tbl)-MIN(ROW(tbl))+1), ROW($D$1)), COLUMN($D$1))}
V2:
{=INDEX(tbl, SMALL(IF(COUNTIF($S2, $B$2:$B$303)*COUNTIF($R2, $D$2:$D$303), ROW(tbl)-MIN(ROW(tbl))+1), ROW($D$2)), COLUMN($D$2))}
等等
这样可以将单元复制下来。
我相信有一种方法来间接行/列,但我没有时间看这个在这个时刻。
编辑2如果你把一个简单的数字增量的地方,假设U1有1,V1有2,W1有3等,你可以使用以下内容:
{=INDEX(tbl, SMALL(IF(COUNTIF($S2, $B$2:$B$9)*COUNTIF($R2, $D$2:$D$9), ROW(tbl)-MIN(ROW(tbl))+1), U$1), COLUMN($D$1))}
这将复制下来,并跨越。
这听起来像一个数据透视表的工作,并去特殊的。 你需要添加一个ID#列。 这是你可以做到的一个方法:
然后,一旦空白select使用特殊,你只需要删除它们,并将细胞左移。
祝你好运。
好吧,我想出了一个方法来获得我想要的结果。 它不是最干净或最好的方式,但是它实现了我的目标,水平列出结果,并避免macros或透视表。
我使用一个隐藏的工作表来列出所有的pos
和sts
值,连接成一个单一的值。 所以…
sts | pos | bye ---------------------- 2 | QB | 8 2 | RB | 5 2 | QB | 11 0 | WR | 7 . . .
…变成….
D | E ----------- 5 | 2QB | 8 6 | 2RB | 5 7 | 2QB | 11 8 | 0WR | 7 . . .
然后,我有一个“阴影”结果区域,模仿我的头版工作表上的结果区域。 它看起来像这样:
G | H | I | J | K ----------------------------- 5 | QB | | | | | 6 | RB | | | | | 7 | WR | | | | | . . .
在H5:H7中 ,我有以下公式:
=IFERROR((ADDRESS(MATCH("2"&$G5,$D$5:$D$305,0)+4,COLUMN($E5),4)),"")
这将返回它在连续列中find的第一个单元格引用,该列以2开始,并以列G中的值结束(例如,第5行中的公式正在查找“2QB” )。
那么,在I5:N7中我有以下修改公式:
=IFERROR(ADDRESS(MATCH("2"&$G5,INDIRECT(ADDRESS(ROW(INDIRECT(H5))+1,4)&":$d$"&MAX(305,ROW(INDIRECT(H5))+1)),0)+ROW(INDIRECT(H5)),COLUMN($E5),4),"")
我修改后续列的原因是更改公式正在查找其值的范围,从先前find的值之后的下一行开始。 例如,对于上面的数据, H5中的公式将在D5:D * n *中查找“2QB”,并返回find的第一行并将其附加到列E,即E5 。
然后, I5中的公式将查找以D * 6 *开始的“2QB”,而不是D5,即H5结果中引用的行之后的行。
希望这是有道理的。
所以我隐藏的工作表中最后是这样的:
G | H | I | J | K ----------------------------- 5 | QB | E5 | E7 | | | 6 | RB | E6 | | | | 7 | WR | | | | | . . .
然后,在我的头版工作表中,我只需要获取H5中单元格引用的值(即bye
):* n * 7使用:
=IFERROR(INDIRECT(lookups!H5),"")
这给了我最后的结果:
G | H | I | J | K ----------------------------- 5 | QB | 8 | 11 | | | 6 | RB | 5 | | | | 7 | WR | | | | | . . .
就像我说的那样,这是完全错综复杂的,但是它是有效的,如果我弄明白的话,我可以在以后再细化它。 :)感谢你们对我这个看似复杂的问题摆了摆手! 我相信你的答案也很好。