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

Excel 将具有重复项的列转换为唯一列,excel,excel-formula,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_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      |
+---------+---------+---------+---------+

如果不编写脚本,这是可能的吗?

这只是目前为止的问题。您仍然需要删除重复项。在
D2
中:

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

这只会让你走到这一步。您仍然需要删除重复项。在
D2
中:

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

在E3中输入以下公式(使用Ctrl+Shift+Enter),然后填写,然后跨越

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

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

将尝试解释:

  • 对于每个不同的“字段”值,我们需要的所有值都被C1中的某个“x”行数所偏移
  • 以“field_1”为例
    (行($B$2:$B$13)-1)*($B$2:$B$13=E$2)
    将返回一个行号数组乘以1(真)或零(假),具体取决于“B”单元格值是否匹配“field_1”(来自E2)。
    -1
    是一个调整,因为我们从第2行开始。返回的数组如下所示:

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

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

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

  • 我们将这个有序数组作为“row offset”参数传递给offset(),从C2开始倒计时:所有非零值都给出了我们希望从Col C得到的值,而所有零值只返回C2(它是空的,并且将显示为
    0
    ,而不显示最后一个
    &“

  • 公式中的所有单元格引用在需要时都使用$,因此在拖动以向下/横向填充时会根据需要进行调整


在E3中输入以下公式(使用Ctrl+Shift+Enter),然后填写,然后跨越

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

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

将尝试解释:

  • 对于每个不同的“字段”值,我们需要的所有值都被C1中的某个“x”行数所偏移
  • 以“field_1”为例
    (行($B$2:$B$13)-1)*($B$2:$B$13=E$2)
    将返回一个行号数组乘以1(真)或零(假),这取决于“B”单元格值是否与“field_1”(来自E2)匹配。
    -1
    是一个调整,因为我们从第2行开始。返回的数组如下所示:

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

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

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

  • 我们将这个有序数组作为“row offset”参数传递给offset(),从C2开始倒计时:所有非零值都给出了我们希望从Col C得到的值,而所有零值只返回C2(它是空的,并且将显示为
    0
    ,而不显示最后一个
    &“

  • 公式中的所有单元格引用在需要时都使用$,因此在拖动以向下/横向填充时会根据需要进行调整


我的答案与Tim的答案非常相似,但避免了CSE部分,并将其内部化到聚合函数中。同时,我相信它将保留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")
概念证明

关于抵销的说明


偏移量是一个不稳定的函数,意味着它将在工作表上的任何内容发生变化时重新计算,而不仅仅是它所使用的单元格。因此,如果只使用几次,没有什么大不了的。但是,如果您重复使用它,您的工作表可能会慢下来。

我的答案与Tim的答案非常相似,但avo标识CSE部分并将其内部化到聚合函数中。也相信它将保留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")
概念证明

关于抵销的说明


偏移量是一个不稳定的函数,这意味着它将在工作表上的任何内容发生更改时重新计算,而不仅仅是它所使用的单元格。因此,如果您只使用了几次,这没什么大不了的。但是,如果您重复使用它,您的工作表可能会慢下来。

不使用“脚本”(例如使用)在sistersite上问你的问题可能会更好。@slackmuggle在excel中做事情时不需要脚本是很常见的。只有
excel公式
,才有一个完整的标签。应该添加它。@这可能很好,但我的理解是,这更适合在superuser.com上使用,而不需要“脚本”(例如使用)你的问题最好在sistersite上提出来。@slackmuggle在excel中做事情时不需要编写脚本是很常见的。对于
excel公式
,有一个完整的标签。应该添加它。@ForwardEd这可能很好,但我的理解是这更适合在superuser.com上。无法让@scottcraner工作k XD编辑:第I个