Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: Regex VBA

Regex VBA
15.06.2017 10:18:02
Niko
Guten morgen,
ich bin auf der Suche nach einem Regex, welcher mir ermöglicht zwischen folgenden Möglichkeiten zu unterscheiden.
Ich habe Phasen welche ABC-10 heißen, es könnte jedoch auch mal ABCD heißen aber länger sind die in der Regel nicht. (3-4 stellige Buchstabenfolge | - (Bindestrich) | 2 stellige Zahlenfolge)
Dann habe ich Pakete welche ABC-10-010 heißen (3-4 stellige Buchstabenfolge | - | 2 stellige Zahlenfolge | - | 3 stellige Zahlenfolge).
Und zuletzt gibt es noch Meilensteine, welche ABC-10-MS01 heißen (3-4 stellige Buchstabenfolge | - | 2 stellige Zahlenfolge | - | 2 Buchstaben (die IMMER MS sind) gefolgt von einer 2 stelligen Zahl).
Ich hoffe es ist einigermaßen verständlich.
Desweiteren würde ich gern wissen wie ich diesen Vergleich anstelle gibt es sowas wie matchesPattern wie in Java?
Würde mir das so vorstellen als Pseudocode:

If .Cells(i,1).Value matches stringPattern

Und das durch eine For Schleife durchlaufen lassen.
Gruß Niko
Anzeige

11
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Regex VBA
15.06.2017 10:27:37
Niko
Habe dort noch was zu ergänzen:
Habe mir über den Regex schon Gedanken gemacht:
1. [a-zA-Z]{3,4}-\d{2}
2. [a-zA-Z]{3,4}-\d{2}-\d{3}
3. [a-zA-Z]{3,4}-\d{2}-[M][S]\d{2}
Wie kann ich diese nun zum Vergleich nutzen?
Gruß Niko
AW: Bsp-Datei
15.06.2017 10:55:01
Fennek
Hallo Niko,
die Pattern sehen schon gut aus (aber anstelle [M][S] einfache MS)
Aber es wäre viel leichter einen Vorschlag zu machen, wenn due eine kleine Datei (mindestens eine Variante pro Fall) mit der Wunschlösung von Hand eingetragen, hochladen würdest.
mfg
Anzeige
AW: Bsp-Datei
15.06.2017 11:09:17
Niko
Hallo Fennek,
hier einmal die Datei:
https://www.herber.de/bbs/user/114288.xlsm
Es handelt sich hierbei um Spalte A ab der Reihe 7.
Dort soll auf die Zellenobjekte ein Regex angewandt werden.
Wenn es einen Fullmatch gibt, dann soll der Balken des Diagramms auf die gewünschte Farbe geändert werden (den Code hierfür habe ich). Es geht nur um diesen Vergleich CellValue mit Regex.
Anzeige
AW: Ziel
15.06.2017 11:17:34
Fennek
Hallo,
vor heute abend habe ich keine Zeit zu testen, ABER
wenn es nur um die Unterscheidung geht, warum nicht mit len(), oder Anzuahl der "-" oder like "pattern"?
mfg
AW: Ziel
15.06.2017 11:22:42
Niko
Hallo Fennek,
ich finde len() zu ungenau um ehrlich zu sein. Klar wäre es das einfachste, aber was ist, wenn sich dann doch mal was ändert oder jemand sich nicht daran hält.
Ich brauche definitiv diese Unterscheidung zwischen diesen 3 Kategorien, wenn du meinst das es mit len() ausreicht, dann mache ich es so.. da hat mir der User yummi schon geholfen. Wäre jedoch nur eine mittelmäßig befriedigende Lösung.
Gruß Niko
Anzeige
wieso ein 2. Beitrag zum selben Thema?
15.06.2017 11:39:26
yummi
AW: Regex VBA
15.06.2017 12:54:49
EtoPHG
Hallo Niko,
Such dir aus, was du brauchst:
Option Explicit
' Code in ein allgemeines Modul
' (unter Extras - Verweise : Microsoft VBScript Regular Expression V5.5 einbinden
' Funktion gibt TRUE zurück, wenn ein Test-Input einem Regex-Pattern entspricht
' andernfalls FALSE. Kann auch als Formel in Tabelle verwendet werden
Public Function myRegEx(TextInput As String, regexPattern As String) As Boolean
Dim regEx As New RegExp
Dim matches
With regEx
.Global = True
.MultiLine = True
.IgnoreCase = False
.Pattern = regexPattern
End With
If regEx.test(TextInput) Then
Set matches = regEx.Execute(TextInput)
myRegEx = (matches(0).Value = TextInput)
End If
End Function
' Test mit Zellinhalten mit Bestimmen des Typs
Sub testAufTyp()
Dim iRow As Long
With ActiveSheet
For iRow = 2 To .Cells(.Rows.Count, 1).End(xlUp).Row
If myRegEx(.Cells(iRow, 1).Text, "[a-zA-Z]{3,4}-\d{2}") Then
MsgBox Cells(iRow, 1).Address & " Typ 1"
End If
If myRegEx(.Cells(iRow, 1).Text, "[a-zA-Z]{3,4}-\d{2}-\d{3}") Then
MsgBox Cells(iRow, 1).Address & "Typ 2"
End If
If myRegEx(.Cells(iRow, 1).Text, "[a-zA-Z]{3,4}-\d{2}-[M][S]\d{2}") Then
MsgBox Cells(iRow, 1).Address & "Typ 3"
End If
Next iRow
End With
End Sub
' Test mit Zellinhalt nur ob gültig
Sub TestOK()
Dim iRow As Long
With ActiveSheet
For iRow = 2 To .Cells(.Rows.Count, 1).End(xlUp).Row
If myRegEx(.Cells(iRow, 1).Text, "[a-zA-Z]{3,4}-\d{2}") Or _
myRegEx(.Cells(iRow, 1).Text, "[a-zA-Z]{3,4}-\d{2}-\d{3}") Or _
myRegEx(.Cells(iRow, 1).Text, "[a-zA-Z]{3,4}-\d{2}-[M][S]\d{2}") Then
MsgBox Cells(iRow, 1).Address & " ist gültig"
Else
MsgBox Cells(iRow, 1).Address & " ist ungültig", vbExclamation
End If
Next iRow
End With
End Sub
Gruess Hansueli
Anzeige
AW: Regex VBA
15.06.2017 12:58:33
Niko
Hallo Hansueli,
kann ich mit der Function dann einfach diese in der if aufrufen?
If myRegEx(.Cells(i, 1).Value,"[a-zA-Z]{3,4}-\d{2}" Then
oder verstehe ich das falsch?
Gruß Niko
AW: Regex VBA
15.06.2017 13:38:51
EtoPHG
Hallo Niko,
ähhhm ja, wenn da nicht die Schlussklammer fehlen würde!
Was verstehst du an meinem Code nicht? Die Test-Prozeduren sind als Veranschaulichung des möglichen Gebrauchs der Funktion. U.a. lautet eine meiner Codezeile genau wie deine in der Frage, mit der Ausnahme, dass bei meiner die Schlussklammer vorhanden ist.
Wenn du solche Fragen stellst, frage ich mich, warum du dann überhaupt VBA anwendest. Wirst du den Code und das Warum er so geschrieben wurde, sagen wir in einem Jahr, noch verstehen?
Gruess Hansueli
Anzeige
AW: Regex VBA
15.06.2017 13:53:12
Niko
Hallo Hansueli,
ich verstehe alles an dem Code und es funktioniert. Die Klammer habe ich vergessen, da ich es nur hier geschrieben habe nicht aus dem Editor kopiert habe.
Natürlich habe ich den Code verstanden.
Ich programmiere seit Jahren in diversen Sprachen. War mir nur nicht sicher, wie "mächtig" VBA ist und ich muss sagen, dass ich den Umfang doch unterschätzt habe.
Gruß Niko
Anzeige
AW: Regex VBA
15.06.2017 14:29:37
EtoPHG
Hallo Niko,
Wenn du seit Jahren in diversen Sprachen programmierst, hast du dann auch in diesen ab und an Libraries oder externe Komponenten referenziert? Regex hat nichts mit VBA zu tun!
Für meinen Codevorschlag muss die vbscript-Library, wie in der Beschreibung des Codes, 'angeschnallt' werden. Aus dieser wird dann ein RegExp-Objekt instanziert, mit de, die Prüfung auf den regulären Ausdruck erfolgt.
Gruess Hansueli
Anzeige
;
Anzeige

Infobox / Tutorial

Regex in VBA: Praktische Anwendungen und Lösungen


Schritt-für-Schritt-Anleitung

  1. Verweise aktivieren: Stelle sicher, dass die Microsoft VBScript Regular Expression-Bibliothek aktiviert ist. Gehe dazu in den VBA-Editor unter Extras > Verweise und aktiviere Microsoft VBScript Regular Expression 5.5.

  2. Regulären Ausdruck definieren: Erstelle einen regulären Ausdruck, um die gewünschten Muster zu erkennen. Ein Beispiel für die Definition eines Patterns könnte so aussehen:

    Dim regexPattern As String
    regexPattern = "[a-zA-Z]{3,4}-\d{2}"  ' Beispiel für Typ 1
  3. Funktion zur Prüfung erstellen: Erstelle eine Funktion, um den regulären Ausdruck auf einen Text anzuwenden:

    Public Function myRegEx(TextInput As String, regexPattern As String) As Boolean
       Dim regEx As New RegExp
       regEx.Pattern = regexPattern
       regEx.Global = True
       myRegEx = regEx.Test(TextInput)
    End Function
  4. Zellen durchlaufen: Implementiere eine Schleife, um die Zellen zu überprüfen:

    Sub TestRegexInCells()
       Dim iRow As Long
       With ActiveSheet
           For iRow = 2 To .Cells(.Rows.Count, 1).End(xlUp).Row
               If myRegEx(.Cells(iRow, 1).Text, "[a-zA-Z]{3,4}-\d{2}") Then
                   MsgBox .Cells(iRow, 1).Address & " Typ 1"
               End If
           Next iRow
       End With
    End Sub

Häufige Fehler und Lösungen

  • Fehlende Klammern: Stelle sicher, dass alle Klammern korrekt gesetzt sind, wenn Du die Funktion aufrufst. Ein häufiges Problem ist das Vergessen der schließenden Klammer.

  • Regulärer Ausdruck funktioniert nicht: Überprüfe, ob die Pattern korrekt definiert sind. Ein falsches Pattern kann dazu führen, dass die Funktion immer False zurückgibt.

  • Verweis nicht gesetzt: Falls die Funktion nicht funktioniert, überprüfe, ob der Verweis auf die VBScript Regular Expression-Bibliothek gesetzt ist.


Alternative Methoden

Wenn Du nicht mit VBA arbeiten möchtest, kannst Du auch Excel-Funktionen nutzen, um ähnliche Resultate zu erzielen. Eine Möglichkeit wäre die Verwendung von TEXT-Funktionen, um die Zeichenfolgen zu analysieren. Allerdings sind diese weniger flexibel und leistungsfähig als die Verwendung von regulären Ausdrücken.

Eine andere Option wäre, auf Power Query zurückzugreifen, um Daten zu transformieren und zu filtern.


Praktische Beispiele

Hier sind einige Beispiele, wie Du verschiedene Muster in Excel erkennen kannst:

  1. Typ 1: ABC-10

    If myRegEx(.Cells(iRow, 1).Text, "[a-zA-Z]{3,4}-\d{2}") Then
       ' Handle Typ 1
    End If
  2. Typ 2: ABC-10-010

    If myRegEx(.Cells(iRow, 1).Text, "[a-zA-Z]{3,4}-\d{2}-\d{3}") Then
       ' Handle Typ 2
    End If
  3. Typ 3: ABC-10-MS01

    If myRegEx(.Cells(iRow, 1).Text, "[a-zA-Z]{3,4}-\d{2}-MS\d{2}") Then
       ' Handle Typ 3
    End If

Tipps für Profis

  • Regex testen: Nutze Online-Tools, um Deine regulären Ausdrücke vorab zu testen. So kannst Du sicherstellen, dass sie die gewünschten Ergebnisse liefern.

  • Fehlerbehandlung: Implementiere eine Fehlerbehandlung in Deinen VBA-Skripten, um unerwartete Situationen zu handhaben.

  • Verwende Global und IgnoreCase: Setze die Eigenschaften .Global und .IgnoreCase in Deinem RegExp-Objekt, um eine umfassendere Suche zu ermöglichen.


FAQ: Häufige Fragen

1. Wie kann ich mehrere Regex-Pattern gleichzeitig prüfen?
Du kannst mehrere If-Bedingungen in Deiner Schleife verwenden, um verschiedene Regex-Pattern nacheinander zu prüfen.

2. Wie kann ich die Farbe einer Zelle basierend auf dem Regex-Match ändern?
Verwende Interior.Color in der entsprechenden If-Bedingung, um die Hintergrundfarbe der Zelle zu ändern:

If myRegEx(.Cells(iRow, 1).Text, "[a-zA-Z]{3,4}-\d{2}") Then
    .Cells(iRow, 1).Interior.Color = RGB(255, 0, 0)  ' Rot
End If

3. Gibt es eine Möglichkeit, Regex in einer Excel-Formel zu verwenden?
Direkt in einer Excel-Formel ist dies nicht möglich. Du kannst jedoch VBA-Funktionen erstellen, die dann in Deinen Excel-Formeln verwendet werden können.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige