Ich muss Zahlen aus einer string
finden. Wie findet man Zahlen aus einer string
in VBA Excel?
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.
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
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
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
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
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
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
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.