【问题标题】:Extract 5 Digit Number From a String with Excel-VBA使用 Excel-VBA 从字符串中提取 5 位数字
【发布时间】:2020-07-23 19:55:29
【问题描述】:

作为非开发人员,我面临一个问题。我在 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

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

【问题讨论】:

    标签: string vba excel numbers


    【解决方案1】:

    使用正则表达式

    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
    

    数据:


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

    【讨论】:

    • 抱歉耽搁了,我试过了,效果很好,如果我看不到 5 位数,我什至可以玩它。救命,非常感谢!
    【解决方案2】:
    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

    【讨论】:

    • 感谢您的回答。如果我想在一整列上使用宏并在下一列上打印,我应该怎么做?我发现它应该通过 ValIn = Range(C2:C2000).Select 工作,但在打印结果时遇到了困难
    • @Nad - 欢迎您。关于列的使用,for-each 循环,遍历列的每个单元格将是一个解决方案。那么valIn 将是cellcell.Offset(0,1) 您可以参考下一列。
    • 我担心你在Cell.Offset(0.1) 失去了我,你能不能说得更具体一点:)
    • @Nad - 看看这里的答案 - stackoverflow.com/questions/47515141/cell-address-in-a-loop 但是,您的偏移量是 .Offset(0,1) 而不是那里提到的那个。
    • 我可以通过某种方式得到它,但仍然不容易同化,感谢您的帮助。
    【解决方案3】:

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

    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
    

    【讨论】:

      【解决方案4】:

      根据您尝试应用的解决方案(在 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 更改为公式中所需的位数。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-05-07
        • 1970-01-01
        • 2016-03-14
        • 2017-03-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多