Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: 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
Anzeige

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
Anzeige
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?
Anzeige
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.
Anzeige
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.*$)"
Anzeige
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
Anzeige
...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 :-?
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
Anzeige
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
Anzeige

Infobox / Tutorial

VBA zur Extraktion von Zahl- und Buchstabenkombinationen


Schritt-für-Schritt-Anleitung

Um eine Zahl- und Buchstabenkombination mithilfe von VBA zu extrahieren, folge diesen Schritten:

  1. Öffne Excel und drücke ALT + F11, um den VBA-Editor zu öffnen.
  2. Erstelle ein neues Modul:
    • Rechtsklick auf "VBAProject (DeinWorkbookName)".
    • Wähle Einfügen > Modul.
  3. Füge den folgenden VBA-Code ein:
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
        'Hier das gefundene Ergebnis verarbeiten
        If i < Len(str) Then
            Cells(q + 2, Zielspalte) = Mid(str, i, 6)
            Zielspalte = Zielspalte + 1
        End If
    Next q
End Sub
  1. Führe das Makro aus:
    • Schließe den VBA-Editor und gehe zurück zu Excel.
    • Drücke ALT + F8, wähle Ziegen_suchen und klicke auf Ausführen.

Häufige Fehler und Lösungen

  • Fehler 429: Objekterstellung durch ActiveX-Komponente nicht möglich:

    • Stelle sicher, dass alle benötigten VBA-Referenzen aktiviert sind. Dies kann in den Optionen des VBA-Editors überprüft werden.
  • Ergebnisse erscheinen nicht:

    • Überprüfe, ob der Datensatz in der richtigen Spalte (A) vorhanden ist und dass die Kombinationen den Kriterien entsprechen.

Alternative Methoden

Wenn Du keine VBA-Makros verwenden möchtest, kannst Du Formeln oder die LIKE-Funktion nutzen. Hier ist ein Beispiel für die Verwendung von LIKE:

Sub Ziegen_suchen_like()
    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
            arr(z, 1) = IIf(erg = "", "-", Mid(erg, 2))
        Next
        .Offset(0, 1).Value = arr
    End With
End Sub

Praktische Beispiele

Angenommen, Du hast folgende Daten in Spalte A:

LER_sTPH: AE4384_B9 Spyder Nachfolger
NR 169319 OLERFFPx, AZ4696 Z98 Turbo

Nach dem Ausführen des Makros wird in Spalte B das Ergebnis wie folgt aussehen:

AE4384
AZ4696

Tipps für Profis

  • Nutze RegEx für komplexere Mustererkennung. Damit kannst Du spezifischere Kriterien für die Kombinationen definieren.

  • Wenn Du mehrere Kombinationen pro Zeile extrahieren möchtest, denke daran, die Zeilen nach der ersten Suche zu bereinigen, um eine mehrfache Suche zu ermöglichen.


FAQ: Häufige Fragen

1. Kann ich das Makro auch in einer anderen Excel-Version verwenden? Ja, das Makro sollte in den meisten Excel-Versionen, die VBA unterstützen, funktionieren.

2. Was ist der Unterschied zwischen VBA und Formeln? VBA ist eine Programmiersprache, die für komplexe Aufgaben verwendet wird, während Formeln einfachere Berechnungen und Datenanalysen durchführen.

3. Wie aktiviere ich die RegEx-Funktion in VBA? Du musst die Microsoft VBScript Regular Expressions 5.5 in den Referenzen aktivieren, um RegEx in VBA zu verwenden.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige