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

我想知道是否有可能转置列分组重复字段,例如:

+---------+------+ | 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 (-2 ROW()-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是一个易失性函数,意味着它将随时重新计算工作表中的任何内容,而不仅仅是它所处理的单元格。 因此,如果你只是使用它几次,没有什么大不了的。 但是,如果您反复使用它,您的工作表可能会变慢。