本来,大家看我描述的本文标题,没有什么的,很一般的问题嘛,但是,偏偏何上一期作品中提及的这位QQ号为1203241251的粉丝网友就遇到这个问题。初看,觉得很简单的,无非就是运用多条件的求和公式SUMIFS(sum_range, criteria_range1, criteria1, [criteria_range2, criteria2], ...)来实现的。当然了,公式嘛,谁都会用,正如编程一样,都能够知道编程的语法语句格式,但是对于具体的算法问题,如何更好有效组织它们才是最重要的,公式亦然,所以,针对一个具体的问题有效组织公式、函数才是最重要的。对该粉丝的问题,老实说,我和他交流了几次才揣摩出该粉丝朋友的问题,也不知道是他没有总结清楚还是什么的,感觉最先他提出的问题有些混乱,后来我仔细逐字逐句梳理了一下,才大概搞懂该粉丝的意图,哎!反正很费了些时。
该粉丝朋友在发给我的QQ聊天问题记录是“凌晨(请教您表格问题) 2020/6/24 17:47:53 日期和产品是不能手动升降序,也不能添加辅助列,即实际存在任意顺序的。【问题相当于在求同一产品同一天的不同条目(行)能够按从上到下的顺序逐个累加。】”,以及他还发给我的Excel文档中提出的要求原文是“要求:按某一产品(此处以产品A为例)的日期累加(即包含该产品在对应日期及之前时期的数量之和),当同一产品存在同一个日期时则按该产品从上到下(可以有其他顺序,只要保证每个数字是一次累加的即可)的顺序累加。”,我不知道各位粉丝能否理解他说的具体解决问题的意思,反正我是反复几次仔细琢磨才大致理解他的意思,那就是:在Excel的每一行的统计结果单元格实现该行该类产品按不高于当前行所指日期统计其数量,而且,对于同类产品如果在相同日期情况下(有可能不在同一行的同日期的同类产品出现的情况)按先后出现的顺序统计当前行出现的该类产品数量应该是剔除后续相同日期产品的累积数量的结果。
不过,总算梳理出他需求的问题了,知道了具体的可理解的问题,接下来,就容易思考解决该问题的方法了。对于这个问题,我估计其他粉丝朋友也许也遇到过,可能你们是解决了,或许是解决不是很成功。我今天在这里分享,目的有两个:一是起到抛砖引玉的作用;二是为解决该类问题不成功的粉丝朋友提供一种借鉴。
如何解决这个问题呢?这必须是一个谨慎的问题,我们必须作出全面剖析,才能真正得出解决该问题的方法。最先,我也想利用我较为擅长的VBA方法从后台实现,而且这种实现会使问题变得简单化,但是后来我考虑了一下,多数粉丝还是倾向于直接利用Excel公式和函数较为习惯,故而我放弃了VBA的方法而采取在Excel工作表中有效组织函数和公式的方式来实现更为贴切广大粉丝的要求。利用"=SUMIFS(数量统计区域,产品类别范围,当前行的产品名称,日期范围,"<="&当前行的产品日期)"方法貌似可以求得不高于当前行该类产品当前日期的数量,但是,仔细想想,按照有同日期的同类产品在不同行出现的情况,所以该公式统计出来的数量必然包括所有同类产品同日期数量的情况,这与我们题干要求所指的对于有同日期的同类产品在不同行出现的情况下只统计当前行出现的该类产品数量应该是剔除后续相同日期产品的累积数量的结果是相悖的。鉴于这种情况,我们必须还在该公式的基础上剔除与当前行的同日期的该类产品的后续的其他产品的数量,方可才是真正按照题意的要求。所以,如何统计出当前行同日期的该类产品的后续产品的数量就成为了本文解决的最关键的核心问题了,只要该问题一旦解决,即可轻而易举解决我们的最终问题。
进行了上述问题解决方法的有效分析,对于我们接下来真正实施解决问题就指明了很好的方向。好了,下面我们就开始实施具体解决该问题的分享吧!
一、该粉丝朋友提供要求的结果数据和他的实验数据
为了让我们清晰地理解该粉丝朋友的结果数据和他的实验数据,我们还是将他提供的数据给给位截图分享看看吧。如下图所示

图1 粉丝朋友提供的预备要求的数据及其实验数据
二、为该表构筑解决问题的辅助区域
构筑解决问题的辅助区域,是为了不破坏该粉丝原有的数据和以另起炉灶的方式产生解决的数据与之比对的作用。构筑的辅助区域如下图所示

图2 构筑解决问题的辅助区域
三、普及以Offset函数构建Excel工作表动态数据范围区域(单元格)知识
其实,该Offset函数在我的早期作品中,有一个作品是专门分享用它实现动态区域(单元格)的生成的,各位可以去搜索查找下。现在,我只以简答的格式、举例和说明的形式分享该大家知晓即可。
(一)格式:Offset(reference_cell,offset_rows,offset_cols[,height_rows,width_cols])
(二)参数说明:
reference_cell--基准单元格(参照单元格)
offset_rows--行偏移,可以正(向下)、负(向上)
offset_rows--列偏移,可以正(向右)、负(向左)
height_rows--以偏移后的单元格为基础形成的行数,可以正(向下)、负(向上)
width_cols--以偏移后的单元格为基础形成的列数,可以正(向右)、负(向左)
(三)举例:
Offset(M9,,-2)---代表从M9单元格行未偏移、列方向偏移-2列到达K9单元格
Offset(M9,-2,3)---代表从M9单元格行偏移-2行、列偏移3列到达J7单元格
Offset(M9,-2,3,3,-3)---代表从M9单元格偏移到达 J7单元格,再以J7单元格形成-3行、3列的区域J5:L7
四、在辅助区域M列组织公式和函数统计当前行的同日期同类产品的后续产品数量
用以上“三”的知识普及,我们可以迅速根据题干的要求,有效组织强大功能的需求公式。如下图所示

图3 组织统计当前行同日期该类产品的后续产品的数量累积
在公式“IFERROR(SUMIFS(OFFSET(C2,1,,15-ROW(),1),OFFSET(B2,1,,15-ROW(),1),B2,OFFSET(A2,1,,15-ROW(),1),"="&A2),0)”中的“SUMIFS(OFFSET(C2,1,,15-ROW(),1),OFFSET(B2,1,,15-ROW(),1),B2,OFFSET(A2,1,,15-ROW(),1),"="&A2)”是统计C2以后的列向动态区域中C2当前行所在的产品和日期相同的后续产品的数量累积。外部套用错误条件处理IFERROR函数的目的是确保错误异常的正确处理。于是,我们可以用自动填充后续的各个行的M列的各个单元格,其结果运算如下图所示。

图4 M列统计出的当前行同日期该类产品后续产品的数量累积
五、统计出日期不高于当前行同类产品的数量累积(必然含上面“四”M列的数据)
方法比较简单,直接可以用SUMIFS多条件求和公式这样组织即可:SUMIFS(C:C,B:B,B2,A:A,"<="&A2),该公式也是这位粉丝偏移的原有公式。这里,解释一下“C:C,B:B,B2,A:A”分别是整个C列数据区域范围、B列数据区域范围、A列数据区域范围,"<="&A2代表条件是不高于(小于等于)A2值(这个A2实际上就该单元格所在行的日期),而“B:B,B2”表示区域“B:B”含有B2产品名称值的意思(也可以写成B:B,"="&B2,主要看各人爱好习惯写法)。同样,我们可以将该组织的公式放到某一列类似“四”的操作显示统计出日期不高于当前行同类产品的数量累积结果。理解的基础上,为了简便起见,我们在这里不重复这样操作了。
六、在L列实施由“五”减去“四”的公式真正统计出符合不高于当前行同类产品日期的且满足同日期同类产品后续产品累积的剔除,得出真正满足题干意思的数量
“四”、“五”公式都分析透彻的基础上,我们直接用“五”减去“四”的公式即可得出我们根据题干意思需要的结果。如下图5、图6所示。

图5只统计当前行同日期同类产品且不高于当前行日期同类产品的数量公式

图6 自动填充形成只统计当前行同日期同类产品且不高于当前行日期同类产品的数量
好了,本次该粉丝遇到的问题解决方法就跟给位粉丝偏移分享到这里了,各位粉丝朋友如果遇到这种类似的问题,就可以便VBA编程的基础上轻松实现啦,当然,各位有更好的方法,也不要忘了留言分享给我,大家也互相共勉。从上面的洋洋洒洒的分享中可以看出,对于特定的问题,只要我们善加分析,定会组织出我们需要功能的公式,正如这个SUMIFS多条件求和公式一样,看似简单,但有效组织才是最重要的。所以,只要我们敢于、勤于思考、分析、研究,总会找到解决问题的方法,而我就是这样做的,无论学习还是工作、生活,希望各位也能如此,能够自己解决的尽量自己去努力思考解决,在这个过程中其实也是成长了自己,不要什么事情都是拿来主义、不思考的情况下动不动就问解决的结果哦!从这两次对这位QQ号为1203241251的粉丝网友的交流,我感觉到他有点这些习惯,其实这样不是很好,不注重思考就不能很好学习新的知识哦,也希望这位粉丝朋友以后要多勤于思考、多动动手哈。
最后,还是那句老话,非常感谢各位粉丝朋友的长期关注(头条号:跟我学Office高级办公)、推广和对作品的点评!疫情快过去了,加之天气越来越热了,大家还是要多多注意身体健康哦,与此同时,也请多多关注我的Office高级办公有实用意义的后续原创作品哦!谢谢!