In der Welt der Datenverarbeitung mit Excel begegnen uns häufig Herausforderungen, bei denen Textdaten Zahlen enthalten, die wir extrahieren möchten. Kürzlich stieß ich in einem Office-Forum auf die Frage, wie man Zahlen aus einem Text herausfiltert. Die dort diskutierten Lösungen mit komplexen Matrix-Funktionen waren oft unzureichend. Um dieses Problem zu lösen, wandte ich mich den regulären Ausdrücken (Regex) zu, die eine mächtige und flexible Lösung bieten.

Kurzbeschreibung des Codes:

  • Die Funktion FindeZahl nimmt eine Excel-Zelle (Range), eine minimale und maximale Länge der zu suchenden Zahl sowie eine optionale Gruppe (iGroup) für die Regex-Übereinstimmung als Parameter.
  • Sie verwendet VBScript-Reguläre Ausdrücke, um eine Zahl mit der spezifizierten Länge im Text der Zelle zu suchen.
  • Das Regex-Muster "\d{" & minLaenge & "," & maxLaenge & "}" sucht nach einer Zahl mit einer Länge zwischen minLaenge und maxLaenge.
  • Bei einem Fund wird die gefundene Zahl zurückgegeben, ansonsten ein Fehler (CVErr(xlErrNA)).

Angenommen man möchte nun jede 9 stellige Zahl aus dem Text extrahieren, verwendet man die Formel folgendermaßen: =FindeZahl(Zellbezug; 9;9)

Wie man aber an nachfolgendem Beispiel sieht, stößt das ganze an Grenzen, wenn die Zahl im Text länger ist als die gesuchte Zahl.

Dafür kann man auch eine Lösung basteln und die oben genannte Funktion erweitern. Der folgende Screenshot aus dem RegexBuddy zeigt, wo das Problem liegt:

Erweitert man den regulären Ausdruck marginal auf „\D(\d{minZeichen;maxZeichen})\D“ – also umschossen von NON DIGIT (keine Zahlen), bekommen wir das Ergebnis, das wir wollen. 

Eine entsprechend angepasste Funktion, die zwischen den beiden Methoden umschaltet, würde dann beispielsweise so aussehen: (die ist schon um einiges Länger)

Kurzbeschreibung des Codes:

  • Die Funktion FindeZahl überprüft zunächst, ob der Wert in myRange eine reine Zahl ist. Wenn ja, wird diese Zahl basierend auf den Parametern minLaenge, maxLaenge und nichtLaenger extrahiert.
  • Wenn der Wert in myRange nicht nur eine Zahl ist, verwendet die Funktion reguläre Ausdrücke, um die entsprechende Zahl zu extrahieren. Die Regex-Muster unterscheiden sich je nachdem, ob Zahlen, die länger als maxLaenge sein dürfen, akzeptiert werden oder nicht.
  • Die Funktion gibt entweder die extrahierte Zahl oder einen leeren String zurück, falls keine Übereinstimmung gefunden wird oder die Längenbedingungen nicht erfüllt sind.

Das liefert genau das Ergebnis, das man haben will

Und zum Abschluss noch die Gegenüberstellung der beidem Methoden