Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
976to980
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
976to980
976to980
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

Text (Textmuster) Suche

Text (Textmuster) Suche
20.05.2008 17:32:00
Christoph
Hallo ihr hellen Köpfe,
folgende Problemstellung, die ich leider nur mit einer unbefriedigenden Laufzeit lösen konnte.
Ich versuche mal das Problem so minimalistisch wie möglich zu beschreiben. Ich habe einen großen Datensatz, in dem es eine Spalte gibt, die mit Freitext von Hand ausgefüllt wurde. Diese Texte enthalten zumeist mehrere 'Fehlercodes' nach einem der folgenden Muster (# steht für eine Ziffer; X für einen Buchstaben; _ für ein Leerzeichen)
P_###X
P###X
P_####
P####
Ich wollte nun eine Abfrage schreiben, die mir aus diesen Texten alle Codes die diesem Muster entsprechen herauszieht und auflistet. (Folgendes Muster: Spalte mit Text, dahinter 10 Spalten mit den gefundenen Treffern, mehr als zehn sind es nie)
Ich habe eine Version geschrieben, in der er die Datenbank mit allen Codes (etwa 1000) durchläuft und das für jedes der Textfelder. Diese Abfrage dauert aber leider eine gute halbe Stunde aufgrund der Datenmengen, daher wäre eine Abfrage nach dem Muster und ein späterer Check wesentlich effizienter.
Gibt es eine Möglichkeit so etwas in VBA zu schreiben, oder besser gesagt, kennt jmd eine, die Existenz steht vermutlich nicht zur Debatte. Jedenfalls bin ich an die Grenzen meines Wissens und meiner Literatur gestoßen und würde daher gerne auf das gesammelte Wissen der Forumsteilnehmer zurück greifen.
Vielen Dank schonmal für Eure Mühen.
Mit den besten Grüßen
Christoph

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

Betreff
Datum
Anwender
Anzeige
AW: Text (Textmuster) Suche
20.05.2008 17:45:00
bst
Hi Christoph,
schau Dir mal den LIKE Operator an. Falls Dir das nicht genügen sollte kannst Du noch via vbscript.regexp Reguläre Ausdrücke benutzen, das ist aber etwas komplexer.
Sowas sollte damit eigentlich reichen, liest die Teile aus Spalte A und schreibt das Ergebnis in Spalte B.
cu, Bernd
--
Option Explicit

Sub x()
    Dim i As Long
    Dim objRe As Object
    
    Set objRe = CreateObject("vbscript.regexp")
    objRe.Pattern = "^P ?\d\d\d(?:\d|[A-Z])$"
    For i = 1 To ActiveSheet.UsedRange.Row + ActiveSheet.UsedRange.Rows.Count - 1
        Cells(i, 2).Value = objRe.Test(Cells(i, 1).Value)
    Next
    Set objRe = Nothing
End Sub


Anzeige
AW: Text (Textmuster) Suche
20.05.2008 17:51:00
bst
Nachtrag,
Oje, das oder (|) wird hier nun nicht wirklich benötigt :-(
Nimm mal besser so ein Muster:
objRe.Pattern = "^P ?\d\d\d[A-Z0-9]$"
cu, Bernd

AW: Text (Textmuster) Suche
21.05.2008 10:54:08
Christoph
Hallo Bernd,
ich danke Dir recht herzlich für Deine perfekte Antwort, das war was ich suchte.
Eine Frage hätte ich jedoch noch, ohne Deine Geduld unnötig strapazieren zu wollen.
Habe den Code wie unten stehend modifiziert. Jetzt würde ich jedoch gerne noch statt dem Bool'schen Wert, den gefundenen Wert in die Ziel-Zelle einsetzen. Könntest Du mir da noch kurz weiter helfen, das wäre super.
Den allerbesten Dank schonmal für Deine Mühen
Beste Grüße
christoph
Option Explicit

Sub x()
Dim i As Long
Dim objRe As Object
Set objRe = CreateObject("vbscript.regexp")
objRe.Pattern = ".*?P\d\d\d[A-Z0-9]"
For i = 1 To ActiveSheet.UsedRange.Row + ActiveSheet.UsedRange.Rows.Count - 1
Cells(i, 2).Value = objRe.Test(Cells(i, 1).Value)
Next
Set objRe = Nothing
End Sub


Anzeige
AW: Text (Textmuster) Suche
21.05.2008 11:59:00
bst
Hi Christoph,
Du hast das optionale Leerzeichen nach dem P gelöscht, ja?
Mit .Test kann Du nur Testen ob ein Ausdruck passt, mehr nicht.
Mit .Replace kannst Du ersetzen (das ginge hier auch)
Am flexibelsten ist .Execute, das liefert eine sogenannte MatchCollection zurück. Solange objRe.Global nicht gesetzt ist liefert objMc.Count immer 0 oder 1, die im Muster geklammerten Ausdrücke findest Du dann ggf. in den SubMatches.
HTH, Bernd
--
Option Explicit

Sub x()
    Dim i As Long
    Dim objRe As Object
    Dim objMc As Object
    
    Set objRe = CreateObject("vbscript.regexp")
    objRe.Pattern = ".*?(P\d\d\d[A-Z0-9])"
    For i = 1 To ActiveSheet.UsedRange.Row + ActiveSheet.UsedRange.Rows.Count - 1
        Set objMc = objRe.Execute(Cells(i, 1).Value)
        If objMc.Count Then
            Cells(i, 2).Value = objMc(0).SubMatches(0)
        Else
            Cells(i, 2).Value = "no match"
        End If
    Next
    Set objMc = Nothing
    Set objRe = Nothing
End Sub


Anzeige
AW: Text (Textmuster) Suche
21.05.2008 12:09:00
bst
Nachtrag,
das ist wohl nicht so meine Woche ;-)
Ein regulärer Ausdruck durchsucht immer den gesamten String von links nach rechts auf einen möglichen Treffer. D.h. solange Du keinen Anker auf den 'Zeilenanfang' setzt (via ^) kannst Du Dir das ".*?" am Anfang sparen. Dann bleibt hier aber nur noch der gesuchte Ausdruck selber übrig...
D.h. Du brauchst hier keine SubMatches, objMc(0) liefert den 'gesamten passenden Treffer' sowieso schon zurück...
HTH, Bernd
--
Option Explicit

Sub x2()
    Dim i As Long
    Dim objRe As Object
    Dim objMc As Object
    
    Set objRe = CreateObject("vbscript.regexp")
    objRe.Pattern = "P\d\d\d[A-Z0-9]"
    For i = 1 To ActiveSheet.UsedRange.Row + ActiveSheet.UsedRange.Rows.Count - 1
        Set objMc = objRe.Execute(Cells(i, 1).Value)
        If objMc.Count Then
            Cells(i, 2).Value = objMc(0)
        Else
            Cells(i, 2).Value = "no match"
        End If
    Next
    Set objMc = Nothing
    Set objRe = Nothing
End Sub


Anzeige
AW: Text (Textmuster) Suche
21.05.2008 13:39:00
Christoph
Hallo Bernd,
besten Dank für Deine Mühen. Es funktioniert schon nahezu perfekt. Einen letzten Wunsch würde ich noch gerne äussern.
Und zwar gibt es auch Datensätze in denen es mehrere Treffer in einer Zelle gibt. Ich vermute dass ich über die von Dir erwähnten 'SubMatches' drauf zugreifen kann, hab auch ein bisschen was drüber gelesen (u.a. andere Beiträge von Dir in diversen Foren), bekomme es aber leider nicht zum Laufen.
Mein Code schaut im Moment so aus:

Sub Schaltfläche3_BeiKlick()
Dim i As Long
Dim objRe As Object
Dim objMc As Object
Set objRe = CreateObject("vbscript.regexp")
objRe.Pattern = "P *\w*\w*\w*\w*"
For i = 1 To ActiveSheet.UsedRange.Row + ActiveSheet.UsedRange.Rows.Count - 1
Set objMc = objRe.Execute(Cells(i, 1).Value)
If objMc.Count Then
Cells(i, 2).Value = objMc(0)
Else
Cells(i, 2).Value = "no match"
End If
Next
Set objMc = Nothing
Set objRe = Nothing
End Sub


Es wäre grandios wenn Du mir nochmal unter die Arme greifen könntest.
Vielen Dank für Deinen unerbittlichen Einsatz.
Beste Grüße
Christoph

Anzeige
AW: Text (Textmuster) Suche
21.05.2008 13:53:00
bst
Hi Christoph,
Bitteschön.
Du musst hier .Global auf True setzen damit nach dem 1. Treffer weitergesucht wird und dann über alle gefundenen Treffer laufen. Ein SubMatch ist immer nur ein Teil eines einzigen Treffers.
cu, Bernd
--
Option Explicit

Sub Schaltfläche3_BeiKlick()
    Dim i As Long, j As Integer
    Dim objRe As Object
    Dim objMc As Object
    
    Set objRe = CreateObject("vbscript.regexp")
    objRe.Pattern = "P *\w*\w*\w*\w*"
    objRe.Global = True
    For i = 1 To ActiveSheet.UsedRange.Row + ActiveSheet.UsedRange.Rows.Count - 1
        Set objMc = objRe.Execute(Cells(i, 1).Value)
        If objMc.Count Then
            For j = 0 To objMc.Count - 1
                Cells(i, 2 + j).Value = objMc(j)
            Next
        Else
            Cells(i, 2).Value = "no match"
        End If
    Next
    Set objMc = Nothing
    Set objRe = Nothing
End Sub


Anzeige
AW: Text (Textmuster) Suche
21.05.2008 14:00:56
Christoph
Hallo Bernd,
ich danke Dir recht herzlich für Deine Support. Ohne Dich hätte das vermutlich Tage gedauert wenn es überhaoupt geklappt hätte.
Vielen Herzlichen Dank
Beste Grüße
PS: Vielen Dank auch für die Erklärungen Deiner Änderungen, da versteht man auch gleich was Sache ist. Wirklich ein grandioser Support.

OwT: Bitteschön und ein schönes Wochenende
21.05.2008 14:04:00
bst
.

Ebenso, Danke
21.05.2008 14:11:29
Christoph
.

AW: Text (Textmuster) Suche
20.05.2008 17:50:00
Daniel
Hi
es wäre hilfreich, wenn du mal ne abgespeckte Version deiner Datei hochladen könntest, daß würde die Erstellung eines Makros vereinfachen und nachfolgende Anpassungsarbeiten an deine Datei vermeiden.
so 20 Zeilen würden reichen wichtig ist,daß die Spalten passen, dazu ne kurze Darstellung, wie das Ergebnis aussehen soll.
vielleicht auch deinen Code dazu, schließlich funktioniert der ja (wenn auch etwas langsam).
vielleicht finden sich auch da ein paar Ansätze zur Beschleunigung.
Gruß, Daniel
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige