Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1560to1564
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

VBA Zahl- & Buchstabenkombination finden

VBA Zahl- & Buchstabenkombination finden
31.05.2017 17:41:52
Stephan
Hallo Forum!
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

22
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: RegEx
31.05.2017 19:55:53
Stephan
Von RegEx hab ich noch nie etwas gehört :) Danke für den Link
AW: VBA Zahl- & Buchstabenkombination finden
31.05.2017 19:54:28
Stephan
Vielen Dank für die Konstruktion der Function Nur!! Das ist eine interessante Variante, die ich mir gleich mal genauer anschauen werde, wobei sie noch Tücken hat. Bspw. erkennt sie in der vorletzten Zeile "AL 383" fälschlicherweise als gesuchte Kombination
Anzeige
AW: VBA Zahl- & Buchstabenkombination finden
31.05.2017 20:02:42
onur
Ist mir auch eben aufgefallen, muss ich ändern.
AW: VBA Zahl- & Buchstabenkombination finden
31.05.2017 20:17:51
Stephan
Hey! Kann es sein, dass Du die falsche/alte Datei hochgeladen hast?
AW: VBA Zahl- & Buchstabenkombination finden
31.05.2017 20:36:28
Stephan
Also auf die Implementierung von ASCII wäre ich niemals gekommen, Danke Onur
Hier bietet sich...
31.05.2017 19:08:52
Case
Hallo Stephan, :-)
... "VBScript.Regexp" an: ;-)
Beispieldatei...
Servus
Case

Anzeige
AW: Hier bietet sich...
31.05.2017 20:04:52
Stephan
Danke Case für die Beispieldatei!! Krass was ihr euch hier für eine Mühe macht. Ich bin mittlerweile nicht mehr auf der Arbeit und kriege daheim (am Mac) beim Drücken des Buttons nur die Fehlermeldung "Error 429 Objekterstellung durch ActiveX-Komponente nicht möglich", und das obwohl in den VBA-Referenzen die 14.0 Object Library geladen ist. Das ist eine ganz eigene Baustelle die hier nicht diskutiert werden muss. Ich gebe gleich morgen früh Rückmeldung, wenn ich wieder am Windows-PC sitze.
Das hat eigentlich...
31.05.2017 20:45:40
Case
Hallo Stephan, :-)
... keine Mühe gemacht, da ich einen fertigen Code genutze habe. Es muss lediglich eine Zeile ".Pattern" angepasst werden. ;-)
Unter Office für Mac läuft das allerdings nicht. \O/
Servus
Case

Anzeige
AW: Das hat eigentlich...
01.06.2017 10:59:09
Stephan
Hey Case, das funktioniert ja ganz vorzüglich. Merci! Weißt Du ggf. auch, wie man Duplikate (die in derselben Zeile gefunden werden) ignorieren kann? Google liefert "(?!.*\1)/ig", allerdings misslingt mir die Integration :D
AW: Das hat eigentlich...
01.06.2017 14:09:19
Stephan
Um die Antwort auf meine Frage an dieser Stelle noch zu dokumentieren; es funktioniert mit:
.Pattern = "(A[A-Z]\d{4})(?!.*?\1.*$)"
Man könnte auch im Archiv Vorhandenes nutzen, ...
31.05.2017 21:16:46
Luc:-?
…Stephan,
wie zB die UDF VLike:
 ABCDEFGHI
10
PrimärdatenStufe1Stufe2Stufe3Stufe4 LER_sTPH:AE4384_B9 Spyder NachfolgerAE4384--- OLER_Z85_Z87_Z98_DLS_neueKlappen---- NR 169319 OLERFFPx,AZ4696 Z98 TurboAZ4696--- Aenderung Telematik, OMV sTPH AZ8996AZ8996--- NR 554545 OLER AZ8966 Z98 CO2-UrteilAZ8966--- ÄHEL_sTPH:AH8331_VDP PendelschlagAH8331--- AAS Entwicklung LaunchControl Diverses---- LER_AH3849, NR43375 WasserstoffZ9XAH3849--- ÄLER ZMXAL 383189 + AI9543 + CR5879AI9543--- LR58994_sTPH AZ8549, AI6866, AZ9959AZ9959AI6866AZ8549- E11[:E20]:=WENN(VLike(A11;"*A[A-Z]####*");TEIL(A11;VLike(A11;"*A[A-Z]####*";-1);6);"-")F11[:F20]:=WENN(VLike(WECHSELN($A11;E11;"");"*A[A-Z]####*");TEIL(WECHSELN($A11;E11;"");VLike(WECHSELN($A11;E11;"");"*A[A-Z]####*";-1);6);"-")G11[:G20]:=WENN(VLike(WECHSELN(WECHSELN($A11;E11;"");F11;"");"*A[A-Z]####*");TEIL(WECHSELN(WECHSELN($A11;E11;"");F11;"");VLike(WECHSELN(WECHSELN($A11;E11;"");F11;"");"*A[A-Z]####*";-1);6);"-")H11[:H20]:=WENN(VLike(WECHSELN(WECHSELN(WECHSELN($A11;E11;"");F11;"");G11;"");"*A[A-Z]####*");TEIL(WECHSELN(WECHSELN(WECHSELN($A11;E11;"");F11;"");G11;"");VLike(WECHSELN(WECHSELN(WECHSELN($A11;E11;"") …
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Man könnte bei Stufe1 das 2.Argument von VLike auch präziser fassen - als "*A[A-Z]####[ ,_]*" bzw "*A[A-Z]####[!A-Za-z0-9]*" -, aber dann wird ein Wert am Zeilende wie in Zeile 14 erst in Stufe2 gefunden. Falls man sich dabei zusätzlich auch noch darauf bezieht, ob überhpt etwas in Stufe1 gefunden wurde, würde solch ein Wert von VLike nie gefunden wdn.
VLike (ohne VPairs) https://www.herber.de/cgi-bin/callthread.pl?index=1247144#1247699
Feedback nicht unerwünscht! Gruß, Luc :-?
Besser informiert mit …
Anzeige
AW: Man könnte auch im
01.06.2017 11:47:26
Stephan
Vielen Dank Luc für den Vorschlag!! Der funktioniert sehr gut, ich habs gerade mal umgesetzt. Allerdings glaube ich, dass es über RegEx am Ende einfacher sein dürfte, Ergänzungen umzusetzen wie z.B. das Ignorieren von Duplikaten.
AW: mit Like
01.06.2017 12:44:10
Daniel
Hi
meiner Ansicht nach bietet sich hier der LIKE-Operator an, um die entsprechend Zeichenkombination zu finden.
Damit Anfang und Ende keine Ausnahmefälle bilden, fügt man dort noch ein Trennzeichen hinzu.

Sub Ziegen_suchen()
Dim arr
Dim z As Long
Dim i As Long
Dim erg As String
Dim txt As String
With Range("A2:A" & Cells(1, 1).End(xlDown).Row)
arr = .Value
For z = 1 To UBound(arr, 1)
txt = " " & arr(z, 1) & " "
erg = ""
For i = 1 To Len(txt) - 7
If Mid(txt, i, 8) Like "[ ,_:-]A[A-Z]####[ ,_:-]" Then
erg = erg & ";" & Mid(txt, i + 1, 6)
i = i + 7
End If
Next
If erg = "" Then
arr(z, 1) = "-"
Else
arr(z, 1) = Mid(erg, 2)
End If
Next
With .Offset(0, 1)
.Value = arr
.TextToColumns .Cells(1, 1), xlDelimited, semicolon:=True
End With
End With
End Sub
Gruß Daniel
Anzeige
Darauf basiert auch VLike, also nichts Neues ...
01.06.2017 13:56:27
Luc:-?
…bis auf deinen Hinweis auf Anfang und Ende des OriginalTextes, Daniel,
was er auch bei VLike verwenden könnte, aber offensichtlich RegEx vorzieht…
Gruß, Luc :-?
AW: Darauf basiert auch VLike, also nichts Neues ...
01.06.2017 14:25:41
Daniel
naja, warum ein von einer unbekannten Person programmiertes und kaum dokumentiertes VLike nutzen, wenn es mit Like eine original VBA-Funktion gibt, die in der Online-Hilfe (per F1 jederzeit aufrufbar) ausführlich dokumentiert ist?
Gruß Daniel
...Ach, und du bist ihm nun bekannter, ...
01.06.2017 14:52:19
Luc:-?
…Daniel,
vielleicht vom gemeinsamen Slowboarden her…‽ ;->>
Letztlich hast du nur Zeit verschwendet, evtl doch nur, um dein Ego ein bisschen zu kitzeln…? ;-]
Gruß, Luc :-?
Anzeige
AW: nö, bin ich nicht...
01.06.2017 16:49:42
Daniel
... ist auch nicht notwendig.
Da ich ihm nicht eine von mir erstellte Lösung vorschlage, sondern lediglich aufzeige, wie er bei mit VBA-Standard-Methoden, die er bei seinem Kenntnisstand beherrschen kann, das Problem auf einfache weise selber lösen kann.
aber auch dein Ego scheint ein bisschen angekratzt, weil er sich nicht für deine Lösung entschieden hat...
Gruß Daniel
Das habe ich ja auch nicht unbedingt erwartet, ...
01.06.2017 21:57:03
Luc:-?
…aber dich hat er offensichtlich gar nicht erst zK genommen, Daniel,
was dich wohl ziemlich wurmt. Aber, wie es doch so (un-)schön heißt: Wer zu spät kommt, den bestraft das Leben! :->
Ahoi! Luc :-?
Anzeige

316 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige