在 Excel 中对多行多列进行条件求和
在 Excel 中对多行多列进行条件求和
- 问题由来
- 源数据格式
- 为什么不能直接求和
- 我的解决过程
- 用 SUMPRODUCT 函数的失败过程
- 分析错误
- 解决问题
- 用 SUMPRODUCT 解决问题
- 我在 CSDN 的第一篇博客
问题由来
前几天,一名网友在微信群里求助,说有一个表格汇总数据不会算。经过两天努力,我帮他写了一个宏,顺利完成了任务。这个按字段汇总的宏我以后再说,今天只说验算的公式。
由于源数据比较多,出于谨慎,我需要将宏算出来的汇总表进行验算,并且最好是用一个单元格用单个公式完成对源数据的加和运算,因此想编写一个公式把源数据表所有符合条件的数据加和,再对汇总表加和,比较两个和是否一致。
源数据格式
源数据是由上百个结构相同的数据块组成的数据块纵列。下面展示连续的两个数据块:
每个数据块的格式如下:
- 总共有21行、13列;
- 第1行是标题,第20、21行是需要被忽略的数据,从第2行到第19行是需要汇总的数据;
- 所有数据块的第二列是纵向标题,每块都一样,都是18个同样次序排列的字母;
- 每块数据块的第一行是横向标题,此部分每个数据块都不一样,且数量有多有少;
- 由此可以看出,需要求和每个数据块从第2行、第3列开始到第19行、第13列的数据块内的数据;
为什么不能直接求和
也许有人会说,直接求 C:M 的和不就行了?还真不行。每个数据块的第20行是一个合计行,不能被计算进总数内,所以不能直接求和。而这一个合计行的业务逻辑比较奇怪,我没看出这一行数据和主体数据块的关系,至少不是主体数据块的纵向求和,否则可以用求 C:M 的和然后除以 2 的方式来求所需要的总和。
我的解决过程
用 SUMPRODUCT 函数的失败过程
这个公式需求看上去一点都不难,我不想用数组公式,用 SUMPRODUCT 函数看上去应该是一个非常理想的选择。于是我写了如下的公式:
=SUMPRODUCT(C:M,((MOD(ROW(C:M)-1,21)+1)>1)*((MOD(ROW(C:M)-1,21)+1)<20))
看上去很完美,用 C:M 指定汇总的列区域,用 ROW 求出单元格所在行的值后用两个 MOD 指出汇总的行区域。两个参数涉及区域都是 C:M,大小完全一样,符合 SUMPRODUCT 函数对各参数之间大小完全匹配的要求。
但是,输入之后 Excel 提示我 #VALUE!
分析错误
问题到底出在什么地方?
我先构造了一个小范围的公式,即只计算一个数据块,公式如下:
=SUMPRODUCT(C1:M21,((MOD(ROW(C1:M21)-1,21)+1)>1)*((MOD(ROW(C1:M21)-1,21)+1)<20))
然后用公式标签页的公式求值功能对公式的运算过程进行跟踪,发现问题出在 ROW 函数身上。
我原以为,因为数组涉及到 C:M 多列,所以按 SUMPRODUCT 函数的工作流程,应该把涉及到的每个单元格都先用 ROW 求行值,再用 MOD 函数取余以确定其在每个数据块中的位置,就是说会生成一个21行×11列的数组。但跟踪下来完全不是这样。ROW 函数偷懒了。
ROW 看到要计算的是范围是一个 C1:M21 的方块,并没有一个单元格一个单元格去老老实实地求行值,而是把 C1:M1,C2:M2……C21:M21 这21行作为21个计算单元,只计算了21次,得出了21个结果,而不是 21×11=231 个结果,这样当然就跟 C1:M21 不匹配了。
解决问题
用 SUMPRODUCT 似乎走进了死胡同,我只能回头考虑用 SUM 的数组公式。一试之下,发现 SUM 比 SUMPRODUCT 果然要聪明一点,能清楚地领会我的意思。我的公式如下:
{=SUM(((MOD(ROW(C:C)-1,21)+1)>1)*((MOD(ROW(C:C)-1,21)+1)<20)*IF(ISNUMBER(C:M),C:M,))}
用了基本和上面 SUMPRODUCT 里一样的条件设置,就把和求出来了,对行值的判断还仅仅用了 C 一列。不同的是多加了一个 ISNUMBER 的判断,因为 SUM 毕竟不是 SUMPRODUCT,遇到非数值数据不会自动转化为零。
用 SUMPRODUCT 解决问题
那用 SUMPRODUCT 真的不能写这个公式吗?非也,经过我脑洞大开的思索,我在原来的公式里多加了一个条件判断
C1:M1=C1:M1
公式于是变成了这样:
=SUMPRODUCT(C:M,((MOD(ROW(C:C)-1,21)+1)>1)*((MOD(ROW(C:C)-1,21)+1)<20)*(C1:M1=C1:M1))
看上去是完全的废话条件,因为一个数肯定等于自身。但这个可谓是神来之笔,因为这一个多加的条件强迫 SUMPRODUCT 把参数内的单元格认真对待,横向的每一个单元格兄弟都不能被忽略,不能被第一列单元格大哥的光芒所掩盖。这样,逗号两边的两个参数所代表的数组终于得到平等,可以共同参与运算了。
我在 CSDN 的第一篇博客
这是我在 CSDN 的第一篇博客,见笑见笑。
在 Excel 中对多行多列进行条件求和相关推荐
- excel中怎么将行转换为列及列转换成行
操作方法 01 选中要把行转换为列的数据.然后点击键盘上的ctrl+c. 02 在需要放置的单元格上,右键点击,然后点击菜单上的'选择性粘贴'. 03 在弹出的窗口上,点击勾选上'转置'.点击确定按钮 ...
- Oracle对sum求和进行if,Excel中sumif函数和sumifs函数进行条件求和的异同
sumif函数和sumifs函数是Excel2007版本以后新增的函数,功能十分强大,实用性很强,本文介绍下Excel中通过用sumif函数和sumifs函数的条件求和的异同,并对函数进行解释,以便各 ...
- Excel中3个超级好用的条件求和的函数
在EXCEL中我们经常会用到很多计算,而求和是使用频率最高的计算了,今天我们就讲解一下EXCEL中3个最好用的求和函数,SUM函数.SUMIF函数.SUMIFS函数,我们看下面几个案例. 1.求和函数 ...
- 怎样在excel中拉出递增的一列数
Excel作为一种应用广泛的软件,得到了一致好评.在Excel中我们经常会用连续的数将一组数据进行编号,一个个的输入不但浪费时间还容易出错,那么怎样利用Excel自带的公式进行输入呢? 工具/原料 电 ...
- 怎样让表格的行高一样_excel表格多数据如何设置行高-Excel EXCEL中如何把行高平均成一样高...
excel表格如何设置行高 1.本次操作的软件为Excel电格,软件版本为office和学生版2016. 2.首先打开Excel电子表格,根据问题描述,我们格中输入用于演示设置表格最合适的行高列宽的数 ...
- Excel中如何对某一列或者几列进行简单的函数运算得到新的一列?
Excel中如何对某一列进行简单的函数运算得到新的一列? 如上图所示,直接在单元格出写出你想要的的公式,再回车就行了 记住最前面一定要加=========等号! 我一开始一直没加,搞了好久才发现是这个 ...
- java excel 删除行_使用Apache POI在Excel中删除多行
我有一张包含75行表格的Excel表格 . 在第76行我有各列的总功能 =SUM(A1:A75) 和 =SUM(B1:B75) 在第77到第92位的行我有一个Excel图表这需要A1:A75和B1:为 ...
- matlab柱状图 两列,excel中A、B两列数字做柱状图,但是出来两个柱,怎样让A变成横座标?...
excel中A.B两列数字做柱状图,但是出来两个柱,怎样让A变成横座标?以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! ...
- python表格多列合并_python 合并excel表格数据-如何用python从excel中同时提取两个列的数据,并生成dict(用xlrd)...
用Python导出工程文件两个子页里的数据成为两个excel表格,但我想把它合并成个一个excel表格的两个sheet 可以采用一些操作Excel块去实现,比如xlrd.xlwt.openpyxl.x ...
- 钢琴键盘excel_如何通过键盘在Excel中插入新行?
钢琴键盘excel If you are a keyboard ninja, then you hate having to move your hands from the keyboard for ...
最新文章
- 深入浅出理解Paxos算法
- 学习LINUX的几点注意事项
- 如何有效地防止网站和手机APP的数据被采集?
- 【Luogu】P3356火星探险问题(费用流)
- ICCV2017 论文解读:基于图像检索的行人重识别 | PaperDaily #13
- centos系统php环境配置,CentOS 6.4系统下编译安装LNMP和配置PHP环境具体步骤
- OpenMap教程3 –使用MapHandler构建基本的地图应用程序–第2部分
- 从前端html 来限制删除去掉csdn页面广告
- 本周计划(4月12日-19日)
- 网络编程中客户端链接的合法性,socketserver模块
- php生成随机汉字,PHP随机生成中文段落示例【测试网站内容时使用】
- android 横向滚动图片,Android使用Photoview实现图片左右滑动及缩放功能
- 使用PHPWord生成word文档
- Codeforces #430 dv.2 842A ,842B
- Android7.1 Audio Debug相关方法
- 虚拟机以及Linux CentOS 7安装
- 1、马克思主义哲学是科学的世界观和方法论
- java file.length 单位_Java File length()用法及代码示例
- 360度动态罗盘时钟HTML源码
- windy数(数位dp)
热门文章
- php 打印去掉页眉页脚,window.print打印 去掉页眉页脚及打印链接
- 谈谈我对软件工程专业的理解
- TTL信号也能高速稳定的传输100m+,是的,你没有听错,量产电路推荐
- 树莓派怎么切换输入法_树莓派如何安装中文输入法
- 一步解决桌面文件需要管理员权限才能删除问题
- Typora恢复文件,找回忘记保存的记录
- 传递组播与广播帧:数据待传指示传递信息(DTIM)
- Xp计算机同步时间,windows xp时间不准不能自动同步的解决办法
- 米家的扫地机器人是灰色_重新定义扫地机器人概念——米家扫地机器人 - IT168试客...
- 计算机网络英文题库(含答案) Chapter 1 Computer Networks and the Internet