在 Excel 中对多行多列进行条件求和

  • 问题由来
  • 源数据格式
  • 为什么不能直接求和
  • 我的解决过程
    • 用 SUMPRODUCT 函数的失败过程
    • 分析错误
    • 解决问题
    • 用 SUMPRODUCT 解决问题
  • 我在 CSDN 的第一篇博客

问题由来

前几天,一名网友在微信群里求助,说有一个表格汇总数据不会算。经过两天努力,我帮他写了一个宏,顺利完成了任务。这个按字段汇总的宏我以后再说,今天只说验算的公式。
由于源数据比较多,出于谨慎,我需要将宏算出来的汇总表进行验算,并且最好是用一个单元格用单个公式完成对源数据的加和运算,因此想编写一个公式把源数据表所有符合条件的数据加和,再对汇总表加和,比较两个和是否一致。

源数据格式

源数据是由上百个结构相同的数据块组成的数据块纵列。下面展示连续的两个数据块:

每个数据块的格式如下:

  1. 总共有21行、13列;
  2. 第1行是标题,第20、21行是需要被忽略的数据,从第2行到第19行是需要汇总的数据;
  3. 所有数据块的第二列是纵向标题,每块都一样,都是18个同样次序排列的字母;
  4. 每块数据块的第一行是横向标题,此部分每个数据块都不一样,且数量有多有少;
  5. 由此可以看出,需要求和每个数据块从第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 中对多行多列进行条件求和相关推荐

  1. excel中怎么将行转换为列及列转换成行

    操作方法 01 选中要把行转换为列的数据.然后点击键盘上的ctrl+c. 02 在需要放置的单元格上,右键点击,然后点击菜单上的'选择性粘贴'. 03 在弹出的窗口上,点击勾选上'转置'.点击确定按钮 ...

  2. Oracle对sum求和进行if,Excel中sumif函数和sumifs函数进行条件求和的异同

    sumif函数和sumifs函数是Excel2007版本以后新增的函数,功能十分强大,实用性很强,本文介绍下Excel中通过用sumif函数和sumifs函数的条件求和的异同,并对函数进行解释,以便各 ...

  3. Excel中3个超级好用的条件求和的函数

    在EXCEL中我们经常会用到很多计算,而求和是使用频率最高的计算了,今天我们就讲解一下EXCEL中3个最好用的求和函数,SUM函数.SUMIF函数.SUMIFS函数,我们看下面几个案例. 1.求和函数 ...

  4. 怎样在excel中拉出递增的一列数

    Excel作为一种应用广泛的软件,得到了一致好评.在Excel中我们经常会用连续的数将一组数据进行编号,一个个的输入不但浪费时间还容易出错,那么怎样利用Excel自带的公式进行输入呢? 工具/原料 电 ...

  5. 怎样让表格的行高一样_excel表格多数据如何设置行高-Excel EXCEL中如何把行高平均成一样高...

    excel表格如何设置行高 1.本次操作的软件为Excel电格,软件版本为office和学生版2016. 2.首先打开Excel电子表格,根据问题描述,我们格中输入用于演示设置表格最合适的行高列宽的数 ...

  6. Excel中如何对某一列或者几列进行简单的函数运算得到新的一列?

    Excel中如何对某一列进行简单的函数运算得到新的一列? 如上图所示,直接在单元格出写出你想要的的公式,再回车就行了 记住最前面一定要加=========等号! 我一开始一直没加,搞了好久才发现是这个 ...

  7. java excel 删除行_使用Apache POI在Excel中删除多行

    我有一张包含75行表格的Excel表格 . 在第76行我有各列的总功能 =SUM(A1:A75) 和 =SUM(B1:B75) 在第77到第92位的行我有一个Excel图表这需要A1:A75和B1:为 ...

  8. matlab柱状图 两列,excel中A、B两列数字做柱状图,但是出来两个柱,怎样让A变成横座标?...

    excel中A.B两列数字做柱状图,但是出来两个柱,怎样让A变成横座标?以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! ...

  9. python表格多列合并_python 合并excel表格数据-如何用python从excel中同时提取两个列的数据,并生成dict(用xlrd)...

    用Python导出工程文件两个子页里的数据成为两个excel表格,但我想把它合并成个一个excel表格的两个sheet 可以采用一些操作Excel块去实现,比如xlrd.xlwt.openpyxl.x ...

  10. 钢琴键盘excel_如何通过键盘在Excel中插入新行?

    钢琴键盘excel If you are a keyboard ninja, then you hate having to move your hands from the keyboard for ...

最新文章

  1. 深入浅出理解Paxos算法
  2. 学习LINUX的几点注意事项
  3. 如何有效地防止网站和手机APP的数据被采集?
  4. 【Luogu】P3356火星探险问题(费用流)
  5. ICCV2017 论文解读:基于图像检索的行人重识别 | PaperDaily #13
  6. centos系统php环境配置,CentOS 6.4系统下编译安装LNMP和配置PHP环境具体步骤
  7. OpenMap教程3 –使用MapHandler构建基本的地图应用程序–第2部分
  8. 从前端html 来限制删除去掉csdn页面广告
  9. 本周计划(4月12日-19日)
  10. 网络编程中客户端链接的合法性,socketserver模块
  11. php生成随机汉字,PHP随机生成中文段落示例【测试网站内容时使用】
  12. android 横向滚动图片,Android使用Photoview实现图片左右滑动及缩放功能
  13. 使用PHPWord生成word文档
  14. Codeforces #430 dv.2 842A ,842B
  15. Android7.1 Audio Debug相关方法
  16. 虚拟机以及Linux CentOS 7安装
  17. 1、马克思主义哲学是科学的世界观和方法论
  18. java file.length 单位_Java File length()用法及代码示例
  19. 360度动态罗盘时钟HTML源码
  20. windy数(数位dp)

热门文章

  1. php 打印去掉页眉页脚,window.print打印 去掉页眉页脚及打印链接
  2. 谈谈我对软件工程专业的理解
  3. TTL信号也能高速稳定的传输100m+,是的,你没有听错,量产电路推荐
  4. 树莓派怎么切换输入法_树莓派如何安装中文输入法
  5. 一步解决桌面文件需要管理员权限才能删除问题
  6. Typora恢复文件,找回忘记保存的记录
  7. 传递组播与广播帧:数据待传指示传递信息(DTIM)
  8. Xp计算机同步时间,windows xp时间不准不能自动同步的解决办法
  9. 米家的扫地机器人是灰色_重新定义扫地机器人概念——米家扫地机器人 - IT168试客...
  10. 计算机网络英文题库(含答案) Chapter 1 Computer Networks and the Internet