你会提取单元格中的手机号吗?
本文由两部分构成,其一提出问题并解决问题;其二解释相关函数公式。
1,
有这样一个问题,如下图所示,A列是数据列,混合文本中夹杂着手机号码;现在,需要在B列把A列数据中的手机号码提取出来。
您打算怎么操作呢?
当然是……快速填充了。
然而,快速填充这个玩意儿,时灵时不灵的。
小数据时用两下还可以,毕竟结果若是错了一眼就可以看出来。而大数据时,还是别用了,简直等同于自杀,而且怎么死的都不知道。
比如这个问题,快速填充的结果如下:
这问题如果使用函数公式解决,常用的套路有以下4个:
1、=MAX(IFERROR(--MID(A2,ROW($1:$50),11),0))
2、=MIN(IFERROR(--MID(A2&'a',ROW($1:$50),11),'T'))
3、=VLOOKUP(,MID(A2,ROW($1:$50),11)*{0,1},2,)
4、=-LOOKUP(,-MID(A2&'a',ROW($1:$50),11))
本例中,四个公式的计算结果相同,但由于它们的计算原理并不一样,在不同的例子上彼此之间还是有所区别的。
MAX函数是提取参数中的最大值,MIN函数是提取参数中的最小值。因此,当单元格存在多个手机号时,两者所提取的结果将不同。
VLOOKUP函数的查询机制是从前向后查,且查到即止,只提取首个查询结果。
LOOKUP(比查询范围内所有值都大的同类型的值,查询范围),该套路是提取最后一个符合条件的结果。
你瞧,两个函数的查询机制刚好是反过来的;没有优劣之分,只是各有所长。如果我们需要提取首个手机号,可以使用VLOOKUP;如果是提取最后一个手机号,可以使用LOOKUP。
2,
四个公式都用到了MID(A2,ROW($1:$50),11)语句。该语句的意思是,从A2单元格的第1~50位的位置分别提取11个字符。只所以提取11个字符是因为手机号为11位。
=MAX(IFERROR(--MID(A2,ROW($1:$50),11),0))
--MID()是将MID函数的计算结果转换为数值,当MID函数的计算结果为纯文本时,减负运算将返回错误值,因此使用IFERROR函数将错误值转换成0,最后使用MAX函数提取最大值。
=MIN(IFERROR(--MID(A2&'a',ROW($1:$50),11),'T'))
和MAX函数套路不同的是,MID的第一参数为A2&'a',这是防止数值存在单元格尾部时,造成公式计算错误。IFERROR将错误值屏蔽为文本”T”,是因为MIN函数计算时会忽略文本值,此处的”T”可以替换为其它文本字符,例如“星光”,”” “亲爱的”等等。
=VLOOKUP(,MID(A2,ROW($1:$50),11)*{0,1},2,)
VLOOKUP的第一参数是0,公式做了省略处理。
MID(A2,ROW($1:$50),11)*{0,1},通过MID函数的计算结果和常量数组{0,1}之间运算,产生了两列50行的二维数组,从中查询首个数值。
=-LOOKUP(,-MID(A2&'a',ROW($1:$50),11))
LOOKUP的查找值为0,公式做了省略处理。
-MID(A2&'a',ROW($1:$50),11),该部分的计算结果有两种,一种为错误值,一种是小于等于零的数值。LOOKUP找到最后的数值后,再进行一次减法运算,将计算结果转换为正数。