Liste nach Werten einer zweiten Liste durchsuchen
Guten Tag zusammen,
ich komme gleich zu meinem Problem das mich schon lange ärgert, bzw. die Tatsache, dass es sicher eine einfache Lösung dafür gibt und ich sie nur nicht finde, da ich mich mit Excel zu wenig auseinander setze.
Ich Habe 2 Unterschiedliche listen.
Die eine Liste (liste 1) enthält neben ganz viel Text (es sind in excel exportierte E-Mails) immer im gleichen Abstand eine Seriennummern und nach diesen Seriennummern möchte ich in der Zweiten Liste (Liste 2) automatisch suchen und die gefunden Treffer auch irgendwie markieren, damit ich sie Hinterher per Autofilter von den trennen kann.
Das ist das eigentliche Problem, dass ich habe, wenn das funktioniert, währe es großartig, wenn man an stelle des "Markierens" bei einer Übereinstimmung einen Wert, der sich ebenfalls in (liste 1) befindet in die Zelle rechts von der gefunden Seriennummer schrieben könnte.
Ich habe 3 Bilder hinzugefügt, falls diese nicht genügend Infos hergeben einfach bescheid geben was benötigt wird.
Vielen dank im Voraus

ich komme gleich zu meinem Problem das mich schon lange ärgert, bzw. die Tatsache, dass es sicher eine einfache Lösung dafür gibt und ich sie nur nicht finde, da ich mich mit Excel zu wenig auseinander setze.
Ich Habe 2 Unterschiedliche listen.
Die eine Liste (liste 1) enthält neben ganz viel Text (es sind in excel exportierte E-Mails) immer im gleichen Abstand eine Seriennummern und nach diesen Seriennummern möchte ich in der Zweiten Liste (Liste 2) automatisch suchen und die gefunden Treffer auch irgendwie markieren, damit ich sie Hinterher per Autofilter von den trennen kann.
Das ist das eigentliche Problem, dass ich habe, wenn das funktioniert, währe es großartig, wenn man an stelle des "Markierens" bei einer Übereinstimmung einen Wert, der sich ebenfalls in (liste 1) befindet in die Zelle rechts von der gefunden Seriennummer schrieben könnte.
Ich habe 3 Bilder hinzugefügt, falls diese nicht genügend Infos hergeben einfach bescheid geben was benötigt wird.
Vielen dank im Voraus


Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 152293
Url: https://administrator.de/forum/liste-nach-werten-einer-zweiten-liste-durchsuchen-152293.html
Ausgedruckt am: 29.04.2025 um 15:04 Uhr
21 Kommentare
Neuester Kommentar

Hallo mr.lemon!
Du könntest es mal mit einem Makro versuchen.
Quellcode im VB-Editor in ein Modul einfügen und Tabellennamen anpassen:
Nachdem der Quellcode eingefügt wurde, wäre es sinnvoll, wenn Du das Makro unter <Extras><Makro><Makros><FindSeriennummer><Optionen> mit einer Tastenkombination verknüpfst (z.B. Strg+G).
Ablauf:
Du selektierst in Liste1 in Spalte A eine Zelle mit einer Seriennummer (z.B. "Device S/N: Q4571200357") und betätigst die Tasten Strg+G. Dann wird in der Liste2 nach der Seriennummer gesucht und in Spalte B der Wert eingetragen, der sich in Liste1 in der Zeile Seriennummer -4 befindet. Zusätzlich wird im Anschluß die Liste2 aktiviert und die Seriennummer per Autofilter angezeigt. Falls das Filtern und aktivieren der Liste2 entfallen soll, dann einfach in den Codezeilen 28-30 ein Kommentarzeichen (Hochkomma ') davor setzen oder löschen?
Falls die Seriennummer in Liste2 nicht existiert, wird eine Meldung ausgegeben.
Gruß Dieter
Du könntest es mal mit einem Makro versuchen.
Quellcode im VB-Editor in ein Modul einfügen und Tabellennamen anpassen:
Const Sheet1 = "Liste1" ' Tabellenname Liste 1
Const Sheet2 = "Liste2" ' Tabellenname Liste 2
Const SpalteSuchen = "A" ' Liste 2 Spalte Suchen
Const SpalteValue = "B" ' Liste 2 Spalte Wert
Const TextSN = "Device S/N:" ' Text mit Seriennummer
Const Msg0 = "Seriennummer ? nicht gefunden!"
Sub FindSerienNummer()
Dim Found As Range, Token As Variant, SN As String
Token = Split(ActiveCell, TextSN)
If UBound(Token) = 1 Then
SN = Trim(Token(1))
If SN <> "" Then
With Sheets(Sheet2)
.AutoFilterMode = False
Set Found = .Columns(SpalteSuchen).Find(SN, LookIn:=xlValues, LookAt:=xlWhole, MatchCase:=False)
If Not Found Is Nothing Then
Token = Split(Cells(ActiveCell.Row - 4, SpalteSuchen), ":")
.Cells(Found.Row, SpalteValue) = Trim(Token(UBound(Token)))
.Columns(SpalteSuchen).AutoFilter Field:=1, Criteria1:=SN
.Activate
.Range("A1").Select
Else
MsgBox Replace(Msg0, "?", SN), vbInformation, "Suchen..."
End If
End With
End If
End If
End Sub
Nachdem der Quellcode eingefügt wurde, wäre es sinnvoll, wenn Du das Makro unter <Extras><Makro><Makros><FindSeriennummer><Optionen> mit einer Tastenkombination verknüpfst (z.B. Strg+G).
Ablauf:
Du selektierst in Liste1 in Spalte A eine Zelle mit einer Seriennummer (z.B. "Device S/N: Q4571200357") und betätigst die Tasten Strg+G. Dann wird in der Liste2 nach der Seriennummer gesucht und in Spalte B der Wert eingetragen, der sich in Liste1 in der Zeile Seriennummer -4 befindet. Zusätzlich wird im Anschluß die Liste2 aktiviert und die Seriennummer per Autofilter angezeigt. Falls das Filtern und aktivieren der Liste2 entfallen soll, dann einfach in den Codezeilen 28-30 ein Kommentarzeichen (Hochkomma ') davor setzen oder löschen?
Falls die Seriennummer in Liste2 nicht existiert, wird eine Meldung ausgegeben.
Gruß Dieter

Hallo Alex!
Diese Zeile sollte zumindest einen Doppelpunkt beinhalten?
Öffne mal den VB-Editor und wechsle wieder in die Sheetansicht und wiederhole den Vorgang, der zum Fehler führte. Wenn der Debugger eine Meldung ausgibt, auf den Button Debuggen klicken, dann sollte die in Frage kommende Codezeile gelb markiert sein. Zum Beenden der Makroausführung auf das Stop-Symbol (blaues Quadrat) klicken. Danach am besten die Codezeile und die beiden Zellinhalte für Seriennummer und Wert hier posten.
Gruß Dieter
danke für die schnelle Antwort, ich habe den Quelltext als Makro eingefügt und eine Tastenkombination zum schnellstarten
Definiert, allerdings gibt er den Fehler "Index außerhalb des gültigen Bereichs" aus, was bedeutet das?
Dafür gibt es viele Möglichkeiten, aber ich vermute mal, dass es mit der 4.Zeile oberhalb der Zeile mit der Seriennummer zusammenhängt?Definiert, allerdings gibt er den Fehler "Index außerhalb des gültigen Bereichs" aus, was bedeutet das?
Diese Zeile sollte zumindest einen Doppelpunkt beinhalten?
Öffne mal den VB-Editor und wechsle wieder in die Sheetansicht und wiederhole den Vorgang, der zum Fehler führte. Wenn der Debugger eine Meldung ausgibt, auf den Button Debuggen klicken, dann sollte die in Frage kommende Codezeile gelb markiert sein. Zum Beenden der Makroausführung auf das Stop-Symbol (blaues Quadrat) klicken. Danach am besten die Codezeile und die beiden Zellinhalte für Seriennummer und Wert hier posten.
Das im ersten Bild oben gezeigte Beispiel ist nur ein Ausschnitt, da es mehrere Exportierte Mails sind stehen davon natürlich
mehrere untereinander, meist so um die 30 Stück, wenn ich dich richtig verstanden habe müsste ich zur zeit noch für
jede Seriennummer die Prozedur "Anklicken + Makro starten" durchführen, kann das eventuell automatisch ablaufen?
Meinst Du jetzt damit, dass alle Mails auf einmal automatisch abgearbeitet werden sollen und einfach nur die Werte in Liste2 eingetragen werden sollen?mehrere untereinander, meist so um die 30 Stück, wenn ich dich richtig verstanden habe müsste ich zur zeit noch für
jede Seriennummer die Prozedur "Anklicken + Makro starten" durchführen, kann das eventuell automatisch ablaufen?
Gruß Dieter

Hallo Alex!
In Deinem Screenshot sehe ich gerade das sich das Modell in Spalte I und nicht in Spalte B befindet. Weil aktuell wird der Wert ja in Spalte B eingetragen, die jedoch nicht sichtbar ist. Wenn's jedoch Spalte I sein soll, dann die Konstante SpalteValue = "B" entsprechend ändern.
Wenn alle EMails automatisch erfasst und die Werte in Liste2 eingetragen werden sollen, wird der Auto-Filter natürlich deaktiviert. In diesem Fall habe ich leider keine Ahnung, welche Filter-Kriterien angewendet werden könnten
Gruß Dieter
In Deinem Screenshot sehe ich gerade das sich das Modell in Spalte I und nicht in Spalte B befindet. Weil aktuell wird der Wert ja in Spalte B eingetragen, die jedoch nicht sichtbar ist. Wenn's jedoch Spalte I sein soll, dann die Konstante SpalteValue = "B" entsprechend ändern.
Wenn alle EMails automatisch erfasst und die Werte in Liste2 eingetragen werden sollen, wird der Auto-Filter natürlich deaktiviert. In diesem Fall habe ich leider keine Ahnung, welche Filter-Kriterien angewendet werden könnten
Gruß Dieter

Hallo Alex!
Versuchs mal damit:
Gruß Dieter
Versuchs mal damit:
Option Explicit
Option Compare Text
Const Sheet1 = "Liste1" ' Tabellenname Liste 1
Const Sheet2 = "Liste2" ' Tabellenname Liste 2
Const SpalteSuchen = "A" ' Liste 2 Spalte Suchen
Const SpalteValue = "I" ' Liste 2 Spalte Wert
Const TextSN = "Device S/N:" ' Text mit Seriennummer
Const Msg0 = "Seriennummer ? nicht gefunden!"
Sub TestFindSerienNummer()
Dim List1 As Worksheet, Found As Range, Token As Variant, C As Range, SN As String, EndLine As Long
Set List1 = Sheets(Sheet1)
EndLine = Cells(Rows.Count, SpalteSuchen).End(xlUp).Row
For Each C In List1.Range(SpalteSuchen & "1:" & SpalteSuchen & EndLine)
If C Like "*" & TextSN & "*" Then
Token = Split(C, TextSN)
If UBound(Token) = 1 Then
SN = Trim(Token(1))
If SN <> "" Then
With Sheets(Sheet2)
.AutoFilterMode = False
Set Found = .Columns(SpalteSuchen).Find(SN, LookIn:=xlValues, LookAt:=xlWhole, MatchCase:=False)
If Not Found Is Nothing Then
Token = Split(List1.Cells(C.Row - 4, SpalteSuchen), ":")
If UBound(Token) > 0 Then
.Cells(Found.Row, SpalteValue) = Trim(Token(UBound(Token)))
End If
Else
MsgBox Replace(Msg0, "?", SN), vbInformation, "Suchen..."
End If
End With
End If
End If
End If
Next
End Sub
Gruß Dieter

Hallo Alex!
Mhm Sorry, lag vermutlich an der Codezeile 22 (geändert)?
Ersetze Deine alte Codezeile 22 durch die neu Codezeile 22
Gruß Dieter
Mhm Sorry, lag vermutlich an der Codezeile 22 (geändert)?
Ersetze Deine alte Codezeile 22 durch die neu Codezeile 22
Gruß Dieter

Hallo Alex!
In Punkto weitere Bestellungen, wäre zunächst zu klären, ob es sich in Spalte I um Zahlenwerte handelt, die addiert werden sollen oder um Text, der in Form "Text1, Text2, ..." eingetragen werden soll?
Desweiteren, ob die Inhalte der Spalte I beim Makrostart gelöscht werden sollen?
Den letzten Code habe ich zunächst insoweit geändert, dass die "empty"-Zeilen gelöscht werden.
Gruß Dieter
In Punkto weitere Bestellungen, wäre zunächst zu klären, ob es sich in Spalte I um Zahlenwerte handelt, die addiert werden sollen oder um Text, der in Form "Text1, Text2, ..." eingetragen werden soll?
Desweiteren, ob die Inhalte der Spalte I beim Makrostart gelöscht werden sollen?
Den letzten Code habe ich zunächst insoweit geändert, dass die "empty"-Zeilen gelöscht werden.
Option Explicit
Option Compare Text
Const Sheet1 = "Liste1" ' Tabellenname Liste 1
Const Sheet2 = "Liste2" ' Tabellenname Liste 2
Const SpalteSuchen = "A" ' Liste 2 Spalte Suchen
Const SpalteValue = "I" ' Liste 2 Spalte Wert
Const TextSN = "Device S/N:" ' Text mit Seriennummer
Const Msg0 = "Seriennummer ? nicht gefunden!"
Sub TestFindSerienNummer()
Dim List1 As Worksheet, Found As Range, Token As Variant, C As Range
Dim SN As String, EndLine As Long, i As Long
Set List1 = Sheets(Sheet1)
EndLine = List1.Cells(List1.Rows.Count, SpalteSuchen).End(xlUp).Row
For i = 1 To EndLine
If i > EndLine Then Exit For
If List1.Cells(i, "A") Like "empty*" Then
List1.Rows(i).Delete: i = i - 1: EndLine = EndLine - 1
End If
Next
For Each C In List1.Range(SpalteSuchen & "1:" & SpalteSuchen & EndLine)
If C Like "*" & TextSN & "*" Then
Token = Split(C, TextSN)
If UBound(Token) = 1 Then
SN = Trim(Token(1))
If SN <> "" Then
With Sheets(Sheet2)
.AutoFilterMode = False
Set Found = .Columns(SpalteSuchen).Find(SN, LookIn:=xlValues, LookAt:=xlWhole, MatchCase:=False)
If Not Found Is Nothing Then
Token = Split(List1.Cells(C.Row - 4, SpalteSuchen), ":")
If UBound(Token) > 0 Then
.Cells(Found.Row, SpalteValue) = Trim(Token(UBound(Token)))
End If
Else
MsgBox Replace(Msg0, "?", SN), vbInformation, "Suchen..."
End If
End With
End If
End If
End If
Next
End Sub
Gruß Dieter

Hallo Alex!
Ersetze im letzen Code die Codezeile 46 durch diese Codezeilen:
Gruß Dieter
Ersetze im letzen Code die Codezeile 46 durch diese Codezeilen:
With .Cells(Found.Row, SpalteValue)
If IsEmpty(.Value) Then
.Value = Trim(Token(UBound(Token)))
Else
.Value = .Value & " / " & Trim(Token(UBound(Token)))
End If
End With
Gruß Dieter

Hallo mr.lemon!
Tja, so ein Ärger
Was mir aber jetzt erst auffällt, sind die Bezeichnungen am Anfang jeder Zeile. Trifft es immer zu, dass die beiden Dinge mit 8. und 12. gekennzeichnet sind?
Und/Oder enthält dieser Zeile immer den Text "*End Supply Type: Leer:"?
Gruß Dieter
Tja, so ein Ärger
Was mir aber jetzt erst auffällt, sind die Bezeichnungen am Anfang jeder Zeile. Trifft es immer zu, dass die beiden Dinge mit 8. und 12. gekennzeichnet sind?
Und/Oder enthält dieser Zeile immer den Text "*End Supply Type: Leer:"?
Gruß Dieter

Hallo!
Dann sollte es jetzt damit funktionieren:
Und wenn es zur Zufriedenheit funktioniert, dann könntest Du den Beitrag noch als Gelöst markieren
Gruß Dieter
[edit] Zusätzlicher Test Anzahl der eingelesenen Einträge = 0 und AutoFilter mit eingefügt [/edit]
Dann sollte es jetzt damit funktionieren:
Option Explicit
Option Compare Text
Const Sheet1 = "Liste1" 'Tabellenname Liste 1
Const Sheet2 = "Liste2" 'Tabellenname Liste 2
Const SpalteSuchen = "A" 'Liste 2 Spalte Suchen
Const SpalteValue = "I" 'Liste 2 Spalte Wert
Const TextSN = "*Device S/N:*" 'Text mit Seriennummer
Const TextTY = "*End Supply Type:*" 'Text mit Type
Const Msg0 = "Die Aktion wurde aufgrund eines Fehlers abgebrochen!"
Const Msg1 = "Seriennummer ? nicht gefunden!"
Sub FindSerienNummer3()
Dim List1 As Worksheet, Token As Variant, SN() As String, TY() As String
Dim Found As Range, C As Range, EndLine As Long, i As Long, x1 As Long, x2 As Long
Set List1 = Sheets(Sheet1)
EndLine = List1.Cells(List1.Rows.Count, SpalteSuchen).End(xlUp).Row
For Each C In List1.Range(SpalteSuchen & "1:" & SpalteSuchen & EndLine)
If C Like TextSN Then
Token = Split(C, ":")
ReDim Preserve SN(x1) As String: SN(x1) = Trim(Token(UBound(Token))): x1 = x1 + 1
ElseIf C Like TextTY Then
Token = Split(C, ":")
ReDim Preserve TY(x2) As String: TY(x2) = Trim(Token(UBound(Token))): x2 = x2 + 1
End If
Next
If x1 = 0 Or x1 <> x2 Then MsgBox Msg0, vbExclamation, "Daten einlesen...": Exit Sub
With Sheets(Sheet2)
.AutoFilterMode = False
For i = 0 To UBound(SN)
If SN(i) <> "" Then
Set Found = .Columns(SpalteSuchen).Find(SN(i), LookIn:=xlValues, LookAt:=xlWhole, MatchCase:=False)
If Not Found Is Nothing Then
With .Cells(Found.Row, SpalteValue)
If IsEmpty(.Value) Then .Value = TY(i) Else .Value = .Value & " / " & TY(i)
End With
Else
MsgBox Replace(Msg1, "?", SN(i)), vbInformation, "Suchen..."
End If
End If
Next
.Range("A1:K1").AutoFilter
End With
MsgBox "Fertig!", vbInformation, "Meldung"
End Sub
Gruß Dieter
[edit] Zusätzlicher Test Anzahl der eingelesenen Einträge = 0 und AutoFilter mit eingefügt [/edit]

Hallo Alex!
Den letzten Code, habe ich aus diesem Grunde nochmals geändert, wobei jeweils der Mindest-Text von Codezeile 10 und 11 (ohne *) in den Zellen vorhanden sein muss.
Also, versuchs nochmal!
Gruß Dieter
Zitat von @mr.lemon:
leider gibt das Makro gleich beim starten die von dir eingetragene Msg0 "Die Aktion wurde aufgrund eines Fehlers
abgebrochen!" aus
Diesen Schutz habe ich eingebaut, um sicherzustellen, dass die erfassten Einträge von "Device.." und "End Supply.." zahlenmäßig gleich sind. Ich vermute, dass die Zeilen mit "End Supply.." nicht immer 2 Doppelpunkte beinhalten oder nicht bis zum 2. Doppelpunkt identisch sind (keine Ahnung?).leider gibt das Makro gleich beim starten die von dir eingetragene Msg0 "Die Aktion wurde aufgrund eines Fehlers
abgebrochen!" aus
Den letzten Code, habe ich aus diesem Grunde nochmals geändert, wobei jeweils der Mindest-Text von Codezeile 10 und 11 (ohne *) in den Zellen vorhanden sein muss.
Also, versuchs nochmal!
Der Autofilter müsste am Ende in Liste 2 von Spalte A bis K gesetzt werden.
In welcher Zeile?Gruß Dieter

Hallo Alex!
Das funktioniert so nicht. Der Fehler kommt, weil nichts eingelesen wurde. Hab's ich im Code schonmal geändert, sodass auch in diesem Fall die Fehlermeldung ausgegeben wird.
Teste also bitte nochmal mit meinem Original-Skript.
Du kannst in dem betreffenden Sheet auch erstmal mit der normalen Such-Funktion nach diesen beiden Begriffen "Device S/N:" und "End Supply Type:" suchen lassen. Mit "Alle suchen", sollten die beiden Suchbegriffe Anzahlmäßig übereinstimmen.
Für die Codezeilen 10 und 11, so wie ich es formuliert habe, ist nur wichtig, das zumindest der Text (ohne die Wildcards*) in den Zellen enthalten sein muss. Die (*) am Anfang und Ende bedeuten, dass der davor- und danachstehende Text variable sein darf/muss (z.B. unterschiedliche Seriennummern), ebenso wird nicht zwischen Klein/Großschreibung unterschieden.
Den AutoFilter habe ich ebenfalls in den letzten Code mit eingefügt
Gruß Dieter
Das funktioniert so nicht. Der Fehler kommt, weil nichts eingelesen wurde. Hab's ich im Code schonmal geändert, sodass auch in diesem Fall die Fehlermeldung ausgegeben wird.
Teste also bitte nochmal mit meinem Original-Skript.
Du kannst in dem betreffenden Sheet auch erstmal mit der normalen Such-Funktion nach diesen beiden Begriffen "Device S/N:" und "End Supply Type:" suchen lassen. Mit "Alle suchen", sollten die beiden Suchbegriffe Anzahlmäßig übereinstimmen.
Für die Codezeilen 10 und 11, so wie ich es formuliert habe, ist nur wichtig, das zumindest der Text (ohne die Wildcards*) in den Zellen enthalten sein muss. Die (*) am Anfang und Ende bedeuten, dass der davor- und danachstehende Text variable sein darf/muss (z.B. unterschiedliche Seriennummern), ebenso wird nicht zwischen Klein/Großschreibung unterschieden.
Den AutoFilter habe ich ebenfalls in den letzten Code mit eingefügt
Gruß Dieter