2

首先,如果可能的话,我想在没有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 = 2pos

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

...因为这些是与结果表中对应bye的行中的值sts = 2相同的值。pospos

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

希望这对您来说足够有意义,可以尝试一下。谢谢!

跟进:

@Richard-Morgan 我尝试使用您的公式,但无法使其正常工作。这是我的实际电子表格的屏幕截图,因此我们可以使用真实的单元格引用:

电子表格快照

所以stsB2:B303posD2:D303byeE2:E303。那么我想在Uthru列中列出再见Y。看起来你的答案,如果我足够聪明来实现它,将会得到我需要的东西,所以你可以提供任何帮助让我到达终点线非常感谢!

4

3 回答 3

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

复制数组公式DOWN查找所有匹配的byes;#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))}

等等

这允许向下复制单元格。

我确信有一种方法可以直接指向行/列,但我现在没时间看这个了。

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

这将向下复制。

于 2012-08-23T19:31:31.973 回答
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 * 而不是 D5 开始的“2QB”,即 H5 结果中引用的行之后的一行。

希望这是有道理的。

所以我最终在我的隐藏工作表中得到的是:

     G   | H   | I   | J   | K
    -----------------------------
5  | QB  | E5  | E7  |     |     |
6  | RB  | E6  |     |     |     |
7  | WR  |     |     |     |     | . . .

然后,在我的首页工作表上,我只需使用以下方法获取byeH5:*n*7 中的单元格引用的值( ):

=IFERROR(INDIRECT(lookups!H5),"")

...这给了我最终的结果:

     G   | H   | I   | J   | K
    -----------------------------
5  | QB  | 8   | 11  |     |     |
6  | RB  | 5   |     |     |     |
7  | WR  |     |     |     |     | . . .

就像我说的那样,它完全令人费解,但它确实有效,如果我知道如何改进它,我总是可以稍后改进它。:) 感谢您为我解决这个看似复杂的问题!我相信你的答案也很漂亮。

于 2012-08-25T04:40:00.647 回答
0

这听起来像是数据透视表的工作,而且很特别。不过,您需要添加一个 ID # 列。这是您可以做到的一种方法:

数据透视表解决方案1

数据透视表解决方案2

然后,一旦使用 go to special 选择了空白,您只需删除它们并将单元格向左移动。 数据透视表解决方案3

祝你好运。

于 2012-08-23T19:40:56.317 回答