使用Excel-VBA从字符串中提取5位数字

时间:2018-07-30 09:20:22

标签: excel string vba excel-vba numbers

作为非开发人员,我面临一个问题。我在Excel中有一个列,其中包含如下信息:

46843 xxxx xxx x 

xxxx 65483 xxxx

xxxx xxx 65432 xxxxx 4 xx

“ x”是正常角色。

我想要的是只能提取五位数的数字。 我开始了类似的事情,但是努力使循环循环,以便它扫描所有字符串:

Function test()
val_in = "rue 4 qsdqsd CURIE 38320 EYBENS"
Filte = Left(val_in, 5)
If IsNumeric(Filte) Then
    test = Left(val_in, 5)
Else
    sp1 = InStr(1, val_in, " ")
    sp2 = InStr(sp1 + 1, val_in, " ")
    spt = sp2 + sp1

    If spt > 5 Then
        extr = Mid(val_in, spt, 5)
    End If
End If
End Function

如何将“其他”之后的部分变成循环,以便它扫描字符串的每个空格并仅提取包含5位数字的数字?

4 个答案:

答案 0 :(得分:2)

使用正则表达式

Option Explicit
Public Function GetNumbers(ByVal rng As Range) As Variant
    Dim arr() As String, i As Long, matches As Object, re As Object
    Set re = CreateObject("VBScript.RegExp")
    With re
        .Global = True
        .MultiLine = True
        .IgnoreCase = False
        .Pattern = "\b\d{5}\b"

        If .test(rng.Value) Then
            Set matches = .Execute(rng.Value)

            ReDim arr(0 To matches.Count - 1)
            For i = LBound(arr) To UBound(arr)
                arr(i) = matches(i)
            Next i

        Else
            arr(i) = rng.Value
        End If
    End With
     GetNumbers = Join(arr, ",")
End Function

数据:

Data


如果有多个匹配项,则返回逗号分隔的列表。

答案 1 :(得分:1)

Sub TestMe()

    Dim valIn As String
    valIn = "rue 4 qsdqsd CURIE 38320 EYBENS 43443"

    Dim i As Long
    Dim splitted As Variant

    splitted = Split(valIn)

    For i = LBound(splitted) To UBound(splitted)
        If IsNumeric(splitted(i)) And Len(splitted(i)) = 5 Then
            Debug.Print splitted(i)
        End If
    Next i

End Sub

考虑到在您的示例中,您的意思是5位数字按空格分隔,因此上述方法有效。它将字符串按空间分割成一个数组,并遍历该数组的各个元素。如果该元素包含5个字符并且为数字,则将其打印出来。


如果空格规则不是人们可以依靠的规则,则可以采用另一种实现方式:

Sub TestMe()

    Dim valIn As String
    valIn = "44244rue4qsdqsdCURIE383201EYBENS43443"

    Dim i As Long
    For i = 1 To Len(valIn) - 4
        If IsNumeric(Mid(valIn, i, 5)) Then
            Debug.Print Mid(valIn, i, 5)
        End If
    Next i

End Sub

它开始遍历字符串,检查每个5个字符是否为数字。当您使用数字6个字符时,它给出两个结果-1到5和2到6。因此383201被“翻译”为以下2:

  • 38320
  • 83201

答案 2 :(得分:0)

如果单词/数字之间始终有空格,那么应该这样做

Sub test()

    Dim TestStr As String
    Dim Temp As Variant
    Dim i As Long, FoundVal As Long

    TestStr = "rue 4 qsdqsd CURIE 38320 EYBENS"

    Temp = Split(TestStr, " ")

    For i = 0 To UBound(Temp)
        If Len(Trim(Temp(i))) = 5 And IsNumeric(Temp(i)) Then
            FoundVal = Temp(i)
            MsgBox FoundVal
        End If
    Next i

End Sub

答案 3 :(得分:0)

通过您尝试应用的解决方案(在VBA中创建自定义函数),我了解您实际上需要在公式中使用它。

要从单元格A1中查找具有五位数的数字,您可以使用不带VBA的以下公式:

=IF(ISERROR(FIND("0"&REPT("1",5)&"0",CONCAT(0+(ISNUMBER(-MID(" "&A1&" ",ROW(INDIRECT("1:"&LEN(A1)+2)),1))+0)))),"",MID(A1,FIND("0"&REPT("1",5)&"0",CONCAT(0+(ISNUMBER(-MID(" "&A1&" ",ROW(INDIRECT("1:"&LEN(A1)+2)),1))+0))),5))

要搜索其他数字,请将出现的三个5更改为公式中所需的数字。