设为首页收藏本站

嘻皮客娱乐学习网

 找回密码
 中文注册
搜索
打印 上一主题 下一主题
开启左侧

[OFFICE] 用自定义函数提取单元格内字符串中的数字

[复制链接]
跳转到指定楼层
楼主
发表于 2016-10-24 10:16:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

  如果Excel单元格中包含一个混合文本和数字的字符串,要提取其中的数字,通常可以用下面的公式,例如字符串“隆平高科000998”在A1单元格中,在B1中输入数组公式:
  =MID(A1,MATCH(1,--ISNUMBER(--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},A11234567890)),ROW(INDIRECT("1:"LEN(A1)))))
  公式返回“998”。
  上述两个公式适合于字符串中包含连续数字的情况。但有时字符串中可能包含多个被文本分隔的数字,如“世纪家园31栋3单元901室”中就包含了3个数值,用上面的第二个公式只能返回第一个数值“31”,而第一个公式不能得到正确的结果。要分别提取字符串中的各个数值,可以用下面的自定义函数。
  在Excel中按Alt+F11,打开VBA编辑器。单击菜单“插入→模块”,在代码窗口中输入下列代码:
  Function GetNums(rCell As Range, num As Integer) As String
  Dim Arr1() As String, Arr2() As String
  Dim chr As String, Str As String
  Dim i As Integer, j As Integer
  On Error GoTo line1
  Str = rCell.Text
  For i = 1 To Len(Str)
  chr = Mid(Str, i, 1)
  If (Asc(chr)  48 Or Asc(chr)  57) Then
  Str = Replace(Str, chr, " ")
  End If
  Next
  Arr1 = Split(Trim(Str))
  ReDim Arr2(UBound(Arr1))
  For i = 0 To UBound(Arr1)
  If Arr1(i)  "" Then
  Arr2(j) = Arr1(i)
  j = j + 1
  End If
  Next
  GetNums = IIf(num = j, Arr2(num - 1), "")
  line1:
  End Function
  该自定义函数定义了两个参数,第一个参数指定字符串所在的单元格,第二个参数指定提取字符串中的第几个数值。如果字符串中仅包含2个数值,而第二个参数大于2,则函数会返回空。
  返回Excel工作表界面。假如上述字符串在A2单元格中,在B2中输入:
  =Getnums(A2,1)
  公式将以文本形式返回字符串中的第一个数值。要得到字符串中的第N个数值,将公式中的第二个参数“1”替换为N即可,如下图D2中的公式:
  =Getnums(A2,3)
  返回“901”。

  说明:该自定义函数在处理小数形式的数值时,将小数点“.”也视为字符,因而对于小数可分别提取小数的整数部分和小数部分。

回复

使用道具 举报

小黑屋|手机版|嘻皮客网 ( 京ICP备10218169号|京公网安备11010802013797  

GMT+8, 2024-4-29 08:33 , Processed in 0.171994 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表