将多列转换为一或两列

时间:2019-02-20 08:54:01

标签: excel excel-formula

我有一个庞大的数据表,需要将其转换为以下示例:

选项1:

enter image description here

选项2:

enter image description here

我可以使用一个公式吗?注意:无需查询/ VBA,请菜鸟在这里!

1 个答案:

答案 0 :(得分:0)

这是一个很好的脑筋急转弯,所以我试了一下:

  • 首先,我们需要分解行和列,我们需要知道您首先使用了多少列并获取其列号。我选择与=AGGREGATE一起使用,它希望:

=AGGREGATE(15,3,(($A$2:$C$5<>"")/($A$2:$C$5<>""))*COLUMN($A$2:$C$5),ROWS($A$2:A2))

  • 假设我们现在将这些数字放在L列中。其次,我们需要使用`= COUNTIFS()函数来知道每个项目的行号。公式如下:

=COUNTIFS(INDIRECT("L2:L"&ROW()),L2)+1

到目前为止,我们的结果如下图所示:

enter image description here

  • 我们现在的第三步是使用
  • 获取行和列索引号的地址

=ADDRESS(K2,L2,4,1)

  • 我们需要在第四步中使用=INDIRECT()来返回值,如下所示:

=INDIRECT(ADDRESS(K2,L2,4,1)

  • 最后一步返回了我们的名称,但我们还希望使用months值。我们可以结合使用=INDEX()和列索引号(如下所示)来获得该结果:

=INDEX($A$1:$C$5;1;L2)

  • 现在,我们将所有内容组合在一起以在E:F列中获得结果(这似乎很困难),但是

电话E2=INDEX($A$1:$C$5,1;AGGREGATE(15,3,(($A$2:$C$5<>"")/($A$2:$C$5<>""))*COLUMN($A$2:$C$5),ROWS($A$2:A2)))

电话F2=INDIRECT(ADDRESS(COUNTIFS(INDIRECT("E2:E"&ROW()),E2)+1,AGGREGATE(15,3,(($A$2:$C$5<>"")/($A$2:$C$5<>""))*COLUMN($A$2:$C$5),ROWS($A$2:A2)),4,1))

  • 这很好,但是如果您的一列最后有空单元格该怎么办?好吧,这将为列表末尾的该单元格提供一个错误。我们可以用两种方式处理;一个简单的=IFERROR()函数来捕获错误。但是更有效的方法是通过查看我们是否需要进行计算来防止计算如此长的函数。我们可以使用一些技巧来查看与值的数量相比正在使用的行数。如果小于或等于,则需要进行计算。公式如下:

=IF(ROWS($D$2:D2)<=COUNTA($A$2:$C$5),...Do our calculation.....,"")

在最终公式中添加以下内容:

E2=IF(ROWS($D$2:D2)<=COUNTA($A$2:$C$5),INDEX($A$1:$C$5,1;AGGREGATE(15,3,(($A$2:$C$5<>"")/($A$2:$C$5<>""))*COLUMN($A$2:$C$5),ROWS($A$2:A2))),"")

F2=IF(ROWS($D$2:D2)<=COUNTA($A$2:$C$5),INDIRECT(ADDRESS(COUNTIFS(INDIRECT("E2:E"&ROW()),E2)+1,AGGREGATE(15,3,(($A$2:$C$5<>"")/($A$2:$C$5<>""))*COLUMN($A$2:$C$5),ROWS($A$2:A2)),4,1)),"")

  • 向下拖动公式,我们的最终结果如下:

enter image description here