sejosc
Goto Top

VBA - 5stellige Ziffern in Excel-Spalte suchen und Inhalt kopieren

Hallo zusammen,

ich habe hier ein kleines Problem mit einer Excel-Tabelle. Aus einer txt-Datei werden Adressdaten in die Tabelle importiert. Allerdings stehen dabei alle Daten in einer Zelle (Bsp.: Achim Müller Mühlstraße 3 98765 Teststadt).

Nun muss mittels eines Makro der Teil ab Beginn der Postleitzahl in eine Zeile darunter kopiert werden. Diese Zeilen habe ich schon mittels eines anderen Makro einfügen lassen. Es geht also nur noch ums Kopieren der Inhalte.

Ich hoffe, dass ich mich möglichst verständlich ausgedrückt habe.

Vielen Dank im voraus,

Sebastian Schäfer


PS.: Kann mir jemand einen Tipp geben (ich habe noch nie mit VBA gearbeitet), wie ich mehrere Makros, die ich in Excel erstellt habe, nacheinander automatisch ablaufen lassen kann? Ich möchte sie nicht immer manuell aufrufen müssen.

Content-Key: 38709

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

Printed on: April 18, 2024 at 19:04 o'clock

Member: Stefan764
Stefan764 Aug 24, 2006 at 15:46:23 (UTC)
Goto Top
Würde ich so machen :

Public Sub Test()

Dim a As Long
Dim b As Integer
Dim c As String

a = 1
While Tabelle1.Cells(a, 1) <> ""  
    c = Tabelle1.Cells(a, 1)
    For b = 1 To Len(c) - 4
        If Asc(Mid$(c, b, 1)) >= Asc("0") And _  
           Asc(Mid$(c, b, 1)) <= Asc("9") And _  
           Asc(Mid$(c, b + 1, 1)) >= Asc("0") And _  
           Asc(Mid$(c, b + 1, 1)) <= Asc("9") And _  
           Asc(Mid$(c, b + 2, 1)) >= Asc("0") And _  
           Asc(Mid$(c, b + 2, 1)) <= Asc("9") And _  
           Asc(Mid$(c, b + 3, 1)) >= Asc("0") And _  
           Asc(Mid$(c, b + 3, 1)) <= Asc("9") And _  
           Asc(Mid$(c, b + 4, 1)) >= Asc("0") And _  
           Asc(Mid$(c, b + 4, 1)) <= Asc("9") _  
        Then
           Tabelle1.Cells(a + 1, 1) = Mid$(c, b, 5)
        End If
    Next
a = a + 2
Wend

End Sub

das Prog. kopiert die letzte 5-Stellige Zahl aus der ersten Spalte eine Zeile tiefer.
Member: sejosc
sejosc Aug 24, 2006 at 21:46:43 (UTC)
Goto Top
Hallo und danke für die schnelle Antwort!

Leider ist es so, dass ich mit dem Vorschlag nicht so viel anfangen kann, da ja zusätzlich zur Postleitzahl auch der Text dahinter (Ortsname) eine Zeile tiefer kopiert werden muss. Ich habe bereits ein Skript gefunden, das mir die Postleitzahlen sucht und dann in einer MessageBox anzeigt. Könnte man nicht auf diesem Skript aufbauen und sozusagen folgendes implementieren:

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 INHALT AUS
KOPIERE den Inhalt in die Zeile darunter
SPRINGE in die nächste Zeile
WIEDERHOLE diesen Vorgang, bis kein Inhalt mehr in den Zellen vorhanden ist
ENDE

Das momentane Skript, das die PLZ sucht, lautet wie folgt:

Sub plzsuche()
For Each rng In Range("C:C")  
  If rng Like "*#####*" Then  
    For n = 1 To Len(rng)
      If IsNumeric(Mid(rng, n, 1)) Then
        If IsNumeric(Mid(rng, n, 5)) Then
          strNumber = Mid(rng, n, 5)
          MsgBox strNumber
          Exit For
        End If
      End If
    Next
  End If
Next
End Sub

Ich hoffe, anhand dieser Angaben lässt sich eine Lösung finden. Wäre wirklich super!

Vielen Dank und Gruß,

Sebastian Schäfer
Member: Stefan764
Stefan764 Aug 25, 2006 at 11:03:05 (UTC)
Goto Top
Hab ich deine Frage nicht genau genug gelesen, sorry.

Man kann mein Skript so ändern, daß es alle Zeichen ab der PLZ kopiert.

Hab ich auch noch ein bischen vereinfacht : IsNumeric kannte ich noch nicht...

Public Sub Test()

Dim a As Long
Dim b As Integer
Dim c As String

a = 1
While Tabelle1.Cells(a, 1) <> ""  
    c = Tabelle1.Cells(a, 1)
    For b = 1 To Len(c) - 4
        If IsNumeric(Mid$(c, b, 1)) And _
           IsNumeric(Mid$(c, b + 1, 1)) And _
           IsNumeric(Mid$(c, b + 2, 1)) And _
           IsNumeric(Mid$(c, b + 3, 1)) And _
           IsNumeric(Mid$(c, b + 4, 1)) _
        Then
           Tabelle1.Cells(a + 1, 1) = Mid$(c, b, 1000)
        End If
    Next
a = a + 2
Wend

End Sub
Member: sejosc
sejosc Aug 28, 2006 at 12:43:26 (UTC)
Goto Top
Danke, so funktioniert das endlich, wie ich wollte!
Member: Biber
Biber Aug 28, 2006 at 18:26:43 (UTC)
Goto Top
...und falls ihr mal eine größere Datenmenge haben solltet oder zeitiger essen wollt:
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

Gruß
Biber