Excel-如何在大型文本中返回长度在7-10个字符之间的仅第一个数字字符串?(仅适用于公式)


1

我试图从每个都有大量文本的几个单元格中提取一些数字。

数字字符串在我尝试提取的数字字符串之前带有某些单词。

我曾尝试通过使用MID,LEFT,RIGHT,LEN,FIND和SEARCH之类的功能来解决问题,但最终结果还是错误的。

这是由于文本正文存在三个问题:

  • 第一个问题是,每个单元格之前的单词都不相同。这将使公式变得非常复杂,并且需要IF,OR或AND函数。
  • 第二个问题是我要提取的数字字符串的长度在7到10个数字之间变化
  • 第三个问题是我要提取的仅数字字符串不是单元格正文中的唯一数字字符串

我目前的解决方案是在数字字符串少于10个数字的情况下添加数字以外的其他字符;例如空格,逗号和方括号。

因此,基本上我想知道是否有一种方法可以从文本正文中提取仅7至10个字符之间的仅第一个数字的字符串?最好仅使用公式,但VBA也是可能的。


想通了,因为我还没有收到回复,所以我将编辑带有数据示例的OP。

我要处理的数据示例可以在以下位置找到:https : //www.sendspace.com/file/f7kn6n


由于我有一段时间没有收到任何回复,因此我想用几天前上传的示例数据的屏幕快照进行更新。

示例数据


始终包括一些数据和预期的输出是一个好习惯,这样人们就可以测试公式以确保其有效。
gtwebb '16

帮助我们帮助您发布输入和期望结果的几个示例。
加里大学的学生

嘿@Gary的学生和gtwebb,您是否愿意像我一样使用示例数据编辑开篇文章或添加注释,就像我现在正在做的那样?我已经尝试了两种解决方案,但不幸的是,我发现该公式在VBA正常运行时不起作用(尽管我在大约一半的单元格中遇到了#value错误)
NumberExtracting

Answers:


0

如果您的数字字符串将始终是字符串中的第一组数字,则可以使用以下公式。这是一个数组公式,通过在按下ctrl+shift时按住来输入enter

=MAX(IFERROR(--MID(A1,MIN(FIND({0,1,2,3,4,5,6,7,8,9},A1&"0123456789")),{7,8,9,10}),0))

如果您希望提取的数字之前有较短或较长的数字子串,那么我将使用下面的UDF。它利用正则表达式查找正好7到10位数长的第一位数字符串。由于它返回一个字符串,因此应保留所有前导零。

在公式中使用它,例如:

=FirstDigits(A1)

将以下代码复制到常规模块中:

Option Explicit
Function FirstDigits(S As String) As String
    Dim RE As Object, MC As Object
    Const sPat As String = "\b\d{7,10}\b"

Set RE = CreateObject("vbscript.regexp")
With RE
    .Global = True
    .Pattern = sPat
    If .test(S) Then
        Set MC = RE.Execute(S)
        FirstDigits = MC(0)
    Else
        FirstDigits = "No digit string 7-10 digits long"
    End If
End With

End Function

感谢一堆@Ron Rosenfeld,此解决方案似乎按预期方式工作
NumberExtracting

2

如果您收到满足您要求的“仅公式”答案,请忽略此答案。



这个小的UDF()将返回满足您要求的字符串中的第一个数字:

在此处输入图片说明

编码:

Public Function GetNumber(sIN As String) As Long
    Dim L As Long, i As Long
    Dim s As String

    s = sIN
    L = Len(s)
    For i = 1 To L
        ch = Mid(s, i, 1)
        If ch Like "[0-9]" Then
        Else
            Mid(s, i, 1) = " "
        End If
    Next i

    With Application.WorksheetFunction
        arr = Split(.Trim(s), " ")
    End With

    For Each a In arr
        If Len(a) > 6 And Len(a) < 11 Then
            GetNumber = CLng(a)
            Exit Function
        End If
    Next a
    GetNumber = 0
End Function

用户定义函数(UDF)易于安装和使用:

  1. ALT-F11弹出VBE窗口
  2. ALT-I ALT-M打开一个新模块
  3. 将内容粘贴并关闭VBE窗口

如果您保存工作簿,则UDF将随之保存。如果要在2003年以后使用Excel版本,则必须将文件另存为.xlsm而不是.xlsx

删除UDF:

  1. 如上调出VBE窗口
  2. 清除代码
  3. 关闭VBE窗口

要从Excel使用UDF:

=getnumber(A1)

要总体上了解有关宏的更多信息,请参见:

http://www.mvps.org/dmcritchie/excel/getstarted.htm

http://msdn.microsoft.com/zh-CN/library/ee814735(v=office.14).aspx

有关UDF的详细信息,请参见:

http://www.cpearson.com/excel/WritingFunctionsInVBA.aspx

必须启用宏才能使其正常工作!


1

我认为这是一个有效的公式。

=TRIM(MID(SUBSTITUTE(A1," ",REPT(" ",LEN(A1))), 
    ((1/MAX(IFERROR(1/(
        ISNUMBER((TRIM(MID(SUBSTITUTE(A1," ",REPT(" ",LEN(A1))), (ROW($1:$25)-1)*LEN(A1)+1, LEN(A1))))*1)*
        (LEN((TRIM(MID(SUBSTITUTE(A1," ",REPT(" ",LEN(A1))), (ROW($1:$25)-1)*LEN(A1)+1, LEN(A1)))))>=7)*
        (LEN((TRIM(MID(SUBSTITUTE(A1," ",REPT(" ",LEN(A1))), (ROW($1:$25)-1)*LEN(A1)+1, LEN(A1)))))<=10)*
        (ROW($1:$25))),-1)))-1)*LEN(A1)+1, LEN(A1)))

老实说,我无法以这种格式对其进行解释。它从这里开始,给出了提取第n个单词的公式

=TRIM(MID(SUBSTITUTE(A1," ",REPT(" ",LEN(A1))), (N-1)*LEN(A1)+1, LEN(A1)))

然后我必须让它检查所有添加的ROW($ 1:$ 25)代替N的单词(只是给出数组1:25)。

然后,我必须检查它是否是一个数字(isnumber),检查长度(两个len> = 7len <= 10函数,将其乘以数组1:25。

然后我需要提取与1 / max(iferror(1 /公式。其他数字为1 / N,取最大值,然后再次求反,得到最小的数字(不为0)。通过上面原始方程式中的数字返回该单词。

现在,它仅适用于字符串的前25个字(可以扩展Row(1:25))。它针对单元格A1。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.