EXCEL表格按分割符用什么公式可以提取单元格里的文字内容公式求解

遇见一个奇葩案例(为什么我总是遇到那么多奇葩案例?),做表格的人把产品名称、计算金额的算式及其结果,放到了同一个单元格,现在要求把产品名称、产品数量、产品单价和金额分离出来,如下图所示:我对这位做表格的童鞋的敬仰如滔滔盘龙江水,连绵不绝——那么多简单的做表方法和计算方法,ta偏偏选择了最复杂的一种,真是具有我辈所缺乏的敢于向困难挑战的非凡勇气。我好奇单元格中【=】后面的数字是拿计算器算出来的么?还是用的纸笔写竖式算出来的?我还是停止讽刺这位童鞋,进入正题,要不然就是厕所里扔石头,激起公愤了。01方法一:用PowerQuery的Text.PositionOfAny()函数实现1.首先我们引入来自于同一个Excel文件中某个Sheet的区域(表格)数据源,我在《Excel中10秒合并多行数据到一个单元格的方法(建议收藏)》中有详细介绍,这里不赘述。2.找到原始数据中每一行数据里,第一个数字出现的位置,待会儿我们要基于它进行提取:= Table.AddColumn(更改的类型, "第一个数字出现的位置", each Text.PositionOfAny([产品],{"0".."9"},Occurrence.First))3.记得将【第一个数字出现的位置】列设置为整数,要不然后面提取时会出错。选中该列,然后在菜单栏的【数据类型】里选【整数】。4.提取算式。我们对原始数据分析发现,第一个数字及其之后的内容都是算式。在PowerQuery中,从字符串某个位置之后提取其后的所有内容用的函数是Text.End(),而前面我们获取了第一个数字出现的位置,它的位置也是算式出现的第一个位置,因此用整个字符串的长度减去第一个数字出现的位置,就是整个算是的长度。= Table.AddColumn(更改的类型1, "算式", each Text.End([产品],Text.Length([产品])-[第一个数字出现的位置]))这样我们就把算式提取出来了。下面的步骤是对算式进行进一步分拆。5.分拆算式,分拆出数量、单价和金额。这个比较简单,直接用【=】和【*】分列两次即可。= Table.SplitColumn(提取算式, "算式", Splitter.SplitTextByDelimiter("=", QuoteStyle.Csv), {"算式", "金额"})= Table.SplitColumn(按分隔符拆分列, "算式", Splitter.SplitTextByDelimiter("*", QuoteStyle.Csv), {"数量", "单价"})6.然后我们提取产品名称,还是要根据之前获取的第一个数字出现的位置,用Text.Start()函数即可。然后删除不必要的列:= Table.AddColumn(按分隔符拆分列1, "产品名称", each Text.Start([产品],[第一个数字出现的位置]))这样我们就提取出了所有需要的信息,加载到表格即可。7.加载到表格。点击【关闭并上载】,选择【关闭并上载至…】,选择目标sheet即可。02用PowerQuery的Text.Remove()函数直接提取算式用PowerQuery的Text.Remove()函数分离算式来得更快更简洁(假设数据源已引入)。1.用Text.Remove()函数移除所有中文,这样剩下的就只是算式了。= Table.AddColumn(更改的类型, "算式", each Text.Remove([产品],{"一".."龥"}))其中【{"一".."龥"}】代表所有中文。记住就可以了。2.在上一步的基础上我们提取出产品名称。= Table.AddColumn(提取算式, " 产品名称", each Text.Start([产品],Text.PositionOf([产品],[算式])))因为算式之外就是产品名称,所以我们用Text.PositionOf()函数找到算式的起始位置,它之前的内容就是产品名称。3.对算式进行分列操作,和方法一种的操作是一模一样的,不再赘述。加载到表格的操作也一样,不再赘述。03结语其实最近我写的一系列提取内容的文章,如果数据都是规范的,完全可以避免这些复杂的操作。这也告诉我们,再牛逼的方法,都不及数据规范来得重要。由于国人在做表过程中,对规范实在重视不够,并且在打破规范方面天赋异禀,造成Excel被国人别出心裁地发明出了很多很多奇葩的用法。这些奇葩的用法不但不能增加Excel的可能性,反而给计算带来重重麻烦。因此,我还是呼吁,看到我这篇文以及其他文章的读者,自己在做表的时候,一定吸取这些反面例子,把数据表做规范,省时省力,何乐而不为呢

我要回帖

更多关于 用什么公式可以提取单元格里的文字 的文章

 

随机推荐