VBA Tipp: Zeichenkette durchlaufen bis nicht mehr nummerisch

Aus DBWiki
Wechseln zu: Navigation, Suche

Anforderung

Ich möchte die erste gefundene Zahl aus einer Zeichenfolge (String) extrahieren.

  • Die gefundene Zahl kann eine Ganzzahl oder Kommazahl sein.
  • Die gefundene Zahl kann wahlweise als Datentyp Double (Standardwert) oder als Datentyp String zurückgegeben werden.
  • Wenn die Zeichenfolge den Wert Null enthält, wird beim Datentyp Double 0, und beim Datentyp String Null zurückgegeben.
  • Wenn die Zeichenfolge keine Zahl enthält, wird beim Datentyp Double 0, und beim Datentyp String ein Leerstring zurückgegeben.

Lösung

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

Public Function ErsteZahlAusString(ByVal Text As Variant, _
                                   Optional Start As Long = 1, _
                                   Optional AlsString As Boolean = False _
                                   ) As Variant
 
   'Quelle: www.dbwiki.net oder www.dbwiki.de
 
   Dim i            As Long
   Dim strText      As String
   Dim Zeichen      As String
   Dim aktiviert    As Boolean
   Dim deaktiviert  As Boolean
 
   If AlsString = True Then
      ErsteZahlAusString = Text
   Else
      ErsteZahlAusString = 0
   End If
 
   If Len(Text) Then
 
      If Start > 1 Then
         Text = Mid(Text, Start)
      End If
 
      For i = 1 To Len(Text)
 
         Zeichen = Mid(Text, i, 1)
 
         If IsNumeric(Zeichen) Then
            strText = strText & Zeichen
            aktiviert = True
            deaktiviert = False
         Else
 
            If deaktiviert = True Then
               Exit For
            ElseIf aktiviert = True Then
 
               If Zeichen = "," Or Zeichen = "." Then
                  strText = strText & Zeichen
                  aktiviert = False
                  deaktiviert = True
               Else
                  Exit For
               End If
 
            End If
 
         End If
 
      Next
 
      If AlsString = True Then
 
         If Len(strText) Then
            If Not IsNumeric(Right(strText, 1)) Then
               strText = Left(strText, Len(strText) - 1)
            End If
         End If
 
         ErsteZahlAusString = strText
 
      Else
 
         If Len(strText) Then
            ErsteZahlAusString = CDbl(strText)
         End If
 
      End If
 
   End If
 
End Function

Aufruf

   'Der Rückgabewert ist eine Zahl (Standardeinstellung)
   Debug.Print ErsteZahlAusString("<span>1.400,13 Stk.") 'ergibt 1400,13 (Datentyp Double)
   Debug.Print ErsteZahlAusString("MeinTextOhneZahl") 'ergibt 0 (Datentyp Integer)
 
   Debug.Print ErsteZahlAusString("<span>1.345,15 Stk.</span><span>1.400,13 Stk.", 15) 
   'ergibt 1400,13 (Datentyp Double)
 
   'Der Rückgabewert ist ein String
   Debug.Print ErsteZahlAusString("<span>1.400,13 Stk.", , True) 'ergibt 1.400,13 (Datentyp String)
   Debug.Print ErsteZahlAusString("TextOhneZahl", , True) 'ergibt Leerstring (Datentyp String)


  • in einer Abfrage
Ausdr1: ErsteZahlAusString([EinTextfeld])


  • in einer Aktualisierungsabfrage:
UPDATE EineTabelle
SET    EinZahlenfeld = ErsteZahlAusString(EinTextfeld)