VBA Zahl- & Buchstabenkombination finden
31.05.2017 17:41:52
Stephan
Ich schreibe ein Makro, mit dessen Hilfe ich aus einem beliebigen String eine bestimmte Buchstaben- und Zahlenkombination extrahieren möchte. Diese besteht immer aus sechs Zeichen, nämlich einem A, einem weiteren Buchstaben und vier Zahlen (z.B. AH1234). Die Kombination wird meist mit einem Komma, einem Leerzeichen, einem Punkt oder einem ähnlichem Sonderzeichen abgeschlossen; manchmal steht sie auch am Ende des Strings und schließt diesen somit selbst ab.
Mein Beispieldatensatz ist in Spalte A bspw. wie folgt befüllt (die Kombination habe ich mal fett markiert):
Überschrift1
LER_sTPH:AE4384_B9 Spyder Nachfolger
OLER_Z85_Z87_Z98_DLS_neueKlappen
NR 169319 OLERFFPx,AZ4696 Z98 Turbo
Aenderung Telematik, OMV sTPH AZ8996
NR 554545 OLER AZ8966 Z98 CO2-Urteil
ÄHEL_sTPH:AH8331_VDP Pendelschlag
AAS Entwicklung LaunchControl Diverses
LER_AH3849, NR43375 WasserstoffZ9X
ÄLER ZMXAL 383189 + AI9543 + CR5879
LR58994_sTPH AZ8549, AI6866, AZ9959
Das gewünsche Ergebnis in Spalte B wäre dementsprechend:
Überschrift2
AE4384
-
AZ4696
AZ8996
AZ8966
AH8331
-
AH3849
AI9543
AZ8549
Mit nachfolgendem Makro gelingt es mir auch tatsächlich, das oben stehende Ergebnis zu generieren. Es sucht nach einem Buchstaben A und setzt diesen als Position i. Position i+1 darf anschließend nicht numerisch sein, während die Positionen i+2 bis i+5 explizit numerisch sein müssen. i+6 hingegen muss entweder gar nichts enthalten, ein Leerzeichen oder eines der aufgeführten Trennungszeichen. Dass diese Lösung nicht ganz sauber ist, ist mir bewusst, denn sie versagt bei anderen als den aufgeführten Zeichen. Etwas besseres ist mir allerings nicht eingefallen und es erfüllt bislang auch seinen Zweck. Das Makro sucht in Spalte A und schreibt das Ergebnis in Spalte B.
Sub Ziegen_suchen()
Dim Quellspalte As Long
Dim Zielspalte As Long
Dim Suchtext() As String
Dim LetzteZeile As Long
Dim i As Integer
Dim str As String
Dim Fundsache As String
Dim q As Integer
Quellspalte = 1
Zielspalte = 2
LetzteZeile = Cells(Rows.Count, Quellspalte).End(xlUp).Row
'Text einlesen
For i = 2 To LetzteZeile
ReDim Preserve Suchtext(i - 1)
Suchtext(i - 2) = Cells(i, Quellspalte)
Next i
'Kombination finden
For q = 0 To UBound(Suchtext) - 1
str = Suchtext(q)
For i = 1 To Len(str)
If Mid(str, i, 1) = "A" _
And IsNumeric(Mid(str, i + 1, 1)) = False _
And IsNumeric(Mid(str, i + 2, 1)) = True _
And IsNumeric(Mid(str, i + 3, 1)) = True _
And IsNumeric(Mid(str, i + 4, 1)) = True _
And IsNumeric(Mid(str, i + 5, 1)) = True _
And IsNumeric(Mid(str, i + 6, 1)) = False _
And (Mid(str, i + 6, 1) = " " _
Or Mid(str, i + 6, 1) = "," _
Or Mid(str, i + 6, 1) = "." _
Or Mid(str, i + 6, 1) = "" _
Or Mid(str, i + 6, 1) = "-" _
Or Mid(str, i + 6, 1) = ":" _
Or Mid(str, i + 6, 1) = ";" _
Or Mid(str, i + 6, 1) = "_") Then
Exit For
End If
Next i
If i
Meine Frage ist nun die folgende: Wie in der letzten Zeile des Datensatzes ersichtlich wird, besteht die Möglichkeit, dass mehrere der gesuchten Zeichenfolgen in einer einzigen Zeile auftauchen. Ich würde die zweite Sichtung gerne in Spalte C, die dritte in Spalte D usw. ausgeben lassen, allerdings gelingt mir auf Teufel komm raus die Umsetzung nicht.
Meine Überlegung war, ein aufgefundenes Ergebnis (z.B. AZ8549) aus dem zugehörigen String (in diesem Fall: "LR58994_sTPH AZ8549, AI6866, AZ9959") löschen zu lassen (Ergebnis: "LR58994_sTPH , AI6866, AZ9959") und den String im Anschluss ein weiteres Mal zu durchsuchen. Hat jemand eine Idee, wie man das in VBA-Code gießen könnte?
Vielen Dank für jeden Vorschlag
Stephan