
Excel异常强大,虽然日常很多人可能只发挥了其1%的潜力,就已经可以实现报表的制作和常用的功能,不愧是windows上难以替代的优秀软件。但更多的时候很多数据不能直接使用,需要进行加工和清洗,而只用一些简单的操作就略微吃力,所以excel拥有了函数,VBA,以及应用程序的加入,让其成为一只真正的怪物;
昨天,有位朋友问我,有一列导出来的数据,数字和汉字无规则混合在一起,怎么分别提取出所有的数字。我问ta以前怎么处理的,ta说手工输入的...几百个单元格...
案例如(此数据纯属瞎编乱造):

特征:
1.数字与汉字混合存在,但数字在一个单元格内只出现一次,不会分开出现,
2.数字可以出现在任何位置,同一列可重复出现;
作为一名对数字(联系方式)深恶痛绝的办公的一员,看至数字就要抓出来干掉,那怎么把这些看似没有规则的数字提取出来呢,我仰望星空,陷入了沉思之中~
分列篇
(基础)
如果不用函数和VBA,分列应该是最好的方法了——口胡,就这么7行,手动输入才是最快速的方法吧!
呃,的确如此,不过如果数据很多,输入就非常耗时,而且有输入错误的风险,“数据--分列”的优势自然也就体现出来,不过分列的基本用法只提供了分隔符和固定宽度,也就是说在数据有一定规律的情况下使用更为简便,比如:

对待如此工整的数据,分列既可以用固定宽度(自己决定分开的点),也可以用分隔符,比如空格(红色标识出来的部分)可以分成“外地出差时间”和后面的信息;也可以用冒号或者“至”,但要注意作为分割符合的字符将会消失;

(进阶)
可惜目标案例中,无论是固定宽度,还是分隔符,好像都无法满足要求,那么----就对数据加工一下(复制至B列,对B列进行加工):

1.调节B列的宽度,使其宽度只有1个字大小;

2.选中B列,鼠标点击开始>>填充>>两端对齐;选中的B列就会被拆开排下去;
3.保持b列被选中的状态,做一次分列(按默认的走一边流程,因为上一步拆开来的数字是文本的形式储存的):数据>>分列(分割符合)>>Tab键(默认)>>完成
4.保持b列被选中的状态,ctrl+g(或者开始>>查找和选择>>定位条件)进行定位,选中“常量”,并只保留“文本”:按确定,即可选中所有非数字的单元格:

5.右键点击删除,再选择下方单元格上移,即可完成:

把b列的宽度调整一下即可:

分列结合填充和定位,完成了朋友的任务,可喜可贺,可喜可贺~
函数篇
百度说,excel2010有407个有显示的函数;真假无所谓,也不会差太多,重要的是常用的其实真不多。那如果用函数怎么解决这个问题呢?
MID函数——从一个文本字符串的指定位值开始,截取指定数目的字符;
简单的说,就是:MID(目标单元格,内容左边开始的位置,截取字的个数)
(基础)
还是从简单的开始:对于有规则的如:
为了体现函数的“相对”强大,这次提取同一个单元格的2个数字在E列和F列,
那E1的公式是=MID(D1,8,10) #空格和:都算1个字符,2在第8个字符;一共10个字符;
而F1的公式是=MID(D1,20,10) #第二个日期的2开始于第20个字符;

关于左边开始的位置和截取字的个数(8和20是怎么通过公式算的),与其一个一个去数容易出错,这提供另外两个函数,也为下一步做预热:
find()函数(可用户开始的位置)
简单的说,find(要查找的内容加引号或单元格,查找区域,从第几个字开始查(省略按开始算))
而mid()函数的第二三个参数(截取字的个数)也可以通过另一个函数计算得至:
len()和lenb()函数(可用户截取的个数):
简单的说,两个函数都是返回文本字符串字符数,但len()无论汉字标点英文空格,一视同仁,但lenb()视汉字为尤物,一个頂两——一个汉字占两个字符串数;在这个案例中暂时只需要使用len():

了解并得至了MID()函数的重要参数后,补完公式好后下拉填充即可;

(进阶)
但是,这个基础的用法还是和分列一样,对有规则的数据可以一战,对于问题好像还是力不从心,真的是这样吗?直接上效果公式和效果:
=MID(A1,MIN(FIND({0,1,2,3,4,5,6,7,8,9},A1&"0123456789")),2*LEN(A1)-LENB(A1))

函数的强大和难掌握在于嵌套,但实际上了解了每个函数的用法后,还是可以解析并掌握的:
依然是MID函数的三要素:
1.目标单元格:A1单元格
2.内容左边开始的位置
嵌套了一个find()函数,大括号的数字0-9是目标值,A1&"0123456789"则是为了处理错误值用的(大括号中要查找的目标数字从0至9,但除了最后一行外,都不满足全部匹配,则会造成#VALUE!错误,加上A1&"0123456789"或者A1&1/17可以避免这种错误)

3.截取字的个数
上面简单的案例中只是大致讲了len()和lenb()的区别,但因为这个案例中第二步只是定位至目标文本(数字)的起始位置,而数字有多少长的规律比较难直接观察,所以一般使用这样的方法来获取,可以反向验证一下,len汉字占一个字符,lenb汉字占2个字符:

要达成同样的效果,至少还有2组函数可以做至,应该还有更多,但应该都需要使用嵌套或者需要数组公式,既然满足了开局的条件,就暂时不展开了;
题外话,要是真对于这么点数据使用函数,真是高射炮打蚊子...
VBA
VBA是excel的一个大杀招,听说WSP专业版里也有,反正我圈子小,从未见过有人使用过,这里也不分初级和进阶的回顾了,直接解决问题,为了体现VBA的强大,再加一条规则,数字在同一个单元格分开多次出现(函数也应该可以做至,但需要更复杂的方法)一些更如垃圾信息里常常遇至的:

如果平时不使用VBA的话,在开发者工具里的Visual
Basic是默认不显示的,可以从文件>>选项>>自定义功能区主选项卡中进行添加;
现在的VBA都是需要另保存为启用宏的工作本(后缀为.xlsm),做好一切前戏后,按alt+F11(或者开发工具>>Visual
Basic),选择插入(I)>>模块(M)

----代码我这就不解释了(相关数组,循环等以及VBA的很多相关知识点),然后可以在页面做个按钮控件,一键下单,快速实现需要的功能:


终于完成,就结果来说是很轻松和简单,但过程,还是有比较复杂...
王道
听了朋友的困惑,我对ta说:解决这个问题,我有3把斧头可以帮助你,你需要金斧头,银斧头,还是铁斧头?
ta说:“我要能1秒搞定的光速斧头!”
“这有点难,不过3秒应该可以完成。”
“!?”


使用excel的自动填充柄(Ctrl+E)功能,简直不要太简单!
”等等,我只有4个选项,没有快速填充啊“
”哦,你装了假的excel....“
”....“
”这个功能是2013才加入的功能,如果装是10或者更早的版本自然不能使用,还是老老实实的用分列吧~“
”呜呜呜~“
--------------------------------------------------------------------------------------------------------
•尾巴:
因为我并不知道大家的水平,可能无法找至合适的切入点,但想尝试着用这个案例入手,从4个角度来解决问题,难易度从简单-->复杂-->无脑,从中和大家一起回顾一些Excel相关的使用技巧和方法,俗话说条条大路通罗马,希望大家能找至最适合自己的那条道路;


网友评论