我最喜欢的字符串数据求和经典套路,直到今天终于彻底弄明白了其复杂的逻辑思路!

文摘   2024-08-27 19:50   广东  






小伙伴们好,今天来和大家分享一道烧脑的计算题目。题目的确比较复杂,今天介绍的这个技巧也是我们过去曾经多次介绍的。正所谓,熟能生巧,熟练掌握它,将能从容面对同类型的题目。

题目是下面这样的:




要求按照每天的消费来计算余额。

这种类型的题目,在帖子华山论剑:数字提取技术谁更强,应用之家帮你忙中已经有过详细的介绍了。今天再次重温,有一点小小的不同,请大家在阅读时留意哦!


01

经典套路求字符串中数值之和





在单元格B2中输入下列公式,三键确认并向右拖曳即可。

=SUM(TEXT(LEFT(TEXT(MID(MID(B1,11,100),COLUMN(A:CT),ROW(2:12)),),ROW(1:11)),"0.00;-0.00;0;!0")*ISERR(-MID(MID(B1,11,100),COLUMN(A:CT)-1,2)))

公式比较复杂,朋友们可以不必详细了解其中的细节,只需要牢记并会套用就可以了。

MID(MID(B1,11,100)

由于日期是不参与计算的,因此首先要把日期数据从字符串中去除掉。

MID(MID(B1,11,100),COLUMN(A:CT),ROW(2:12))

从新生成的字符串中,从第1个字符开始依次向右,在每个位置上都分别提取长度为23...12的字符串。

计算结果比较长,这里就不再展示了。最终形成的是三维的内存数组。在这个内存数组中有11行(每行的纵深为234...1298列(COLUMN(A:CT))。

大家可以想象一下,这个内存数组就是一个长方体,长对应着98,宽对应着2~12,高对应着11

TEXT(MID(MID(B1,11,100),COLUMN(A:CT),ROW(2:12)),)

利用TEXT函数将所有数值都转换为空值。

这样做的目的是,上面的内存数组中,必定会有以数字开头,包含一定文本的字符串。我们的目的是,从这样的字符串中提取数值。因此为了避免重复计算,所以把所有生成的数值都替换为空。

LEFT(TEXT(MID(MID(B1,11,100),COLUMN(A:CT),ROW(2:12)),),ROW(1:11))

再次,利用LEFT函数,从上面那个内存数组中的每一个字符串的第1位开始,第1行提取长度为1;第2行提取长度为2;第3行提取长度为3...、第11行提取长度为11的字符串。

注意这里ROW(1:11)和上面ROW(2:12)的关系。由于本题目公式不需要拖曳,因此不需要设置为绝对引用。同时这里也不需要你去了解为什么是ROW(1:11)ROW(2:12),记住即可。

IFERROR(--LEFT(TEXT(MID(MID(B1,11,100),COLUMN(A:CT),ROW(2:12)),),ROW(1:11)),0)

减负运算后将错误值转换为0。这一步是把文本型数字转为数值型数字,同时将不需要的文本字符串都转换为0,不要影响后续的计算。

TEXT(LEFT(TEXT(MID(MID(B1,11,100),COLUMN(A:CT),ROW(2:12)),),ROW(1:11)),"0.00;-0.00;0;!0")

再次利用TEXT函数将所有的整数都转换为“0.00”的格式;所有的负数都转换为“-0.00”的格式;所有的0转换为“0”;所有的文本强制转换为“0”。

其实上面这部分就是TEXT函数的第二参数"0.00;-0.00;0;!0"

ISERR(-MID(MID(B1,11,100),COLUMN(A:CT)-1,2))

接下来,剔除日期后,从第0个字符字符开始,依次提取长度是2的字符串。生成的内存数组中既有数值,也有文本,以及两者的组合。

利用负号“-”和ISERR函数将所有的文本字符串对应的返回TRUE,数值返回FALSE

SUM(TEXT(LEFT(TEXT(MID(MID(B1,11,100),COLUMN(A:CT),ROW(2:12)),),ROW(1:11)),"0.00;-0.00;0;!0")*ISERR(-MID(MID(B1,11,100),COLUMN(A:CT)-1,2)))

最后,两部分相乘,再以SUM函数求和,得到最终结果。


02

极简数据助你理解公式内核


为了更好地理解上面这个公式,我把源数据做了简化如下,方便朋友们的理解。





这是一个极简的源数据,方便我们观察每一步下结果的变化。


TEXT(MID(A1,COLUMN(A:E),ROW(2:12)),)

这一步的结果如下:





LEFT(TEXT(MID(A1,COLUMN(A:E),ROW(2:12)),),ROW(1:11))

这一步的结果如下:





TEXT(LEFT(TEXT(MID(A1,COLUMN(A:E),ROW(2:12)),),ROW(1:11)),"0.00;-0.00;0;!0")

这一步的结果如下:





MID(A1,COLUMN(A:E)-1,2)

这一步的结果如下:





-MID(A1,COLUMN(A:E)-1,2)

这一步的结果如下:





ISERR(-MID(A1,COLUMN(A:E)-1,2))

这一步的结果如下:





TEXT()*ISERR()的结果如下:





最后SUM函数求和即可。



本期内容练习文件提取方式:

链接:https://pan.baidu.com/s/1WqIulodwRnRfEuMFo3Thgw?pwd=us9e

提取码:us9e

Excel应用教程
主要提供Excel vba,函数,图表,数据透视表,pq,Js等教程
 最新文章