楼主 天南地北 |
Q:如何对一列中连续正数、负数分段求和? 如下图A1:A23中连续的正负数(已经用不同的底色表示)分段求和,效果如B列 A:在B1输入如下数组公式: 【公式一】(wjc2090742 提供)
【公式二】
【公式三】
【公式解释】 公式三为公式一的简化,在此就不对公式一进行解释,下面就分别对公式二和公式三进行解释 公式二:核心部分SMALL(IF(A$1:A$23*A$2:A$24<0,ROW($1:$23),23),ROW()),作用是找到行分界点,然后返回分界点所在行,此例分界点为5,8,9,11,13,18,21,22,当不满足A$1:A$23*A$2:A$24<0时,返回23,也就是IF(A$1:A$23*A$2:A$24<0,ROW($1:$23),23)返回一个1列23行的数组为{23;23;23;23;5;23;23;8;9;23;11;23;13;23;23;23;23;18;23;23;21;22;23} 然后利用SMALL分别提取第1至第23大的分段点,也就是行号,再利用OFFSET的第四个参数Height 来返回对应的区域给SUM求和,例如第一段也就是从A1开始行高为5的区域求和。 公式的第二部分SUM(INDEX(B:B,IF(ROW()=1,4^8,1)):INDIRECT("r[-1]c",))主要是因为前面OFFSET从A1开始的累加求和,所以返回的结果要减去B列上面所有的和,为了防止循环引用,在此使用IF判断,当公式在第一行时候,INDEX(B:B,IF(ROW()=1,4^8,1)):INDIRECT("r[-1]c",)返回的是B65536:B65536(以2003版为例,也就是最大行),当公式拉至第二行时候INDEX(B:B,IF(ROW()=1,4^8,1)):INDIRECT("r[-1]c",)返回的是B1:B1,INDIRECT("r[-1]c",)表示所在列的上一行,由此实现分段累加。 公式三:利用MMULT数组构造功能,ROW($1:$23)>COLUMN(A:W)返回23行23列的二维数组,与23行的一维数组矩阵相乘,得到23行1列的一维数组,本例中MMULT(N(ROW($1:$23)>COLUMN(A:W)),N(A$1:A$23*A$2:A$24<0))计算结果为{0;0;0;0;0;1;1;1;2;3;3;4;4;5;5;5;5;5;6;6;6;7;8},然后+1,得到段数的累计{1;1;1;1;1;2;2;2;3;4;4;5;5;6;6;6;6;6;7;7;7;8;9},然后当这个等于1时求第一段的和,依次类推 如何对一列中连续正数、负数分段求和?(附件).rar |
2楼 omnw |
公式分析的很好,容易理解 |
3楼 CheryBTL |
总结的很好,收藏学习~~~ |
4楼 水之歌 |
来学习MM函数 |