如何从字符串中查找数字?

use*_*527 17 string excel vba excel-vba

我需要从a中找到数字string.如何从stringVBA Excel中查找数字?

pax*_*blo 43

假设你的意思是你想要删除非数字,你应该可以使用类似的东西:

Function onlyDigits(s As String) As String
    ' Variables needed (remember to use "option explicit").   '
    Dim retval As String    ' This is the return string.      '
    Dim i As Integer        ' Counter for character position. '

    ' Initialise return string to empty                       '
    retval = ""

    ' For every character in input string, copy digits to     '
    '   return string.                                        '
    For i = 1 To Len(s)
        If Mid(s, i, 1) >= "0" And Mid(s, i, 1) <= "9" Then
            retval = retval + Mid(s, i, 1)
        End If
    Next

    ' Then return the return string.                          '
    onlyDigits = retval
End Function
Run Code Online (Sandbox Code Playgroud)

这称呼:

Dim myStr as String
myStr = onlyDigits ("3d1fgd4g1dg5d9gdg")
MsgBox (myStr)
Run Code Online (Sandbox Code Playgroud)

会给你一个对话框,其中包含:

314159
Run Code Online (Sandbox Code Playgroud)

前两行显示如何将其存储到任意字符串变量中,以便按照您的意愿进行操作.

  • 您可以减少与IsNumeric函数的比较次数.如果是IsNumeric(Mid(s,i,1))那么 (2认同)

bre*_*tdj 19

构造正则表达式来解析.虽然语法可能需要一段时间才能掌握这种方法非常有效,并且非常灵活,可以处理更复杂的字符串提取/替换

Sub Tester()
     MsgBox CleanString("3d1fgd4g1dg5d9gdg")
End Sub

Function CleanString(strIn As String) As String
    Dim objRegex
    Set objRegex = CreateObject("vbscript.regexp")
    With objRegex
     .Global = True
     .Pattern = "[^\d]+"
    CleanString = .Replace(strIn, vbNullString)
    End With
End Function
Run Code Online (Sandbox Code Playgroud)

  • `+ 1`用于使用`regex`,我很高兴我们可以在VBA中使用它,它为VBA的*`dim``dim`照明文化添加了一些***酷****) (6认同)
  • 虽然正则表达式是最优雅的,但正则表达式是否会导致大规模的性能下降? (2认同)
  • @DarylBennett很棒的问题.实例化对象可能导致命中等效或比循环更糟.但是如果对象被实例化一次(例如在数组循环中)并重复运行,那么它非常有效. (2认同)

pst*_*ton 6

扩展brettdj的答案,以便将不相交的嵌入数字解析为单独的数字:

Sub TestNumList()
    Dim NumList As Variant  'Array

    NumList = GetNums("34d1fgd43g1 dg5d999gdg2076")

    Dim i As Integer
    For i = LBound(NumList) To UBound(NumList)
        MsgBox i + 1 & ": " & NumList(i)
    Next i
End Sub

Function GetNums(ByVal strIn As String) As Variant  'Array of numeric strings
    Dim RegExpObj As Object
    Dim NumStr As String

    Set RegExpObj = CreateObject("vbscript.regexp")
    With RegExpObj
        .Global = True
        .Pattern = "[^\d]+"
        NumStr = .Replace(strIn, " ")
    End With

    GetNums = Split(Trim(NumStr), " ")
End Function
Run Code Online (Sandbox Code Playgroud)