目标:
将一列数据按照内容不同,分为多列。
【案例】将不同【分支机构】的【时长】单独统计出来。
数据源如下:
期望得到如下表格:
【步骤一】
1.1在【F2】单元格中输入公式
=INDEX($ B:$ B,SMALL(IF(A:A=$ D$ 2,ROW(A:A),4^8),ROW(A1)))&""
1.2语法解释:INDEX(单元格区域,行号,列号)
①目标单元格区域:B列;
②行号:SMALL(IF(A:A=$D
2
,
R
O
W
(
A
:
A
)
,
4
8
)
,
R
O
W
(
A
1
)
)
其
中
,
I
F
(
A
:
A
=
2,ROW(A:A),4^8),ROW(A1)) 其中,IF(A:A=
2,ROW(A:A),48),ROW(A1))其中,IF(A:A=D
2
,
R
O
W
(
A
:
A
)
,
4
8
)
返
回
的
是
一
个
数
组
,
解
释
如
下
:
1
)
将
A
列
中
存
储
的
所
有
数
值
与
【
D
2
】
单
元
格
逐
一
匹
配
,
若
相
等
,
则
返
回
当
前
可
匹
配
数
值
的
行
号
;
若
不
等
,
则
返
回
一
个
超
大
的
数
值
,
这
里
选
定
为
4
8
(
原
因
:
4
的
8
次
方
65536
是
03
版
本
E
X
C
E
L
的
最
大
行
数
。
03
版
本
时
候
,
一
般
认
为
该
行
的
数
据
是
空
白
的
,
在
老
版
的
查
询
公
式
写
法
中
,
会
用
这
个
数
返
回
该
行
的
数
据
,
用
于
屏
蔽
零
值
)
因
为
公
式
中
用
到
了
s
m
a
l
l
函
数
,
所
以
使
用
一
个
超
大
数
值
替
代
不
符
合
i
f
条
件
的
数
值
,
使
其
在
s
m
a
l
l
函
数
中
不
被
返
回
,
即
超
出
我
们
原
数
据
有
效
范
围
即
可
(
如
本
例
中
有
17
个
行
号
,
这
个
数
值
>
=
18
就
可
以
了
)
。
2
)
那
么
具
体
I
F
(
A
:
A
=
2,ROW(A:A),4^8)返回的是一个数组,解释如下: 1)将A列中存储的所有数值与【D2】单元格逐一匹配,若相等,则返回当前可匹配数值的行号;若不等,则返回一个超大的数值,这里选定为4^8(原因:4的8次方65536是03版本EXCEL的最大行数。03版本时候,一般认为该行的数据是空白的,在老版的查询公式写法中,会用这个数返回该行的数据,用于屏蔽零值) 因为公式中用到了small函数,所以使用一个超大数值替代不符合if条件的数值,使其在small函数中不被返回,即超出我们原数据有效范围即可(如本例中有17个行号,这个数值>=18就可以了)。 2)那么具体IF(A:A=
2,ROW(A:A),48)返回的是一个数组,解释如下:1)将A列中存储的所有数值与【D2】单元格逐一匹配,若相等,则返回当前可匹配数值的行号;若不等,则返回一个超大的数值,这里选定为48(原因:4的8次方65536是03版本EXCEL的最大行数。03版本时候,一般认为该行的数据是空白的,在老版的查询公式写法中,会用这个数返回该行的数据,用于屏蔽零值)因为公式中用到了small函数,所以使用一个超大数值替代不符合if条件的数值,使其在small函数中不被返回,即超出我们原数据有效范围即可(如本例中有17个行号,这个数值>=18就可以了)。2)那么具体IF(A:A=D
2
,
R
O
W
(
A
:
A
)
,
4
8
)
返
回
的
数
组
是
什
么
呢
?
从
数
据
源
表
可
以
看
出
,
A
1
的
值
是
“
分
支
机
构
”
,
A
1
!
=
D
2
,
那
么
返
回
4
8
,
即
数
组
I
F
(
A
:
A
=
2,ROW(A:A),4^8)返回的数组是什么呢? 从数据源表可以看出,A1的值是“分支机构”,A1!=D2,那么返回4^8,即数组IF(A:A=
2,ROW(A:A),48)返回的数组是什么呢?从数据源表可以看出,A1的值是“分支机构”,A1!=D2,那么返回48,即数组IF(A:A=D
2
,
R
O
W
(
A
:
A
)
,
4
8
)
的
第
一
个
返
回
值
是
4
8
,
同
理
,
A
2
单
元
格
的
值
是
“
安
徽
分
公
司
”
,
显
然
A
2
!
=
D
2
,
那
么
数
组
I
F
(
A
:
A
=
2,ROW(A:A),4^8)的第一个返回值是4 ^8,同理,A2单元格的值是“安徽分公司”,显然A2!=D2,那么数组IF(A:A=
2,ROW(A:A),48)的第一个返回值是48,同理,A2单元格的值是“安徽分公司”,显然A2!=D2,那么数组IF(A:A=D
2
,
R
O
W
(
A
:
A
)
,
4
8
)
的
第
二
个
元
素
也
是
4
8
;
同
理
因
为
A
3
!
=
D
2
,
所
以
数
组
I
F
(
A
:
A
=
2,ROW(A:A),4^8)的第二个元素也是4 ^8;同理因为A3!=D2,所以数组IF(A:A=
2,ROW(A:A),48)的第二个元素也是48;同理因为A3!=D2,所以数组IF(A:A=D
2
,
R
O
W
(
A
:
A
)
,
4
8
)
的
第
三
个
元
素
也
是
4
8
;
而
A
4
单
元
格
的
值
是
“
重
庆
分
公
司
”
,
A
4
=
D
2
,
这
时
数
组
I
F
(
A
:
A
=
2,ROW(A:A),4^8)的第三个元素也是4 ^8;而A4单元格的值是“重庆分公司”,A4=D2,这时数组IF(A:A=
2,ROW(A:A),48)的第三个元素也是48;而A4单元格的值是“重庆分公司”,A4=D2,这时数组IF(A:A=D
2
,
R
O
W
(
A
:
A
)
,
4
8
)
返
回
A
4
所
在
行
号
,
即
4
。
因
为
A
5
=
D
2
,
所
以
数
组
I
F
(
A
:
A
=
2,ROW(A:A),4^8)返回A4所在行号,即4。因为A5=D2,所以数组IF(A:A=
2,ROW(A:A),48)返回A4所在行号,即4。因为A5=D2,所以数组IF(A:A=D$2,ROW(A:A),4^8)返回A5单元格的行号5。
到时,目前数组中存储的数据为{65536 ,65536,65536,4,5,…},同理,A列的所有数据与D2逐一进行对比,得到if函数的数组为{65536 ,65536,65536,4,5,6,65536 ,65536,65536,…65536}(该数组中共有65536个元素。如果将4^8改为20,则该数组有20个元素)。
3)在此if函数返回数组的外层,是small函数。
计算完if函数后,则small变为({65536 ,65536,65536,4,5,6,65536 ,65536,65536,…65536},row(A1)),其中row(A1)返回值为数字1。
small(单元格区域或数组,K)函数语法含义:在一列数值中,按从小到大的顺序返回第K个值。
那么在此small函数中,返回值就是if数组中按从小到大排序后的第1个值,即4。
4)这时外层的index函数即为index(B:B,4),在B列中返回第4行的数值,即B4单元格的【28】。
5)index函数后面加上了【""】。
&是文本合并运算符,"“是空文本,公式【&”"】表示将公式的运算结果与空文本合并。它的作用是用空文本替代返回值中的错误值。
如果没有【&""】则结果如下:
1.3在【F2】中输入数组公式以后,按shift+ctrl+enter。
【步骤二】
将【F2】的公式向下拖动,将公式填充到下面足够多的单元格中(可以与数据源的个数保持一致,因为返回结果不会超过数据源个数)
【步骤三】
利用数据有效性,将【D2】单元格做成下拉框,这样数据就可以变动了。(略)
【注意】公式中,if函数的比较值范围要与返回行号完全对应。
即下面标红的部分要保持一致。
完成。
【Excel】将一列数据按内容不同分为多列-index函数的应用
最新推荐文章于 2024-04-24 22:05:10 发布