将具有重复项的列转置为唯一列

时间:2016-05-25 22:38:07

标签: excel excel-formula

我想知道是否可以使用分组的重复字段转置列,例如:

+---------+------+
| field_1 | 1    |
| field_2 | 2    |
| field_3 | 3    |
| field_4 | 4    |
| field_1 | 5    |
| field_2 | 6    |
| field_3 | 7    |
| field_4 | 8    |
| field_1 | 9    |
| field_2 | 10   |
| field_3 | 11   |
| field_4 | 12   |
+---------+------+

到唯一列,如下所示:

+---------+---------+---------+---------+
| field_1 | field_2 | field_3 | field_4 |
+---------+---------+---------+---------+
| 1       | 2       | 3       | 4       |
| 5       | 6       | 7       | 8       |
| 9       | 10      | 11      | 12      |
+---------+---------+---------+---------+

这可能没有脚本吗?

3 个答案:

答案 0 :(得分:5)

在E3中输入以下公式(使用Ctrl + Shift + Enter)然后填写然后再填充。

=OFFSET($C$1,LARGE((ROW($B$2:$B$13)-1)*($B$2:$B$13=E$2),ROW()-2),0) & ""

enter image description here

值不在列出的顺序中,但至少在正确的列中。

将尝试解释:

  • 我们想要的每个不同的"字段"值会被某些" x"来自C1的行数
  • 采取" field_1"例如,(ROW($B$2:$B$13)-1)*($B$2:$B$13=E$2)将返回一个行号数组乘以1(TRUE)或零(FALSE),具体取决于" B"单元格值匹配" field_1" (来自E2)。 -1是一个调整,因为我们从第2行开始。返回的数组如下所示:

    [1,0,0,0,5,0,0,0,9,0,0,0]

  • 鉴于该数组,我们需要找到一种方法来逐一获取非零值:我们可以使用LARGE()来做到这一点,使用ROW()-2将第二个参数递增到LARGE (-2因为我们希望第二个参数从1开始,公式在第3行输入)。这给了我们一个有序的值数组:

    [9,5,1,0,0,0,0,0,0,0,0,0]

  • 我们将这个有序数组作为"行偏移" OFFSET()的参数,从C2开始倒计时:所有非零值都给出了我们想要的Col C值,而所有零值只返回C2(它是空的,并且显示为0而没有最后& ""

  • 公式中的所有单元格引用都在需要的地方使用$,以便在拖动时根据需要进行调整以填充/跨越

答案 1 :(得分:1)

这只能让你到目前为止。您仍然需要删除重复项。在D2

=INDEX($B1:$B$12,MATCH(D$1,$A1:$A$12,0))

enter image description here

答案 2 :(得分:0)

我的答案与蒂姆非常相似,但避免了CSE部分并将其内化到AGGREGATE函数中。还要相信它会保留B中元素出现的垂直顺序(尽管未经过测试)。

在D1中使用以下公式并向右复制以获取唯一的标题列表。

=INDEX($A$1:$A$12,MATCH(0,INDEX(COUNTIF($C1:C1,$A$1:$A$12),0,0),0))

然后在D2中使用以下内容从列B中提取信息。可以向右和向下复制。如果找不到某个项目,则会显示未找到该项目。你可以改成这个""如果你愿意的话。

=IFERROR(INDEX($B$1:$B$12,AGGREGATE(15,6,ROW($A$1:$A$12)/($A$1:$A$12=D$1),ROW(1:1))),"Not found")

概念证明

Proof of concept

关于OFFSET的注释

OFFSET是一个易失性函数,意味着它会随时重新计算工作表上的任何内容,而不仅仅是它所使用的单元格。因此,如果你只使用它几次,没什么大不了的。但是,如果您反复使用它,您的工作表可能会变慢。