从多个匹配行返回值

时间:2012-08-23 16:53:14

标签: excel

首先,如果可能的话,我想在没有 VB的情况下执行,所以我不必经历教导收件人如何启用宏的麻烦。

现在,我相信我想做的事情很简单,但答案可能是复杂的公式。我正在尝试在新列中列出来自行中指定列的值,这些行具有来自两个其他列的匹配值。听起来很棘手我确定,但一个例子应该有很大的帮助...

说我有以下数据:

 ------------------
| 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   |
 ------------------

这是我的来源。我想列出bye的所有行中的sts = 2值,对应每个pos。换句话说,从上面的源数据我想看到以下结果集:

 --------------------------
| pos | byes               |
 --------------------------
| QB  | 10  | 7  | 5  |    |
| WR  | 3   | 9  |    |    |
 --------------------------

...因为那些bye行中的sts = 2pospos等于结果表中相应的bye

同样,如果可能的话,我想避免使用宏,只需在结果表的sts单元格中使用公式。

希望这对你来说足够有意义。谢谢!

后续:

@ Richard-Morgan我试图使用你的公式,但无法让它发挥作用。这是我实际电子表格的屏幕截图,因此我们可以使用真实的单元格引用:

spreadsheet snapshot

因此B2:B303posD2:D303byeE2:E303U。那么我想列出Y到{{1}}列中的字节。它看起来像你的答案,如果我足够聪明地实现它,会得到我所需要的,所以非常感谢你提供给我到终点线的任何帮助!

3 个答案:

答案 0 :(得分:1)

可以使用以下内容:

{=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列是再见。变量tbl是数据范围(不是标题)。 G $ 3是sts过滤器,G $ 4是pos过滤器。

复制数组公式DOWN以查找所有匹配的字节; #NUM!在找到不再匹配后会出现。如果这对您的用户造成困扰,您可以添加ISERROR或一种棘手的条件格式,使文本白色为白色。

然后,您可以将公式复制到下一列并输入新的过滤器值。

            G   H
sts Search  2   2
pos Search  QB  WR

            10  3
            7   9
            5   #NUM!
            #NUM!#NUM!

如果您的用户对数据透视表感到满意,我认为使用它们会更容易。

修改 使公式“转置”有点棘手,我没有任何突破,如何解决这个问题。但是,如果您想手动编辑列公式,这就是您想要的。

(我假设S是sts过滤器。也许你只是在那里进行计数,但是我没有看到你在哪里输入sts的过滤器。如果S不是sts过滤器,请更新公式指向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))}

这允许向下复制单元格。

我确信有一种方法可以间接ROW / COLUMN,但我现在没时间看这个。

编辑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))}

这将向下复制。

答案 1 :(得分:0)

这听起来像是一个数据透视表的工作,然后去特别。您需要添加ID#列。这是你可以做到的一种方式:

PivotTableSolution1

PivotTableSolution2

然后一旦使用go to special选择了空白,你只需删除它们并向左移动单元格。 PivotTableSolution3

祝你好运。

答案 2 :(得分:0)

好的,我找到了一种方法来获得我想要的结果。它不是最干净或最好的方式,但它实现了我水平列出结果的目标,并避免使用宏或数据透视表。

我使用隐藏的工作表列出所有possts值,并作为单个值连接。所以......

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)),"")

这将返回它在以 2 开头的连续列中找到的第一个单元格引用,并以 G 列中的值结束(例如,第5行中的公式正在查找“2QB”)。

然后,在 I5: n 7 中,我有以下修改后的公式:

=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),"")

我修改后续列的原因是更改公式查找其值的范围,以便在之前找到的值之后的下一行开始。例如,使用上面的数据, H5 中的公式将在D5:D * n *中查找“2QB”,并返回它找到的第一行并将其附加到列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  |     |     |     |     | . . .

就像我说的那样,它完全令人费解,但它确实有效,如果我弄清楚如何,我总能在以后完善它。 :)感谢你们为我看这个看似复杂的问题!我相信你的答案也很有效。