将具有重复项的列转置为唯一列
我想知道是否有可能转置列分组重复字段,例如:
+---------+------+ | 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 | +---------+---------+---------+---------+
这可能没有脚本?
在E3中input以下公式(使用Ctrl + Shift + Enter),然后填充,然后跨越。
=OFFSET($C$1,LARGE((ROW($B$2:$B$13)-1)*($B$2:$B$13=E$2),ROW()-2),0) & ""
值不是按列出的顺序,但至less在正确的列中。
将尝试解释:
- 我们希望为每个不同的“字段”值所需的所有值都由C1的某些“x”行偏移
-
以“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]
-
给定这个数组,我们需要find一种方法来逐个获取非零值:我们可以使用LARGE()来做到这一点,使用
ROW()-2
(-2ROW()-2
递增第二个参数为LARGE,因为我们想要第二个参数从1开始,公式被input到第3行)。 这给了我们一个有序的数组值:[9,5,1,0,0,0,0,0,0,0,0,0]
-
我们把这个有序数组作为“行偏移量”parameter passing给OFFSET(),从C2开始倒计时:所有非零值给我们Col C所需的值,而所有的零值只返回C2(它是空的,并显示为
0
没有最后一个& ""
-
公式中的所有单元格引用在需要的地方使用$,所以在拖动时填充/跨越时根据需要进行调整
这只能让你到目前为止。 您仍然需要删除重复项。 在D2
:
=INDEX($B1:$B$12,MATCH(D$1,$A1:$A$12,0))
我的答案与Tim的非常相似,但避免了CSE部分,并在AGGREGATE函数内部将其内部化。 也相信它会保持B中元素的垂直顺序(虽然没有经过testing)。
在D1中使用下面的公式,然后复制权限来获取您唯一的标题列表。
=INDEX($A$1:$A$12,MATCH(0,INDEX(COUNTIF($C1:C1,$A$1:$A$12),0,0),0))
然后在D2中使用以下内容从B列中提取信息。可以将其复制到右侧和下侧。 当一个项目没有find它将显示找不到。 如果您愿意,可以将其更改为“”。
=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")
概念validation
注意OFFSET
OFFSET是一个易失性函数,意味着它将随时重新计算工作表中的任何内容,而不仅仅是它所处理的单元格。 因此,如果你只是使用它几次,没有什么大不了的。 但是,如果您反复使用它,您的工作表可能会变慢。