Microsoft Excel

Herbers Excel/VBA-Archiv

Frage Pattern(RegEx)


Betrifft: Frage Pattern(RegEx) von: hary
Geschrieben am: 28.04.2017 16:10:56

Moin Allezusammen
Hab eine Frage zu Pattern.
Meine Tabelle sieht so aus, durch reinkopieren steht leider alles in den Zellen der SpalteA.
Die X'en stehen fuer Buchstaben. Wobei grosses X gleich Grrossbuchstabe und kleines x fuer Kleinbuchstaben.
Was ich brauche ist: Gib alles raus was nur Grossbuchstaben hat,die Uhrzeit,die einzelne Zahl hinter der Uhrzeit und den Teil mit der Wochentagbezeichnung.



Tabelle1

 ABCDEFG
1Vorgabedas soll rauskommen     
2xxx x-62911 Di-Sa(nS) XXXX 0:56 2 XXXX Xx-XxxxxxXxxx Xx-Xxxxxx Xxx XXX 100Di-Sa(nS)XXXX00:562XXXXXXX
3X x X 66445 Mo XXXX 9:13 4 XXXX Xxxxxx Xxxxxxxxxx XXXX 140      
4XX X-52010 Mo-Fr(S) XXXX 19:15 1 XXX Xxxxxxx Xxxxxx Xxx XXXX 100      
5XXX X-52464 Di(S) XXXX 11:12 2 XXXX Xxxxxxx Xxx Xxxxxxxx 100      
6XX-X X-2448 So XXXX 22:57 1 XXX Xxxxx Xxx Xxxxxxxx Xxx XXXX 160      

http://excel-inn.de/dateien/vba_beispiele/tabellenanzeige_in_html_addin.zip
http://hajo-excel.de/tools.htm
XHTML-Tabelle zur Darstellung in Foren, einschl. der neuen Funktionen ab Version 2007
Add-In-Version 14.02 einschl 64 Bit

Irgendwo hab ich einen Wurm drin. Er nimmt nicht bei allen die Zeit raus.
.Pattern = " \d |[A-Z]{2,} | \d+:\d+ "
    .Global = True
    Set objM = .Execute(Cells(b, 1).Text)
    If objM.Count > 0 Then
        ReDim out(1 To objM.Count)
        For i = 3 To objM.Count
            out(i) = objM(i - 1).Value
            Cells(b, i + 8) = out(i)
        Next

Hab es auch so probiert
.Pattern = "([A-Z]{2,})|( \d )|(\d+:\d+)"

Bei den Grossbuchstaben hab ich so vorgegeben [A-Z]{2,} also mindestens 2 Grossbuchstaben.
Bin nicht so Firm mit RegEx.
Mit Text in Spalten nuesste ich zuviel korregieren.
Schon mal Danke fuers gruebeln.
gruss hary

  

Betrifft: AW: Frage Pattern(RegEx) von: ransi
Geschrieben am: 28.04.2017 19:00:49

Hallo HAry

Was soll bei den anderen Zellen rauskommen?
ICh babs mal so gedeutet:
Tabelle1

 ABCDEFG
1Vorgabedas soll rauskommen     
2xxx x-62911 Di-Sa(nS) XXXX 0:56 2 XXXX Xx-XxxxxxXxxx Xx-Xxxxxx Xxx XXX 100Di-Sa(nS)XXXX0:562XXXXXXX
3X x X 66445 Mo XXXX 9:13 4 XXXX Xxxxxx Xxxxxxxxxx ABCD 140MoXXXX9:134XXXXABCD
4XX X-52010 Mo-Fr(S) XXXX 19:15 1 XXX Xxxxxxx Xxxxxx Xxx XXXX 100Mo-Fr(S)XXXX19:151XXXXXXX
5XXX X-52464 Di(S) XXXX 11:12 2 XXXX Xxxxxxx Xxx Xxxxxxxx 100      
6XX-X X-2448 So XXXX 22:57 1 XXX Xxxxx Xxx Xxxxxxxx Xxx ABCD 160SoXXXX22:571XXXABCD

Formeln der Tabelle
ZelleFormel
B2=machs($A2;SPALTE(A1))


Excel Tabellen im Web darstellen >> Excel Jeanie HTML 4


' **********************************************************************
' Modul: Modul1 Typ: Allgemeines Modul
' **********************************************************************

Option Explicit

Function machs(zelle As String, intIndex As Integer)
    Dim regex As Object
    Dim objMatch As Object
    Set regex = CreateObject("Vbscript.Regexp")
    With regex
        .Pattern = " (Mo|Di||Mi|Do|Fr|Sa|So) ([A-Z]{3,}) ([0-2]?[0-9]:[0-5][0-9]) ([0-9]+) ([A-Z]+).+ ([A-Z]+)( \d{3}$)"
        If .test(zelle) Then
            Set objMatch = .Execute(zelle)
            machs = objMatch(0).submatches(intIndex - 1)
            Exit Function
            Else:
            .Pattern = " (Mo.+?|Di.+?|Mi.+?|Do.+?|Fr.+?|Sa.+?|So.+?) ([A-Z]{2,}) ([0-2]?[0-9]:[0-5][0-9]) ([0-9]+) ([A-Z]+).+ ([A-Z]+)( \d{3}$)"
            If .test(zelle) Then
                Set objMatch = .Execute(zelle)
                machs = objMatch(0).submatches(intIndex - 1)
                Else:
                machs = ""
            End If
        End If
    End With
End Function



ransi


  

Betrifft: AW: Frage Pattern(RegEx) von: hary
Geschrieben am: 29.04.2017 07:25:31

Moin Ransi
Danke!! Hast du richtig gedeutet.
Das funzt super mit einem kleinem Haken(hab ich auch jetzt erst entdeckt),sry
Alles gut, nur wenn kein(e) Wochentag(e) gegeben sind wird nix angezeigt.



neu

 ABCD
308KT P-50398 HGGL 20:27 2 HLER Alte Süderelbe Dre-Friedrichst HBS 100   
309KT 50554 So HGGL 10:59 4 HHI Nür Rbf Ausfahrt Beddingen HBDD 120SoHGGL10:59
310KT 50558 Mo+Mi HGGL 10:30 4 HBDD Beddingen Alte Süderelbe HLER 100Mo+MiHGGL10:30

verwendete Formeln
Zelle Formel Bereich R1C1 für Add In
B308: D310=machs($A308;SPALTE(A308))  =machs(RC1,COLUMN(RC[-1]))

http://excel-inn.de/dateien/vba_beispiele/tabellenanzeige_in_html_addin.zip
http://hajo-excel.de/tools.htm
XHTML-Tabelle zur Darstellung in Foren, einschl. der neuen Funktionen ab Version 2007
Add-In-Version 14.02 einschl 64 Bit

Hab es gerade rumprobiert bekomme das aber nicht gebacken.
Kannst du mir nochmal unter die Arme greifen.


  

Betrifft: AW: sry, Frage noch offen owT von: hary
Geschrieben am: 29.04.2017 07:26:43

.


  

Betrifft: AW: sry, Frage noch offen owT von: ransi
Geschrieben am: 29.04.2017 09:58:18

HAllo,

Jetzt wirds kompliziert.
Teste mal:
Tabelle1

 ABCDEFGH
1KT P-50398 HGGL 20:27 2 HLER Alte Süderelbe Dre-Friedrichst HBS 100 HGGL20:272HLERHBS 
2KT 50554 So HGGL 10:59 4 HHI Nür Rbf Ausfahrt Beddingen HBDD 120SoHGGL10:594HHIHBDD 
3KT 50558 Mo+Mi HGGL 10:30 4 HBDD Beddingen Alte Süderelbe HLER 100Mo+MiHGGL10:304HBDDHLER 
4        

Formeln der Tabelle
ZelleFormel
B1=machs($A1;SPALTE(A1))


Excel Tabellen im Web darstellen >> Excel Jeanie HTML 4

' **********************************************************************
' Modul: Modul1 Typ: Allgemeines Modul
' **********************************************************************

Option Explicit

Function machs(zelle As String, intIndex As Integer)
    Dim regex As Object
    Dim objMatch As Object
    Set regex = CreateObject("Vbscript.Regexp")
    machs = ""
    With regex
        .Pattern = " (Mo|Di||Mi|Do|Fr|Sa|So) ([A-Z]{3,}) ([0-2]?[0-9]:[0-5][0-9]) ([0-9]+) ([A-Z]+).+ ([A-Z]+)(?= \d{3}$)"
        If .test(zelle) Then
            Set objMatch = .Execute(zelle)
            machs = objMatch(0).submatches(intIndex - 1)
            Exit Function
        End If
        
        .Pattern = " (Mo.+?|Di.+?|Mi.+?|Do.+?|Fr.+?|Sa.+?|So.+?) ([A-Z]{2,}) ([0-2]?[0-9]:[0-5][0-9]) ([0-9]+) ([A-Z]+).+ ([A-Z]+)(?= \d{3}$)"
        If .test(zelle) Then
            Set objMatch = .Execute(zelle)
            machs = objMatch(0).submatches(intIndex - 1)
            Exit Function
        End If
        
        .Pattern = "(\b)([A-Z]{3,}) ([0-2]?[0-9]:[0-5][0-9]) ([0-9]+) ([A-Z]+).+ ([A-Z]+)(?= \d{3}$)"
        If .test(zelle) Then
            Set objMatch = .Execute(zelle)
            machs = objMatch(0).submatches(intIndex - 1)
            Exit Function
        End If
        
    End With
End Function



ransi


  

Betrifft: 3 verschiedene Pattern von: ransi
Geschrieben am: 29.04.2017 10:12:02

Hallo,

Geht bestimmt auch eleganter in einem .Pattern
Das bekomm ich aber nicht hin.

Tabelle1

 ABCDEFG
1KT P-50398 HGGL 20:27 2 HLER Alte Süderelbe Dre-Friedrichst HBS 100 HGGL20:272HLERHBS
2KT 50554 So HGGL 10:59 4 HHI Nür Rbf Ausfahrt Beddingen HBDD 120SoHGGL10:594HHIHBDD
3KT 50558 Mo+Mi HGGL 10:30 4 HBDD Beddingen Alte Süderelbe HLER 100Mo+MiHGGL10:304HBDDHLER
4xxx x-62911 Di-Sa(nS) XXXX 0:56 2 XXXX Xx-XxxxxxXxxx Xx-Xxxxxx Xxx XXX 100Di-Sa(nS)XXXX0:562XXXXXXX
5X x X 66445 Mo XXXX 9:13 4 XXXX Xxxxxx Xxxxxxxxxx ABCD 140MoXXXX9:134XXXXABCD
6XX X-52010 Mo-Fr(S) XXXX 19:15 1 XXX Xxxxxxx Xxxxxx Xxx XXXX 100Mo-Fr(S)XXXX19:151XXXXXXX
7XXX X-52464 Di(S) XXXX 11:12 2 XXXX Xxxxxxx Xxx Xxxxxxxx 100      
8XX-X X-2448 So XXXX 22:57 1 XXX Xxxxx Xxx Xxxxxxxx Xxx ABCD 160SoXXXX22:571XXXABCD

Formeln der Tabelle
ZelleFormel
B1=machs($A1;SPALTE(A1))


Excel Tabellen im Web darstellen >> Excel Jeanie HTML 4

' **********************************************************************
' Modul: Modul1 Typ: Allgemeines Modul
' **********************************************************************

Option Explicit

Function machs(zelle As String, intIndex As Integer)
    Dim regex As Object
    Dim objMatch As Object
    Set regex = CreateObject("Vbscript.Regexp")
    machs = ""
    With regex
        .Pattern = " (Mo|Di||Mi|Do|Fr|Sa|So) ([A-Z]{3,}) ([0-2]?[0-9]:[0-5][0-9]) ([0-9]+) ([A-Z]+).+ ([A-Z]+)(?= \d{3}$)"
        If .test(zelle) Then
            Set objMatch = .Execute(zelle)
            machs = objMatch(0).submatches(intIndex - 1)
            Exit Function
        End If
        
        .Pattern = " (Mo.+?|Di.+?|Mi.+?|Do.+?|Fr.+?|Sa.+?|So.+?) ([A-Z]{2,}) ([0-2]?[0-9]:[0-5][0-9]) ([0-9]+) ([A-Z]+).+ ([A-Z]+)(?= \d{3}$)"
        If .test(zelle) Then
            Set objMatch = .Execute(zelle)
            machs = objMatch(0).submatches(intIndex - 1)
            Exit Function
        End If
        
        .Pattern = "(\b)([A-Z]{3,}) ([0-2]?[0-9]:[0-5][0-9]) ([0-9]+) ([A-Z]+).+ ([A-Z]+)(?= \d{3}$)"
        If .test(zelle) Then
            Set objMatch = .Execute(zelle)
            machs = objMatch(0).submatches(intIndex - 1)
            Exit Function
        End If
        
    End With
End Function




  

Betrifft: AW: 3 verschiedene Pattern von: hary
Geschrieben am: 29.04.2017 11:03:07

Moin Ransi
Nu passt es so weit ich es geprueft habe.

"Geht bestimmt auch eleganter in einem .Pattern
Das bekomm ich aber nicht hin."


Das Pattern kann ich aber nachvollziehen.
Bei Christians muss ich mich Stueck fuer Stueck einlesen. Aber ist ja langes WE.
Danke nochmal und schoe. Feiertag.
gruss hary


  

Betrifft: AW: nicht ganz aber... von: hary
Geschrieben am: 29.04.2017 10:31:45

Moin Ransi
Danke!!
... jetzt hab ich es verstanden. Den Rest bekomm ich hin.



neu

 AB
382EK 54178 Di-Sa(nS) HGGL 4:06 4 HBDD Beddingen Seelze Ost HLER 90 
383EK 54179 Di-Sa(nS) HGGL 2:26 4 HLER Seelze Ost Beddingen VPS HBDD 100Di-Sa(nS)

verwendete Formeln
Zelle Formel Bereich R1C1 für Add In
B382:B383=machs($A382;SPALTE(A382))  =machs(RC1,COLUMN(RC[-1]))

http://excel-inn.de/dateien/vba_beispiele/tabellenanzeige_in_html_addin.zip
http://hajo-excel.de/tools.htm
XHTML-Tabelle zur Darstellung in Foren, einschl. der neuen Funktionen ab Version 2007
Add-In-Version 14.02 einschl 64 Bit

Also muss ich fuer jede Moeglichkeit ein Pattern setzen.
Daher hatte ich es so probiert:
Dim regex As Object
Dim objM As Object
Dim out As Variant, a
Dim i As Long, b As Long
Set regex = CreateObject("VbScript.RegExp")
With regex
For b = 2 To Cells(Rows.Count, 1).End(xlUp).Row
   .Pattern = " \d |[A-Z]{2,} | \d+:\d+ "  '--Uhrzeit und HGGL
    .Global = True
    Set objM = .Execute(Cells(b, 1).Text)
    If objM.Count > 0 Then
        ReDim out(1 To objM.Count)
        For i = 1 To objM.Count
            out(i) = objM(i - 1).Value
            Cells(b, i + 8) = out(i)
        Next
     End If
Next
End With

Das er mir mit out(i) nur die Treffer rausgibt.
nochmals Danke
gruss hary


  

Betrifft: AW: Frage Pattern(RegEx) von: Christian
Geschrieben am: 29.04.2017 10:23:01

Hallo Hary,

In Anlehnung an Ransi's Pattern hier mein Beispiel:

Sub TestRegex()
    Dim objRgx As Object
    Dim objMtch As Object
    Dim i As Long, j As Long
    Dim strIn As String
    
    Set objRgx = CreateObject("Vbscript.Regexp")
    
    With objRgx
        .Global = False
        .MultiLine = False
        .Pattern = "([Mo|Di|Mi|Do|Fr|Sa|So][^\s]+?)?\s([A-Z]{2,})\s(\d{1,2}:\d{2})\s(\d)\s([A-Z] _
+).+?([A-Z]+)?\s(\d{3})$"
    End With
    
    With ThisWorkbook.Sheets("Tabelle2")
        For i = 2 To .Cells(.Rows.Count, 1).End(xlUp).Row
            strIn = Trim(.Cells(i, 1))
            If objRgx.Test(strIn) Then
                Set objMtch = objRgx.Execute(strIn)
                For j = 0 To objMtch(0).SubMatches.Count - 1
                    .Cells(i, j + 2) = objMtch(0).SubMatches(j)
                Next
            End If
        Next
    End With
    
    Set objRgx = Nothing
End Sub
Gruß
Christian


  

Betrifft: AW: Frage Pattern(RegEx) von: hary
Geschrieben am: 29.04.2017 10:47:58

Moin Christian
Auch dir Danke!
So meinte ich es. Trau mich fast nicht, es zu zeigen. Bsp.: Zeile 149
Das die Vorgabe wirklich Sch..... ist, war mir schon klar.



neu

 ABC
147KT P-41520 Mi HGGL 23:47 1 HBS Ruhland Antwerpen-Noord HLER 100MiHGGL
148DGS P-41524 Di+Do HGGL 16:08 1 HBS Wustermark Einfg Antw-Waaslhvn Zu HLER 100Di+DoHGGL
149DGS P-41711 Di-Sa HGGL 7:48 2 HLER Rotterdam-Pernis Frankfurt (O) HBS 90  
150DGS P-41712 So-Fr HGGL 22:21 1 HBS Frankfurt (O) Rotterdam-Pernis HLER 100So-FrHGGL

http://excel-inn.de/dateien/vba_beispiele/tabellenanzeige_in_html_addin.zip
http://hajo-excel.de/tools.htm
XHTML-Tabelle zur Darstellung in Foren, einschl. der neuen Funktionen ab Version 2007
Add-In-Version 14.02 einschl 64 Bit

Passt aber so schon super. Ein wenig Handarbeit macht nichts.
Nu muss ich nur das Pattern verstehen.
gruss hary


  

Betrifft: AW: Frage Pattern(RegEx) von: Christian
Geschrieben am: 29.04.2017 10:59:40

Hallo Hary,
das Pattern sucht eine 3-Stellige Zahl am Ende. Da in deinem Bsp Zeile 149 eine 2-stellige Zahl am Ende steht, ergibt das keine Treffer.

Also zB. so:
.Pattern = "([Mo|Di|Mi|Do|Fr|Sa|So][^\s]+?)?\s([A-Z]{2,})\s(\d{1,2}:\d{2})\s(\d)\s([A-Z]+).+?([A-Z]+)?\s(\d+)$"

Zur Erklärung:
([Mo|Di|Mi|Do|Fr|Sa|So][^\s]+?): Wochentage und anschließend können noch weitere Zeichen, aber kein Whitespace (hier Blank) folgen.
([Mo|Di|Mi|Do|Fr|Sa|So][^\s]+?)?: das Fragezeichen heißt: der ganze Block kann, muss aber nicht vorkommen.
([Mo|Di|Mi|Do|Fr|Sa|So][^\s]+?)?\s: anschließend folgt ein Whitespace (hier Blank).

usw.

Gruß
Christian


  

Betrifft: AW: Danke... von: hary
Geschrieben am: 29.04.2017 11:13:18

Moin Christian
...fuer's Erklaeren. Hab jetzt erstmal eine Formel von der Obrigkeit bekommen:
=Wenn(Rasen hoch;maehen;Schlaege ins Genick)
gruss hary