当值出现次数不同时如何转置数据?
How to transpose data when values appears different number of times?
我想转置 2 列 (A:B) 中的数据。例如,在下面的输入中,A 列中的值 A、B、C 和 D 各出现 3 次。
有了这个输入(输入 1),我使用这个公式并正确地得到换位,如下图所示:
=INDEX($B:$B,4*ROWS(D:D2)+COLUMNS($D2:D2)-4)
输入 1
+---+----+
| A | 2 |
+---+----+
| B | 3 |
+---+----+
| C | 4 |
+---+----+
| D | 1 |
+---+----+
| A | 6 |
+---+----+
| B | 12 |
+---+----+
| C | 4 |
+---+----+
| D | 76 |
+---+----+
| A | 1 |
+---+----+
| B | 2 |
+---+----+
| C | 37 |
+---+----+
| D | 9 |
+---+----+
但是如果输入改变 (input2) 使得 A、B 出现的次数少于 C 和 D,那么我的输出是不正确的。
输入 2
+---+----+
| A | 2 |
+---+----+
| B | 3 |
+---+----+
| C | 4 |
+---+----+
| D | 1 |
+---+----+
| C | 4 |
+---+----+
| D | 76 |
+---+----+
| C | 37 |
+---+----+
| D | 9 |
+---+----+
| A | 47 |
+---+----+
| B | 2 |
+---+----+
| C | 37 |
+---+----+
| D | 9 |
+---+----+
我在下面的图片中显示了不正确的输出和预期的输出。
在此先感谢您的帮助。
这是一个相当简单的方法,它基于计算到目前为止已填充了多少个单元格:
=IF(INDEX($A:$A,COUNT($D:$G1)+COUNT($C2:C2)+1)=D,
INDEX($B:$B,COUNT($D:$G1)+COUNT($C2:C2)+1),"")
从 D2 开始向下复制。假定 C 列中有一个空白列。
如果你想让它更动态,但也希望它适用于比 Microsoft 365 更早的 Excel 版本,不幸的是它有点难看。您可以使用常规方法按字母顺序列出 A 列中的唯一值以获得 headers:
=IFERROR(INDEX($A:$A, MATCH(SMALL(IF((COUNTIF(C:$C1, $A:INDEX($A:$A,COUNTA($A:$A)))=0), COUNTIF($A:INDEX($A:$A,COUNTA($A:$A)), "<"&$A:INDEX($A:$A,COUNTA($A:$A))), ""), 1), COUNTIF($A:INDEX($A:$A,COUNTA($A:$A)), "<"&$A:INDEX($A:$A,COUNTA($A:$A))), 0)),"")
改编自 this,根据需要拉过(例如,到 Z 列)。
然后对主公式稍作修改,避免空格下方出现零 headers:
=IF(AND(INDEX($A:$A,COUNT($D:$Z1)+COUNT($C2:C2)+1)=D,D<>""),
INDEX($B:$B,COUNT($D:$Z1)+COUNT($C2:C2)+1),"")
向下复制到 Z 列。
我想转置 2 列 (A:B) 中的数据。例如,在下面的输入中,A 列中的值 A、B、C 和 D 各出现 3 次。
有了这个输入(输入 1),我使用这个公式并正确地得到换位,如下图所示:
=INDEX($B:$B,4*ROWS(D:D2)+COLUMNS($D2:D2)-4)
输入 1
+---+----+
| A | 2 |
+---+----+
| B | 3 |
+---+----+
| C | 4 |
+---+----+
| D | 1 |
+---+----+
| A | 6 |
+---+----+
| B | 12 |
+---+----+
| C | 4 |
+---+----+
| D | 76 |
+---+----+
| A | 1 |
+---+----+
| B | 2 |
+---+----+
| C | 37 |
+---+----+
| D | 9 |
+---+----+
但是如果输入改变 (input2) 使得 A、B 出现的次数少于 C 和 D,那么我的输出是不正确的。
输入 2
+---+----+
| A | 2 |
+---+----+
| B | 3 |
+---+----+
| C | 4 |
+---+----+
| D | 1 |
+---+----+
| C | 4 |
+---+----+
| D | 76 |
+---+----+
| C | 37 |
+---+----+
| D | 9 |
+---+----+
| A | 47 |
+---+----+
| B | 2 |
+---+----+
| C | 37 |
+---+----+
| D | 9 |
+---+----+
我在下面的图片中显示了不正确的输出和预期的输出。
在此先感谢您的帮助。
这是一个相当简单的方法,它基于计算到目前为止已填充了多少个单元格:
=IF(INDEX($A:$A,COUNT($D:$G1)+COUNT($C2:C2)+1)=D,
INDEX($B:$B,COUNT($D:$G1)+COUNT($C2:C2)+1),"")
从 D2 开始向下复制。假定 C 列中有一个空白列。
如果你想让它更动态,但也希望它适用于比 Microsoft 365 更早的 Excel 版本,不幸的是它有点难看。您可以使用常规方法按字母顺序列出 A 列中的唯一值以获得 headers:
=IFERROR(INDEX($A:$A, MATCH(SMALL(IF((COUNTIF(C:$C1, $A:INDEX($A:$A,COUNTA($A:$A)))=0), COUNTIF($A:INDEX($A:$A,COUNTA($A:$A)), "<"&$A:INDEX($A:$A,COUNTA($A:$A))), ""), 1), COUNTIF($A:INDEX($A:$A,COUNTA($A:$A)), "<"&$A:INDEX($A:$A,COUNTA($A:$A))), 0)),"")
改编自 this,根据需要拉过(例如,到 Z 列)。
然后对主公式稍作修改,避免空格下方出现零 headers:
=IF(AND(INDEX($A:$A,COUNT($D:$Z1)+COUNT($C2:C2)+1)=D,D<>""),
INDEX($B:$B,COUNT($D:$Z1)+COUNT($C2:C2)+1),"")
向下复制到 Z 列。