小伙伴们好,今天来和大家分享一道烧脑的计算题目。题目的确比较复杂,今天介绍的这个技巧也是我们过去曾经多次介绍的。正所谓,熟能生巧,熟练掌握它,将能从容面对同类型的题目。
题目是下面这样的:
要求按照每天的消费来计算余额。
这种类型的题目,在帖子华山论剑:数字提取技术谁更强,应用之家帮你忙中已经有过详细的介绍了。今天再次重温,有一点小小的不同,请大家在阅读时留意哦!
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个字符开始依次向右,在每个位置上都分别提取长度为2、3...、12的字符串。
计算结果比较长,这里就不再展示了。最终形成的是三维的内存数组。在这个内存数组中有11行(每行的纵深为2、3、4...、12)98列(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