大家好,我是 Excel 护体光速下班的效率达人,小花。
前段时间,有位 Excel 高手向我抱怨:
小花老师,我曾经自诩精通 Excel 函数,直到被某知名公司的 Excel 笔试题打了脸。
我好奇地打开他发来的试题:
也吓了一跳:
现在的 Excel 圈这么艰难了吗?小小笔试题就要如此残酷吗?
这种惨无人道、鬼哭狼嚎的分组求和取最大值问题,一定不能再让它为祸人间,就让小花来消灭它。
函数达人可以先行试试手再看教程!
解题公式
题目:本周单个城市的单日最高完单量是多少?(不用辅助列)
题目解析:
不难看出,完单量是按 0-23 时,分时统计的,要想计算出单日最高完单数,就必须先计算各城市每日完单量之和,再判断最大值。
这个问题需要分步计算,通常要使用辅助列来完成,因为辅助列能更好地匹配正常思维和计算的思路。
这道题惨绝人寰反人类的地方,正在于此,它明确禁止了这种常规完美操作!
于是乎,答题者被逼上梁山,必须想办法在一个公式中完成「计算单日完单量的分组求和」和「判断最大值」两步运算。
这就需要用到函数嵌套和数组公式了。
分组求和取最大值公式:
{=MAX(SUMIF(OFFSET(D2:D25,24*(ROW(1:50)-1),),">0"))}
▲ 左右滑动查看
公式解析
第一步:OFFSET+ROW,分割表格为 24 行一组的单日完单量数据表。
❶ OFFSET(D2:D25,24*(ROW(1:50)-1),)
由于数据表是按 0-23 时分时依次填列,每 24 行代表一整天的完单数。
也就是说,我们需要在公式中,将 D 列每 24 个分时完单数相加,形成一个表示每日完单量的有序数组。
这一步的前提就是将 D 列的每 24 行拆分为一组,以便进一步求和。
公式片段①就是为了实现这一目的。
公式片段 ①:
OFFSET(D2:D25,24*(ROW(1:50)-1),)
我们先用 ROW(1:50)-1 返回一组 0-49 的有序数组 A,这里的 50 不是固定数值,它可以是任意、能够完全将有效数据区域拆分的足够大的数。
将 0-49 的有序数组乘以 24,即可得到{0;24;48;......;1176}这样公差为 24 的等差数列 B。
然后我们使用到了 OFFSET 函数,它是从初始区域开始,向下偏移指定行数,再向右偏移指定列数。
然后从偏移后的位置开始,返回指定多少行多少列单元格区域的偏移函数。
通过偏移函数OFFSET 函数,以 D2:D25 单元格区域为起点,依次偏移{0;24;48;......;1176}个单元格;
得到 50 个,包含各自 24 个单元格的不同区域 :
RFS{D2:D25,D26:D49,D50:D73,,,}
这些区域正好表示每一个城市每一天连续 24 小时的完单量。
第二步:MAX+SUMIF,求和单日完单量,并取最大值。
② {=MAX(SUMIF(RFS,">0"))}
这里,我们使用 SUMIF 函数来进行分组求和。
SUMIF 是一个条件求和函数,它通过条件区域与条件值的比对,将满足条件的求和区域单元格求和。
很显然,区域 RFS 中的每个数据都大于 0,所以 SUMIF 的第二个参数本身是没有意义的,它的作用仅仅在于求和。
但我们不能直接使用 SUM 函数,否则无法形成 50 个单独的求和结果。
于是一个没有意义的求和条件「>0」就显得很有必要了,它使得每个区域都进行单独进行这种判断,并计算出各个区域之和。
也就是我们所需要的各城市单日完单量数组 C{478519;458663;……;0;0;0}。
其中 478519 就是福州周一的完单量,以此类推。
最后就是 MAX 函数取最大值了。
这里最外围的大括号表示整个公式是一个数组公式。
我们在输入公式后,需要同时按【Ctrl+Shift+Enter】才能执行数组运算。
提炼思路
简要概括分组求和取最大值公式的运算逻辑:
❶ 先使用 ROW 函数生成的符合有序数组。
❷ 再通过 OFFSET 函数偏移实现分组。
❸ SUMIF 分组求和后再用 MAX 取最大值。
试题赏析
本试题在测评函数嵌套和数组公式使用能力的同时,也考验了求职者 Excel 技能的储备水平。
例如,解题中用到的 ROW 函数和 OFFSET 函数,ROW 在编号和排序中屡试不爽,OFFSET 则在动态图表制作中予取予求。
对这两个函数不熟悉的求职者,或许在处理一些基础问题时,也无法展现出较高的效率。一题辨高低,妙哉!
以上就是关于某知名公司 Excel 笔试题——分组求和取最大值问题的解析。
小伙伴们一定要认真咀嚼透彻,千万别临阵砸了自己精通 Excel 的金字招牌哦!
本文提及的 4 个函数,ROW、OFFSET、SUMIF、MAX 函数,你最想学哪个?也许以后就有教程了呢?
留言说说看~