pedercornelison
Goto Top

VBA 5stellige Postleitzahl in Excel-Spalte suchen und Text nachfolgend ausschneiden:kopieren

Hallo zusammen,
ich kann mir vorstellen, dass meine Anforderung schon öfter gelöst wurde, nur finde ich keine passende Lösung.
Ich bekomme aus einem Routenplaner die anzufahrenden Adressen als Export ausgegeben als Exceltabelle.
Die Adressen stehen als Text in der Spalte A und sind in der Reihenfolge Anschrift PLZ Ort, getrennt durch Leerzeichen.
Ein Musterbeispiel findet Ihr als Bild: Adressen aus Routenplaner.png

Zur Weiterverarbeitung benötige ich aber die Trennung in Anschrift sowie PLZ Ort in zwei nebeneinander liegenden Spalten.
Dies ist insofern komplex, weil der Text nicht einfach getrennt werden kann z.B. mit Text in Spalten oder Formeln, weil die Anschrift sowie der Ort unterschiedliche Längen und teilweise mit Bindestrichen versehen beinhalten.
Ich möchte also nach der 5-stelligen PLZ suchen, dann den gesamten Inhalt ab der ersten Stelle der PLZ nach rechts ausscheiden und in die leere Spalte B daneben kopieren, und dann soll das Leerzeichen hinter der Hausnummer der Adresse in Spalte A noch gelöscht werden, damit bei der Weiterverarbeitung keine Probleme damit entstehen.

Da ich den Text als Werte benötige möchte ich nicht mit Fromen in Zellen arbeiten sondern ein VBA-Projekt nutzen mit folgender Vorgehensweise:
BEGINN
WENN 5stellige Zahl gefunden
DANN gehe zu Beginn der 5stelligen Zahl
MARKIERE den Inhalt vom Beginn dieser Zahl bis zum Ende der Zeile
SCHNEIDE den markierten Inhalt komplett aus
KOPIERE den Inahalt in die Spalte B daneben
SPRINGE in die Spalte A zurück und lösche das letzte Leerzeichen hinter der Hausnummer
SPRINGE in die nächste Zeile der Spalte A
WIEDERHOLE diesen Vorgang, bis kein Inhalt mehr in den Zellen vorhanden ist
ENDE

Ich beziehe mich auf einen Beitrag den ich hier im Forum gefunden habe von Mitglied Biber vom 28.08.2006 um 20:26:43 Uhr.
VBA ist nachfolgend als Code beigefügt.

Public Sub BiberTest()

Dim a As Long
Dim c, t As String
Dim atokens As Variant
Dim i As Integer
a = 1
While Tabelle1.Cells(a, 1) <> ""  
    c = Tabelle1.Cells(a, 1)
    atokens = Split(Tabelle1.Cells(a, 1))
    For i = 0 To UBound(atokens) - 1
         t = atokens(i)
         If (Len(t) = 5) And IsNumeric(t) Then
           Tabelle1.Cells(a + 1, 1) = Mid(c, InStr(1, c, t))
            Exit For
         End If
    Next
a = a + 2
Wend

End Sub

Diese Lösung ist schon fast das was ich suche.
Unterschied zu meinem Wunsch, das VBA kopiert den Text (wird nicht ausgeschnitten) in die Zeile darunter anstelle in die Spalte B daneben.

Es wäre toll wenn mit jemand da helfen könnte.

Beste Grüße aus Köln
adressen aus routenplaner

Content-ID: 2556215652

Url: https://administrator.de/contentid/2556215652

Ausgedruckt am: 22.11.2024 um 02:11 Uhr

NordicMike
NordicMike 21.04.2022 aktualisiert um 11:40:57 Uhr
Goto Top
Ich würde nach " " (Leerzeichen) Splitten, das Array in Integers umwandeln und dann aus dem Array die einzige Nummer auswählen, die >999 ist.
colinardo
Lösung colinardo 21.04.2022 aktualisiert um 17:10:51 Uhr
Goto Top
Servus nach Kölle, und herzlich Willkommen auf Administrator.de!
Sub SplitAddresses()
    ' Variables  
    Dim regex As Object, matches as Object, cell As Range
    ' regex object  
    Set regex = CreateObject("vbscript.regexp")  
    ' regex object settings  
    regex.IgnoreCase = True
    ' regex pattern  
    regex.Pattern = "^(.*?)\s+(\d{5}.*)"  
    
    ' Work on the current sheet  
    With ActiveSheet
        ' for each used cell in column A1:A(n)  
        For Each cell In .Range("A1:A" & .Cells(Rows.Count, "A").End(xlUp).Row)  
            ' execute regex match  
            Set matches = regex.Execute(cell.Value)
            ' if match found ...  
            If matches.Count > 0 Then
                ' set matched values of cell and neighbor to regex submatches  
                cell.Value = Trim(matches(0).submatches(0))
                cell.Offset(0, 1).Value = Trim(matches(0).submatches(1))
            End If
        Next
    End With
End Sub
Grüße Uwe
it-frosch
it-frosch 21.04.2022 um 12:09:55 Uhr
Goto Top
das funktioniert aber nicht bei PLZ mit führender "0".

grüße vom it-frosch
NordicMike
NordicMike 21.04.2022 aktualisiert um 13:03:04 Uhr
Goto Top
Ja, du hast Recht, dann mit Regex.
PederCornelison
PederCornelison 21.04.2022 um 17:52:29 Uhr
Goto Top
Hallo colinardo (Uwe),

vielen lieben Dank, dieses VBA macht zu 100% ganau das was ich mir vorgestellt habe.
Habe 5 x getestet mit unterschiedlichen Daten.
Es hat imemr exakt gearbeitet.

Tausend Dank dafür.

Beste Grüße
Peter
colinardo
colinardo 21.04.2022 aktualisiert um 21:11:43 Uhr
Goto Top
👍 Immer gerne.

Grüße Uwe