Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1564to1568
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

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

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
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
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

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige
Archiv - Verwandte Themen