如何用Excel公式将多列非空数据合并至单列?
问题与解决方案
需求示例表格
| result | ||
|---|---|---|
| 1 | a | 1 |
| 2 | b | 2 |
| 3 | c | 3 |
| 4 | d | 4 |
| 5 | e | 5 |
| 6 | 6 | |
| 7 | 7 | |
| a | ||
| b | ||
| c | ||
| d | ||
| e |
对应效果图示

需求说明
需要在C列写入公式,将A:B区域内的所有非空数据按顺序合并到C列作为返回值,此前尝试INDIRECT或INDEX函数未实现多列转单列的效果。
解决方案
方案1:Excel 365/2021及以上版本(推荐)
直接使用TOCOL函数,这是动态数组函数,无需手动下拉填充:
在C1单元格输入:
=TOCOL(A:B,1)
参数1表示忽略空单元格,公式会自动将A、B列所有非空值按从上到下、从左到右的顺序溢出到C列对应单元格,完全匹配需求效果。
方案2:旧版Excel(无动态数组功能)
使用数组公式结合INDEX、SMALL、IF实现,步骤如下:
- 在C1单元格输入以下公式,输入完成后按
Ctrl+Shift+Enter触发数组公式:
=INDEX($A:$B,SMALL(IF($A:$B<>"",ROW($A:$B)*100+COLUMN($A:$B)),ROW(A1)),MOD(SMALL(IF($A:$B<>"",ROW($A:$B)*100+COLUMN($A:$B)),ROW(A1)),100))
- 选中C1单元格,下拉填充直到出现
#NUM!错误值,此时已提取完所有非空数据。
公式逻辑:通过IF筛选出A:B区域非空单元格的行号+列号组合(用行号*100+列号避免行列号混淆),再用SMALL按顺序提取这些组合,最后通过INDEX根据行号和列号取出对应单元格的值。
内容的提问来源于stack exchange,提问作者icecream sugar black
相关产品推荐
相关产品推荐

