问与答92:如何使用公式统计同时在线人数?
excelperfect
Q:如下图1所示,在列A中是日期,列B中是对应日期上线人名称,同一日期上线人存在重复,要求使用公式统计指定日期上线人数(剔除重复值)。要求:在单元格F2中输入公式,拖拉复制到单元格I2,得到相应的数据。
图1
A:下面使用数组公式实现。
在单元格F2中输入数组公式:
=SUM(--(FREQUENCY(MATCH(IF($A$2:$A$30=F1,$B$2:$B$30,''),IF($A$2:$A$30=F1,$B$2:$B$30,''),0),ROW($A$2:$A$30)-ROW($A$2)+1)>0))-1
拖拉复制至单元格I2即可。
公式中:
IF($A$2:$A$30=F1,B2:B30,'')
获取列A中等于单元格F1中的日期对应的列B中的值,得到数组:
{'A';'A';'B';'C';'C';'B';'B';'';'';'';'';'';'';'';'';'';'';'';'';'';'';'';'';'';'';'';'';'';''}
将其作为MATCH函数的lookup_value参数和lookup_array参数的值,同时指定参数match_type值为0(精确匹配),得到上述数组中各值在数组中首次出现的位置组成的数组:
{1;1;3;4;4;3;3;8;8;8;8;8;8;8;8;8;8;8;8;8;8;8;8;8;8;8;8;8;8}
现在,需要统计上述数组中的不同数字的数量,因为数组中也获得了空值所在的位置值,所以将不同数字数量减去1即为剔除重复值后的数据数量。这里使用FREQUENCY函数来统计上述数组在各区间的数量。
公式中:
ROW($A$2:$A$30)-ROW($A$2)+1
得到数组:
{1;2;3;4;5;6;7;8;9;10;11;12;13;14;15;16;17;18;19;20;21;22;23;24;25;26;27;28;29}
这样,公式中的:
FREQUENCY(MATCH(IF($A$2:$A$30=F1,$B$2:$B$30,''),IF($A$2:$A$30=F1,$B$2:$B$30,''),0),ROW($A$2:$A$30)-ROW($A$2)+1)
转换为:
FREQUENCY({1;1;3;4;4;3;3;8;8;8;8;8;8;8;8;8;8;8;8;8;8;8;8;8;8;8;8;8;8},{1;2;3;4;5;6;7;8;9;10;11;12;13;14;15;16;17;18;19;20;21;22;23;24;25;26;27;28;29})
得到数组:
{2;0;3;2;0;0;0;22;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0}
下面是关键的一步,即判断FREQUENCY函数的结果是否大于0,即:
FREQUENCY(MATCH(IF($A$2:$A$30=F1,$B$2:$B$30,''),IF($A$2:$A$30=F1,$B$2:$B$30,''),0),ROW($A$2:$A$30)-ROW($A$2)+1)>0
转换为:
{2;0;3;2;0;0;0;22;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0}>0
得到数组:
{TRUE;FALSE;TRUE;TRUE;FALSE;FALSE;FALSE;TRUE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE}
其中的TRUE值代表原数组中大于0的值,也就是说,上述数组中TRUE值的个数即为不重复的数值个数。
公式中的双减号将TRUE/FALSE值转换为1/0,即:
{1;0;1;1;0;0;0;1;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0}
传递给SUM函数将数组中各值相加,得到结果:
4
减去1,即上文中已提到的空格位置代表的数,得到不重复的数为:
3
即为指定日期2020-8-17同时在线的人数。
小结
FREQUENCY函数很神奇,特别是在本示例所处的情形下,好好体会,举一反三,熟练运用,因为你会在很多情形下用到它。