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函数结合成一个函数。

posted @ 2025-07-10 15:55  Luckyegg  阅读(26)  评论(0)    收藏  举报