web-dev-qa-db-de.com

Wie finde ich Zahlen aus einem String?

Ich muss Zahlen aus einer string finden. Wie findet man Zahlen aus einer string in VBA Excel?

16
user905527

Angenommen, Sie meinen, Sie möchten, dass die Nicht-Nummern entfernt werden, sollten Sie in der Lage sein, Folgendes zu verwenden:

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

Aufruf mit:

Dim myStr as String
myStr = onlyDigits ("3d1fgd4g1dg5d9gdg")
MsgBox (myStr)

erhalten Sie ein Dialogfeld mit:

314159

und diese ersten beiden Zeilen zeigen, wie Sie es in einer beliebigen Stringvariablen speichern können, um es nach Belieben zu verwenden.

38
paxdiablo

Reguläre Ausdrücke dienen zum Parsen. Während die Syntax eine gewisse Zeit in Anspruch nehmen kann, ist dieser Ansatz sehr effizient und sehr flexibel für die Handhabung komplexerer String-Extraktionen/-Auswechslungen

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
16
brettdj

Erweiterung der Antwort von brettdj, um disjunkte eingebettete Ziffern in separate Zahlen zu parsen:

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
5
pstraton

Alternativ über Byte Array

Wenn Sie einem Array Byte eine Zeichenfolge zuweisen, erhalten Sie in der Regel die Zahlenäquivalente jedes Zeichens in Paaren der Array-Elemente. Verwenden Sie eine Schleife zur numerischen Prüfung mit dem Operator Like und geben Sie das verbundene Array als Zeichenfolge zurück:

Function Nums(s$)
  Dim by() As Byte, i&, ii&
  by = s: ReDim tmp(UBound(by))                    ' assign string to byte array; prepare temp array
  For i = 0 To UBound(by) - 1 Step 2               ' check num value in byte array (0, 2, 4 ... n-1)
      If Chr(by(i)) Like "#" Then tmp(ii) = Chr(by(i)): ii = ii + 1
  Next i
  Nums = Trim(Join(tmp, vbNullString))             ' return string with numbers only
  End Function

Beispielaufruf

Sub testByteApproach()
  Dim s$: s = "a12bx99y /\:3,14159"                 ' [1] define original string
  Debug.Print s & " => " & Nums(s)                  ' [2] display original string and result
End Sub

würde die ursprüngliche Zeichenfolge und die Ergebniszeichenfolge im unmittelbaren Fenster anzeigen:

  a12bx99y /\:3,14159 => 1299314159
0
T.M.

Verwenden Sie die integrierte VBA-Funktion Val, wenn sich die Zahlen am vorderen Ende der Zeichenfolge befinden:

Dim str as String
Dim lng as Long

str = "1 149 xyz"
lng = Val(str)

lng = 1149

Val-Funktion auf MSDN

0
Rohan Moore

Dies ist eine Variante von brettdj & pstraton post.

Dies gibt einen wahren Wert zurück und gibt nicht den #NUM!-Fehler aus. Und \D ist eine Abkürzung für alles außer Ziffern. Der Rest gleicht den anderen nur mit diesem kleinen Fix.

Function StripChar(Txt As String) As Variant
With CreateObject("VBScript.RegExp")
    .Global = True
    .Pattern = "\D"
    StripChar = Val(.Replace(Txt, " "))
End With
End Function
0
Stephen Sherry

Ich suchte nach der Antwort auf die gleiche Frage, fand aber eine Weile lang meine eigene Lösung und wollte sie für andere Personen freigeben, die diese Codes in Zukunft benötigen werden. Hier ist eine andere Lösung ohne Funktion.

Dim control As Boolean
Dim controlval As String
Dim resultval As String
Dim i as Integer

controlval = "A1B2C3D4"

For i = 1 To Len(controlval)
control = IsNumeric(Mid(controlval, i, 1))
If control = True Then resultval = resultval & Mid(controlval, i, 1)
Next i

resultval = 1234

0
Ergin

Dies basiert auf eine andere Antwort , ist aber nur umformuliert:

Angenommen, Sie möchten, dass die Nicht-Nummern entfernt werden, sollten Sie in der Lage sein, Folgendes zu verwenden:

'
' Skips all characters in the input string except digits
'
Function GetDigits(ByVal s As String) As String
    Dim char As String
    Dim i As Integer
    GetDigits = ""
    For i = 1 To Len(s)
        char = Mid(s, i, 1)
        If char >= "0" And char <= "9" Then
            GetDigits = GetDigits + char
        End If
    Next i
End Function

Aufruf mit:

Dim myStr as String
myStr = GetDigits("3d1fgd4g1dg5d9gdg")
Call MsgBox(myStr)

sie erhalten ein Dialogfeld, das Folgendes enthält:

314159

und diese ersten beiden Zeilen zeigen, wie Sie es in einer beliebigen Zeichenfolgenvariablen speichern können, je nachdem, was Sie möchten.

0
Top-Master