配色: 字号:
用自定义函数提取单元格内字符串中的数字
2015-10-25 | 阅:  转:  |  分享 
  
用自定义函数提取单元格内字符串中的数字来源:excel格子社区如果Excel单元格中包含一个混合文本和数字的字符串,要提取其中的数字,通常可
以用下面的公式,例如字符串“隆平高科000998”在A1单元格中,在B1中输入数组公式:=MID(A1,MATCH(1,--IS
NUMBER(--MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1)),0),COUNT(--MID(A1
,ROW(INDIRECT("1:"&LEN(A1))),1)))公式输入完毕按Ctrl+Shift+Enter结束,公式返回文
本形式的数值“000998”。下面的公式也可以提取字符串中的数值,并返回数值形式:=LOOKUP(9E+307,--MID(A1
,MIN(FIND({0;1;2;3;4;5;6;7;8;9},A1&1234567890)),ROW(INDIRECT("1:"
&LEN(A1)))))公式返回“998”。上述两个公式适合于字符串中包含连续数字的情况。但有时字符串中可能包含多个被文本分隔
的数字,如“世纪家园31栋3单元901室”中就包含了3个数值,用上面的第二个公式只能返回第一个数值“31”,而第一个公式不能得到正
确的结果。要分别提取字符串中的各个数值,可以用下面的自定义函数。在Excel中按Alt+F11,打开VBA编辑器。单击菜单“插入
→模块”,在代码窗口中输入下列代码:FunctionGetNums(rCellAsRange,numAsInteger
)AsStringDimArr1()AsString,Arr2()AsStringDimchrAsStr
ing,StrAsStringDimiAsInteger,jAsIntegerOnErrorGoTol
ine1?Str=rCell.TextFori=1ToLen(Str)chr=Mid(Str,i,1)
If(Asc(chr)<48OrAsc(chr)>57)ThenStr=Replace(Str,chr,
"")EndIfNext?Arr1=Split(Trim(Str))ReDimArr2(UBound(Arr1
))Fori=0ToUBound(Arr1)IfArr1(i)<>""ThenArr2(j)=Arr1
(i)j=j+1EndIfNext?GetNums=IIf(num<=j,Arr2(num-1),
"")line1:EndFunction该自定义函数定义了两个参数,第一个参数指定字符串所在的单元格,第二个参数指定提取字符
串中的第几个数值。如果字符串中仅包含2个数值,而第二个参数大于2,则函数会返回空。返回Excel工作表界面。假如上述字符串在A2
单元格中,在B2中输入:=Getnums(A2,1)公式将以文本形式返回字符串中的第一个数值。要得到字符串中的第N个数值,将公
式中的第二个参数“1”替换为N即可,如下图D2中的公式:=Getnums(A2,3)返回“901”。?说明:该自定义函数在处
理小数形式的数值时,将小数点“.”也视为字符,因而对于小数可分别提取小数的整数部分和小数部分。1、数字在前。?如果字符串中数字在前
,如A1单元格中字符为56ABC,我们可以用下面的公式来提取。?=LOOKUP(9^9,--LEFT(a1,ROW($1:$9)
))数组?估计很多没基础的看不懂上面的公式,9^9是什么?后面row又是什么用法?这里简单介绍一下吧。lookup函数可以查找到
一组数中最后一个数字,那么我们就用left进行截取前1个,前2个,前3个..前9个,怎么实现这个,就是把left第二个参数设置成一
个数组。row函数可以生成一个数字序列来完成这个任务。?2、数字在后?如果数字就不能用上面的方法了。我们可以查找最前的数字位置然后
用MID函数提取。=MID(A1,MIN(FIND(ROW($1:$10)-1,A1&"0123456789")),9)数组?公
式说明:使用find查找第一个数字的位置,row生成0~9的数字,后面之所以加上0~9,因为如果字符串中没有某个数字,查找返回错误
值,从而会让整个公式产生错误。?3数字在中间?数字在中间是最难提取的,不能再用简单的截取就能实现了。那怎么办呢?我们可综合一下两
种方法。=LOOKUP(9^9,--LEFT(MID(A1,MIN(FIND(ROW($1:$10)-1,A1&"0123456789")),10),ROW($1:$9)))数组1格子社区-Excel互助交流平台
献花(0)
+1
(本文系阳光的bilan...首藏)