VBA Tipp: Ziffern aus Zeichenfolge extrahieren

Aus DBWiki
Wechseln zu: Navigation, Suche

Anforderung

Ich möchte alle Ziffern aus einer Zeichenfolge extrahieren oder entfernen.

Lösung 1

Das geht mit folgender Funktion, die in einem allgemeinen (globalen) Modul gespeichert wird.

Argumente der Funktion:

  • Text: zu verabeitender Text
  • DelNum (Optional): Wird für dieses Argument kein Wert angegeben, wird der Standardwert (False) verwendet, und alle Ziffern werden extrahiert. Wird dieses Argument auf True gesetzt, werden alle Ziffern entfernt.
Public Function ExtractOrDeleteNumerals(Text As Variant, _
                                        Optional DelNum As Boolean) As Variant
   ' Eingabe:
   ' Text     Variant  zu verabeitender Text
   ' DelNum   Boolean  (optional) legt fest, ob Ziffern extrahiert oder entfernt werden.
   '                   False: extrahiert (Standard)
   '                   True:  entfernt
 
   ' Quelle: www.dbwiki.net oder www.dbwiki.de
 
   Dim Chars As String
   Dim Char  As String
   Dim i     As Long
 
   If IsNull(Text) Then
      ExtractOrDeleteNumerals = Null
   Else
      For i = 1 To Len(Text)
         Char = Mid$(Text, i, 1)
         If IsNumeric(Char) = Not DelNum Then
            Chars = Chars & Char
         End If
      Next
      ExtractOrDeleteNumerals = Chars
   End If
 
End Function

Aufruf

Beispielaufruf im VBA Direktfenster:

?ExtractOrDeleteNumerals("abc123def")
123

?ExtractOrDeleteNumerals("abc123def", True)
abcdef

Lösung 2

Mit fogender Funktion können alle Ziffern aus einer Zeichenfolge extrahiert werden. Sie wird in einem allgemeinen (globalen) Modul gespeichert.

Anmerkung: Lösung 2 ist ca. 40% schneller als Lösung 1.

Public Function ZiffernAusString(Text As Variant) As Variant
 
   ' Quelle: www.dbwiki.net oder www.dbwiki.de
 
   Dim Puffer  As String
   Dim Zeichen As String
   Dim i       As Long
   Dim j       As Long
 
   If IsNull(Text) Then
      ZiffernAusString = Null
   Else
      Puffer = Space$(Len(Text))
      For i = 1 To Len(Text)
         Zeichen = Mid$(Text, i, 1)
         If InStr(1, "1234567890", Zeichen) > 0 Then
            j = j + 1
            Mid$(Puffer, j, 1) = Zeichen
         End If
      Next
      ZiffernAusString = Left$(Puffer, j)
   End If
 
End Function

Aufruf

   Debug.Print ZiffernAusString("a20bc 20am16 aaa25rt") 'ergibt 20201625


  • in einer Abfrage
Ausdr1: ZiffernAusString([MeinTextfeld])


  • in einer Aktualisierungsabfrage:
UPDATE MeineTabelle SET MeinZahlenfeld = ZiffernAusString(MeinTextfeld)


Wiki hinweis.png

Anmerkung: Man kann Ziffern auch mit der eingebauten Funktion Val() extrahieren.

  • Allerdings werden dann nur die ersten Ziffern vor den Nicht-Ziffern berücksichtigt,
  • und vor den ersten Ziffern dürfen keine anderen Zeichen (außer Leerzeichen) stehen.