问与答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函数很神奇,特别是在本示例所处的情形下,好好体会,举一反三,熟练运用,因为你会在很多情形下用到它。

(0)

相关推荐