Microsoft Excel

Herbers Excel/VBA-Archiv

Mit RegEx letzte Ziffer entfernen

Betrifft: Mit RegEx letzte Ziffer entfernen von: Golem
Geschrieben am: 15.10.2014 18:27:53

Hallo Excel-Fachleute!

Ich habe drei Zeichenketten: "BEWKOSTEN050003390", "SVWZWOHNUNGNR.50007011" und
"WOHNUNGNR.40BAHNHOFSTR.13.
Mit dem Regex "(BEWKOSTEN|EREF|ZV|SVWZ|WOHNUNGNR.|BAHNHOFSTR.13)" und "[\d]{6}"
erhalte ich folgen Zahlen: "390", "11" und "40".

Als Ergebnis möchte ich die Zahlen "39", "11" und "40" erhalten.

Wie kann ich von der Zahl "390" die Ziffer "0" entfernen, ohne bei der Zahl "40" auch die
Ziffer "0" zu entfernen?

Für evtl. Tipps oder Anregungen schon mal besten Dank!
Werner

  

Betrifft: AW: Mit RegEx letzte Ziffer entfernen von: ransi
Geschrieben am: 15.10.2014 23:15:35

HAllo

Zeigst du uns mal den kompletten Code ?

ransi


  

Betrifft: =Left(Zahl, 2)*1 owT von: Rudi Maintaire
Geschrieben am: 16.10.2014 14:08:04

.


  

Betrifft: AW: =Left(Zahl, 2)*1 owT von: Golem
Geschrieben am: 16.10.2014 15:35:48


Hallo Rudi,

einen schönen Dank für Deinen Vorschlag,

ich habe eine Lösung für mein Problem gefunden, aber ein neues Problem hat sich aufgetan.
Damit bin ich momentan noch am Ausprobieren.

Dein Vorschlag ist eine Alternative. Aber mein Ehrgeiz möchte das Problem mit RegEx lösen.

Wenn Du Interesse an meinen Gesamtcode haben solltest, so warte bitte noch eine kurze Zeit.
Dann werde ich den Gesamtcode mit Lösungsbeschreibung mitteilen.

Ich bin sehr daran interessiert, dass Excel/VBA-Fachleute mir evtl. konstruktiv behilflich sein werden.

Schöne Grüße
Werner


  

Betrifft: AW: Mit RegEx letzte Ziffer entfernen von: Golem
Geschrieben am: 16.10.2014 15:28:59

Hallo Ransi,

einen schönen Dank für Deine Anfrage.

Ich habe eine Lösung für mein Problem gefunden, aber ein neues Problem hat sich aufgetan.
Damit bin ich momentan noch am Ausprobieren.

Wenn Du noch an meinen Gesamtcode Interesse hast, so warte bitte noch eine kurze Zeit.
Dann werde ich den Gesamtcode mit Lösungsbeschreibung mitteilen.

Ich bin sehr daran interessiert, dass Excel/VBA-Fachleute mir evtl. behilflich sein werden.

Schöne Grüße
Werner


  

Betrifft: AW: Mit RegEx letzte Ziffer entfernen von: Golem
Geschrieben am: 18.10.2014 12:01:15

Hallo Rudi und Ransi,

wie zugesagt, hier mein Ergebnis für "Mit RegEx letzte Ziffer entfernen".

Zur Erinnerung:

Ich habe drei Zeichenketten: "BEWKOSTEN050003390", "SVWZWOHNUNGNR.50007011" und
"WOHNUNGNR.40BAHNHOFSTR.13.
Mit dem Regex "(BEWKOSTEN|EREF|ZV|SVWZ|WOHNUNGNR.|BAHNHOFSTR.13)" und "[\d]{6}"
erhalte ich folgen Zahlen: "390", "11" und "40".

Als Ergebnis möchte ich die Zahlen "39", "11" und "40" erhalten.

Wie kann ich von der Zahl "390" die Ziffer "0" entfernen, ohne bei der Zahl "40" auch die
Ziffer "0" zu entfernen?

Ich habe es mit einer sogenannten "Wortgrenze" ( \b[0] ) gelöst. Mit dieser sogenannte Wortgrenze wird
geprüft, ob ein Wortende eine Ziffer "0" besitzt und wenn ja, dann wird diese Ziffer entfernt.
Aber in dem Text "HAUSGELD WOHN.NR.30" ist dadurch auch von der Zahl "30" die "0" entfernt worden.

Dies ist das nächste Problem gewesen.

Danach habe ich mit dem Vorschlag von Ransi einige Beispiele probiert ( =Left(Zahl, 2)*1 ),
die Regexe weiter angepasst und die Reihenfolge der einzelnen Regexe verändert und
jetzt funktioniert alles einwandfrei.

Was möchte ich erreichen!

Ich habe von einer Bank eine csv-Datei, in der vom Jahr 2013 alle Kontobewegungen eines Girokontos
angegeben werden ( ca. 1.000 Bewegungen ).
Aus der Spalte "Verwendungszweck" möchte ich von allen Einzahlungen die teilweise enthaltenen Wohnugs-Nummern auslesen.
Die Texte in den einzelnen Zellen sind recht unterschiedlich ( der Kreativität der Angabe des Verwendungszweckes sind
keine Grenzen gesetzt ).

Das ist ein Teilbereich der gesamten Auswertung und alles funktioniert einwandfrei.

Public Function Wohnungs_Nr_finden(ByVal Verwendungszweck As String) As String
Dim RegEx As Object

' Reguläre Ausdrücke (Regular Expressions, kurz RegExp) dienen zum Suchen und Ersetzen von  _
Textelementen.
' Hier, für das Entfernen bestimmter Namen aus einem String.
' Mit Hilfe der Replace Methode kann man eine Zeichenkette nach bestimmten Textmustern (Pattern) _
 durchsuchen
' und die gefundenen Textstellen durch einen anderen Text ersetzen oder löschen.

Dim re1 As String
  re1 = Range("RegEx1")
Dim re2 As String
  re2 = Range("RegEx2")
Dim re3 As String
  re3 = Range("RegEx3")
Dim re4 As String
  re4 = Range("RegEx4")
Dim re5 As String
  re5 = Range("RegEx5")
Dim re6 As String
  re6 = Range("RegEx6")
Dim re7 As String
  re7 = Range("RegEx7")
Dim re8 As String
  re8 = Range("RegEx8")
Dim re9 As String
  re9 = Range("RegEx9")
Dim re10 As String
  re10 = Range("RegEx10")
Dim re11 As String
  re11 = Range("RegEx11")
Dim re12 As String
  re12 = Range("RegEx12")
Dim re13 As String
  re13 = Range("RegEx13")
Dim re14 As String
  re14 = Range("RegEx14")
Dim re15 As String
  re15 = Range("RegEx15")
Dim re16 As String
  re16 = Range("RegEx16")
Dim re17 As String
  re17 = Range("RegEx17")

Dies ist mein Code:
  
    Set RegEx = CreateObject("Vbscript.Regexp")
    
        With RegEx
           .Global = True            ' Soll nur die erste Fundstelle (Standard, False), oder  _
alle Fundstellen (True) zurückgegeben werden?.....
           .IgnoreCase = True        ' Legt fest, ob Groß- oder Kleinschreibung beachtet werden  _
soll.....
           '.MultiLine = False       ' Wird diese Eigenschaft auf True gesetzt, so wird in der  _
Textbox Text mehrzeilig dargestellt.....
        
' Pattern-Zuweisung (engl. Modell, Muster) zum RegExp Objekt. Dieser Schritt definiert das " _
Wortmuster" nach dem in einer Zeichenkette gesucht werden kann.
           .Pattern = re1
           Wohnungs_Nr_finden = .Replace(Replace(Replace(Replace(Replace(Replace(Replace( _
Verwendungszweck _
                                , " ", ""), "-", ""), "/", ""), ",", ""), "&", ""), "+", ""), "" _
)
           
           .Pattern = re2
           Wohnungs_Nr_finden = .Replace(Wohnungs_Nr_finden, "")
           
           .Pattern = re3
           Wohnungs_Nr_finden = .Replace(Wohnungs_Nr_finden, "")
           
           .Pattern = re4
           Wohnungs_Nr_finden = .Replace(Wohnungs_Nr_finden, "")
           
           .Pattern = re5
           Wohnungs_Nr_finden = .Replace(Wohnungs_Nr_finden, "")
           
           .Pattern = re6
           Wohnungs_Nr_finden = .Replace(Wohnungs_Nr_finden, "")
           
           .Pattern = re7
           Wohnungs_Nr_finden = .Replace(Wohnungs_Nr_finden, "")
           
           .Pattern = re8
           Wohnungs_Nr_finden = .Replace(Wohnungs_Nr_finden, "")
           
           .Pattern = re9
           Wohnungs_Nr_finden = .Replace(Wohnungs_Nr_finden, "")
           
           .Pattern = re10
           Wohnungs_Nr_finden = .Replace(Wohnungs_Nr_finden, "")
           
           .Pattern = re11
           Wohnungs_Nr_finden = .Replace(Wohnungs_Nr_finden, "")
           
           .Pattern = re12
           Wohnungs_Nr_finden = .Replace(Wohnungs_Nr_finden, "")
           
           .Pattern = re13
           Wohnungs_Nr_finden = .Replace(Wohnungs_Nr_finden, "")
           
           .Pattern = re14
           Wohnungs_Nr_finden = .Replace(Wohnungs_Nr_finden, "")
           
           .Pattern = re15
           Wohnungs_Nr_finden = .Replace(Wohnungs_Nr_finden, "")
           
           .Pattern = re16
           Wohnungs_Nr_finden = .Replace(Wohnungs_Nr_finden, "")
           
           .Pattern = re17
           Wohnungs_Nr_finden = .Replace(Wohnungs_Nr_finden, "")
           
        End With
        
    Set RegEx = Nothing
    
           If Wohnungs_Nr_finden = "390" Then
           Wohnungs_Nr_finden = Left(Wohnungs_Nr_finden, 2)
           
           Else
 
           If Wohnungs_Nr_finden = "" Then
              Wohnungs_Nr_finden = 0
    
        End If
        
    End If
      
End Function
Und das sind die einzelnen RegExe:

(Jan|Febr|Ma|Apr|Ju)\.?(\D?){1,3}[\d?]{1,4}
'Jan(.), Januar, Febr(.), Februar, Maerz, Mai, Apr(.), April, Jun(.), Juni, Jul(.), Juli, 1 bis 99
(Aug|Sept|Okt|Nov|Dez)\.?(\D?){4,5}[\d?]{1,4}
'Aug(.), August, Sept(.), September, Okt(.), Oktober, Nov(.), November, Dez(.), Dezember, 1 bis 99


(((0?[1-9]|[12][0-9])\.(0?[1-9]|1[0-2])\.)|(30\.((0?[13-9])|(1[0-2]))\.)|(31\.(0?[13578]|1[02])\.))(\d{2}|20\d{2})
'Beispiel: (0)2.08.13 oder 28.11.2099


(20\d{2})
'Beispiel: 2010 bis 2099


(Bahnhofstr\.?\d[1-3]?)
'Bahnhofst. 7 oder 9 usw. bis 7-13


((Bew)|(Kosten)|(Haus[\d]?)|(Geld))
'Bew, Kosten, Haus (1 bis 4), Geld
((Whn)|(Wohn|ungs?)|(Geld)|(N(\D?){4}r)|[\.?])
'Whn, Wohn, Geld, Wohnung(s), Wohnung(s)nummer
(Nachzahl[\.?](\D{3})?)
'Nachzahl(.), Nachzahlung


(EREF(ZV)?[\d]{12,22}|SVWZ)

([0]?5[0]{3}[1]?[7]?[9]?[1-4]?[0]?)
'Beispiel: 050003390


[A-Z](\.?){1,4}

Siebzehn Zellen habe ich für RegExe vorgesehen, davon sind elf belegt.

Schöne Grüße an Euch und schönen Dank für Eure Bemühungen!
Werner


 

Beiträge aus den Excel-Beispielen zum Thema "Mit RegEx letzte Ziffer entfernen"