EXCEL中,一行数,要求在求总和的前提下,如果有连续的数,每连续3个数,总和要加一
有群友提了一个问题,就是要计算一行数,在求总和的情况下,如果有连续的数,那么每连续3个数,总和就要加1。例如如下:

如图,B2到X2为一行数值,它的总和是99,它有5段连续的数,每连续3个就要加1,但是小于3个的就不加,所以如图应该多加5。总数应该是104。根据要求,我通过两种方法来实现:
方法一、我想着通过统计每段数据的个数,然后提出出各段数据的最大数,最后除以3后再取整,得到一个逢3加1的结果。先放上最终公式:
1 =LET( 2 DataRange,B2:X2, 3 Data, SCAN(0,DataRange,LAMBDA(x,y,IF(y="",0,x+1))), 4 Flag, SCAN(0, Data, LAMBDA(x,y, IF(y=0, x+1, x))), 5 DataMax, BYCOL(Flag, LAMBDA(x, MAX(FILTER(Data, Flag=x)))), 6 uFlag,UNIQUE(Flag,TRUE), 7 DataCout,BYCOL(uFlag, LAMBDA(x, UNIQUE(FILTER(DataMax, Flag=x),TRUE,FALSE))), 8 SUM(DataRange)+SUM(SCAN(0,DataCout,LAMBDA(x,y,INT(y/3)))) 9 )
下面是我分析的过程:

第3行:用来累加计数,如果原始数据为空,就补0,这样也方便后面分区域。
第4行:因为考虑后面要用Filter来过滤,所以我增加一个辅助数据,按0做为分区条件,把第3行的结果分成若干个区域。
第5行:用ByCol来引用数据,再通过Filter函数来按分区取得当前区域最大的数。
第6行:把第4行结果的区域去重,只保留分区的数量。
第7行:还是用ByCol,通过引用不重复的分区数量,把第4、5的结果按区域去重,只保留最大的数。
第8行:用Scan把上面的结果除以3,并取整,这样就保证了逢3加1。最后再加上原始数据的求和结果,就是我们要的结果。
方法二:我想着既然数值是分开的,而且我只是求数量,那我是不是可以把各区的数据合并成字符串,再来求得每个区间的个数。先放上最终公式:
1 =LET( 2 DataRange,B2:X2, 3 Data,SCAN(,DataRange,LAMBDA(x,y,IF(y="",0,y))), 4 Str,TEXTJOIN(" ",TRUE,Data), 5 StrSplit,TRIM(TEXTSPLIT(Str,"0")), 6 StrCount,LEN(StrSplit)-LEN(SUBSTITUTE(StrSplit," ",""))+1, 7 SUM(DataRange)+SUM(SCAN(0,StrCount,LAMBDA(x,y,INT(y/3)))) 8 )
下面是我分析的过程:

第3行:把原始数据逢空就补为0,为了方便后面字符串的分割。
第4行:把上面补0后的结果,把各列数据用空格分开,并组成一个字符串。
第5行:把上面的字符串按0分割成若干小区间,重点在Trim,需要把字符串中多余的空格去掉。
第6行:因为各区间都是“数值+空格+数值+空格+数值”这样的格式,那我们就可以计算原字符串长度,减去去掉空格的字符串长度来计算出我这个区间有几个数值,别忘了最后加1,否则出错。
第7行:这个和上面最后一步是一样的。
总结:一般遇上这种问题,我们可以一步步的拆开来,按步骤得到阶段结果后,再用Let函数结合成一个函数。

浙公网安备 33010602011771号