Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Vlookup, wenn nicht gefunden...

Forumthread: Vlookup, wenn nicht gefunden...

Vlookup, wenn nicht gefunden...
21.02.2018 11:12:19
Burak
Moin Moin,
also mein makro ermittelt über SVerweis aus einer zweispaltigen Liste den zugehörigen Wert zu jedem Barcode aus mehreren Tabellen.
Gelegentlich kommt ein Barcode vor, der in der zweispaltigen Liste (noch) nicht vorhanden ist, dann läuft das Makro in Error.
Bisher waren es immer Barcodes die mit einer 9 geendet haben. Dies habe ich über Modulo und Rest 9 rausgefiltert.
Jetzt kommen auch Barcodes mit einer 8 am Ende, die nicht in der Liste sind. Dies kann ich nicht über Modulo machen, da es Barcodes in der Liste gibt die mit einer 8 enden.
Mein Wunsch wäre es, dass er in der Schleife, wenn er den Barcode in der Liste nicht findet, einfach zum nächsten Barcode bzw. nächsten Step der Schleife springen soll.
Im optimalen Fall diesen nicht gefundenen Barcode iwo auflisten.
Die BarcodeListe sieht ungefähr so aus:
BarcodeLPMatrix

 AB
1CodeLP-Nutzen
211901
312701
412906
515001
615101
716102
816112
916122
1016132
1116282
1217301

Eine Beispieltabelle mit den Barcodes:
Hilfstabelle

 ABCDEF
1BarcodeMasterbarcodeSchichtLP NutzenDatumUhrzeit
211901190035347FS115.01.201806:27:25
311901190035345FS115.01.201806:27:43
411901190035343FS115.01.201806:28:09
511901190035340FS115.01.201806:28:40
677607760815533FS415.01.201813:14:24
777607760815745FS415.01.201813:14:49
877607760815729FS415.01.201813:15:15
977607760815489FS415.01.201813:15:42
1077607760815493FS415.01.201813:16:10
1177607760815497FS415.01.201813:18:45
1234303430126543SS615.01.201817:08:39
1334303430126537SS615.01.201817:09:47
1434303430126531SS615.01.201817:11:14
1534303430126525SS615.01.201817:12:07

Der Code:
Sub Ruestwechsel()
'Deklarationen der Variablen
Dim cntr As Long, c As Range, i As Long, Zeilenzahl As Long, Zeilenzahl2 As Long
Dim startdatum As Date, enddatum As Date, d As Variant, j As Long, n
Dim Summe, loLetzte As Long, loSpalte, pctCompl As Integer
'Gesuchtes Datum eingeben
startdatum = InputBox("Bitte gib ein Startdatum ein:")
enddatum = InputBox("Bitte gib ein Enddatum ein:")
Worksheets("Hilfstabelle").Cells.Clear
Worksheets("Linienauswertung - Grafiken").Cells.Clear
'Alle 5 Linien
For i = 2 To 6
With Worksheets("R" & i - 1)
'Rüstwechsel in Nachtschicht zählen und ausgeben
cntr = 0
For Each c In .Range("F3:F" & .Cells(.Rows.Count, 6).End(xlUp).Row)
If (c.Value = "NS" And c.Offset(, -5).Value  c.Offset(-1, -5).Value And c.Offset(, 7). _
Value >= startdatum And c.Offset(, 7).Value = 0.91666) Or (c.Value = "NS" And c.Offset(, -5).Value  c.Offset(-1, -5).Value And c.Offset(, 7).Value > startdatum And c.Offset(, 7).Value  c.Offset(-1, -5).Value And c.Offset(, 7). _
Value >= startdatum And c.Offset(, 7).Value  c.Offset(-1, -5).Value And c.Offset(, 7). _
Value >= startdatum And c.Offset(, 7).Value = startdatum And .Cells(n, 13). _
Value  .Cells(n - 1, 1).Value Then
Summe = Summe + .Cells(n, 5).Value
End If
Next n
'Summierte Rüstzeiten in Ausgabeblatt schreiben
Worksheets("Linienauswertung - Grafiken").Range("B" & i + 7).Value = Summe
'Spätschicht
Summe = 0
For n = 3 To .Cells(Rows.Count, 5).End(xlUp).Row
If .Cells(n, 6).Value = "SS" And .Cells(n, 13).Value >= startdatum And .Cells(n, 13). _
Value  .Cells(n - 1, 1).Value Then
Summe = Summe + .Cells(n, 5).Value
End If
Next n
'Summierte Rüstzeiten in Ausgabeblatt schreiben
Worksheets("Linienauswertung - Grafiken").Range("C" & i + 7).Value = Summe
'Nachtschicht
Summe = 0
For n = 3 To .Cells(Rows.Count, 5).End(xlUp).Row
If (.Cells(n, 14).Value > 0.9166666 And .Cells(n, 1).Value  .Cells(n - 1, 1).Value  _
And .Cells(n, 13).Value >= startdatum And .Cells(n, 13).Value  .Cells(n - 1, 1).Value And .Cells(n, 13).Value > startdatum And .Cells(n, 13).Value  "" Then
'Datum außerhalb Einträge entfernen
If .Range("E" & j).Value  enddatum + 1 Then
.Rows(j).Delete
j = j - 1
'Einträge vor der ersten Frühschicht entfernen
ElseIf .Range("E" & j).Value = startdatum And .Range("F" & j).Value = 0.25 Then
.Rows(j).Delete
j = j - 1
End If
End If
Next j
'Doppelte Einträge entfernen
With Worksheets("Hilfstabelle")
'Letzte Zeile ermitteln
loLetzte = .Cells(.Rows.Count, 2).End(xlUp).Row
'Letzte Spalte ermitteln
loSpalte = .Cells(2, .Columns.Count).End(xlToLeft).Column + 1
.Range(.Cells(2, loSpalte), .Cells(loLetzte, loSpalte)).FormulaLocal = "=WENN(B1=B2;0; _
ZEILE())"
.Range(.Cells(1, loSpalte), .Cells(loLetzte, loSpalte)).Value = .Range(.Cells(1,  _
loSpalte), .Cells(loLetzte, loSpalte)).Value
.Cells(1, loSpalte) = 0
.Range(.Cells(1, 1), .Cells(loLetzte, loSpalte)).RemoveDuplicates Columns:=loSpalte,  _
Header:=xlNo
'Zellinhalte löschen
.Columns(loSpalte).ClearContents
End With
'Barcode aus Masterbarcode rauskopieren
Zeilenzahl = .Range("B1").CurrentRegion.Rows.Count
For Each d In .Range("B2:B" & Zeilenzahl)
If Len(d.Value) > 0 Then
.Cells(d.Row, 1).Value = Left(d.Value, 4)
End If
Next
'SVerweis über Barcode für "LP Nutzen" aus BarcodeLPMatrix
For j = 2 To Zeilenzahl
.Range("D" & j).Value = Application.WorksheetFunction.VLookup(.Range("A" & j).Value,  _
Worksheets("BarcodeLPMatrix").Range("A2:B146"), 2, False)
Next j
'Überschriften setzen
.Range("A1").Value = "Barcode"
.Range("D1").Value = "LP Nutzen"
'Überschriften Fettdruck
.Rows(1).Font.Bold = True
End With
'Zeilen zählen
Zeilenzahl = Worksheets("Hilfstabelle").Range("A1").CurrentRegion.Rows.Count
With Worksheets("Hilfstabelle")
'Leiterplatten zählen und eintragen
Worksheets("Linienauswertung - Grafiken").Range("B" & i + 14).Value = Application.SumIf(. _
Range("C2:C" & Zeilenzahl), "FS", .Range("D2:D" & Zeilenzahl))
Worksheets("Linienauswertung - Grafiken").Range("C" & i + 14).Value = Application.SumIf(. _
Range("C2:C" & Zeilenzahl), "SS", .Range("D2:D" & Zeilenzahl))
Worksheets("Linienauswertung - Grafiken").Range("D" & i + 14).Value = Application.SumIf(. _
Range("C2:C" & Zeilenzahl), "NS", .Range("D2:D" & Zeilenzahl))
'Nutzen zählen und eintragen
Worksheets("Linienauswertung - Grafiken").Range("B" & i + 21).Value = WorksheetFunction. _
CountIfs(.Range("C2:C" & Zeilenzahl), "FS")
Worksheets("Linienauswertung - Grafiken").Range("C" & i + 21).Value = WorksheetFunction. _
CountIfs(.Range("C2:C" & Zeilenzahl), "SS")
Worksheets("Linienauswertung - Grafiken").Range("D" & i + 21).Value = WorksheetFunction. _
CountIfs(.Range("C2:C" & Zeilenzahl), "NS")
End With
'Mikrostörungen zählen
With Worksheets("Mikrostörungen - Daten")
Zeilenzahl = Zeilenzahl2
Zeilenzahl2 = .Range("B" & Zeilenzahl2 + 4).End(xlDown).Row
Worksheets("Linienauswertung - Grafiken").Range("B" & i + 28).Value = WorksheetFunction. _
CountIfs(.Range("F" & Zeilenzahl + 1 & ":F" & Zeilenzahl2), "FS")
Worksheets("Linienauswertung - Grafiken").Range("C" & i + 28).Value = WorksheetFunction. _
CountIfs(.Range("F" & Zeilenzahl + 1 & ":F" & Zeilenzahl2), "SS")
Worksheets("Linienauswertung - Grafiken").Range("D" & i + 28).Value = WorksheetFunction. _
CountIfs(.Range("F" & Zeilenzahl + 1 & ":F" & Zeilenzahl2), "NS")
End With
Next i
Zeilenzahl = 0
Zeilenzahl2 = 0
With Worksheets("Linienauswertung - Grafiken")
For i = 2 To 6
'Störungen zählen
With Worksheets("Störungen - Daten")
Zeilenzahl = Zeilenzahl2
Zeilenzahl2 = .Range("B" & Zeilenzahl2 + 4).End(xlDown).Row
Worksheets("Linienauswertung - Grafiken").Range("B" & i + 35).Value = WorksheetFunction. _
CountIfs(.Range("F" & Zeilenzahl + 1 & ":F" & Zeilenzahl2), "FS")
Worksheets("Linienauswertung - Grafiken").Range("C" & i + 35).Value = WorksheetFunction. _
CountIfs(.Range("F" & Zeilenzahl + 1 & ":F" & Zeilenzahl2), "SS")
Worksheets("Linienauswertung - Grafiken").Range("D" & i + 35).Value = WorksheetFunction. _
CountIfs(.Range("F" & Zeilenzahl + 1 & ":F" & Zeilenzahl2), "NS")
End With
'Linienbezeichnungen eintragen
.Range("A" & i).Value = "R" & i - 1
.Range("A" & i + 7).Value = "R" & i - 1
.Range("A" & i + 14).Value = "R" & i - 1
.Range("A" & i + 21).Value = "R" & i - 1
.Range("A" & i + 28).Value = "R" & i - 1
.Range("A" & i + 35).Value = "R" & i - 1
'Tagesmengen summieren
.Range("E" & i + 14).Value = .Range("B" & i + 14).Value + .Range("C" & i + 14).Value + . _
Range("D" & i + 14).Value
.Range("E" & i + 21).Value = .Range("B" & i + 21).Value + .Range("C" & i + 21).Value + . _
Range("D" & i + 21).Value
Next i
'Tabellenbezeichnungen eintragen
.Range("A1").Value = "Rüstwechsel"
.Range("A8").Value = "Rüstwechselzeiten"
.Range("A15").Value = "Gesamtleistung LP"
.Range("A22").Value = "Gesamtleistung Nutzen"
.Range("A29").Value = "Mikrostörungen"
.Range("A36").Value = "Störungen"
'Datum eintragen
If startdatum  enddatum Then
.Range("F8").Value = startdatum
.Range("G8").Value = "-"
.Range("H8").Value = enddatum
Else
.Range("F8").Value = startdatum
End If
'Schichten eintragen
.Range("B1").Value = "Frühschicht"
.Range("C1").Value = "Spätschicht"
.Range("D1").Value = "Nachtschicht"
.Range("B8").Value = "Frühschicht"
.Range("C8").Value = "Spätschicht"
.Range("D8").Value = "Nachtschicht"
.Range("B15").Value = "Frühschicht"
.Range("C15").Value = "Spätschicht"
.Range("D15").Value = "Nachtschicht"
.Range("E15").Value = "Tagesmenge"
.Range("B22").Value = "Frühschicht"
.Range("C22").Value = "Spätschicht"
.Range("D22").Value = "Nachtschicht"
.Range("E22").Value = "Tagesmenge"
.Range("B29").Value = "Frühschicht"
.Range("C29").Value = "Spätschicht"
.Range("D29").Value = "Nachtschicht"
.Range("B36").Value = "Frühschicht"
.Range("C36").Value = "Spätschicht"
.Range("D36").Value = "Nachtschicht"
'Spaltebreiten
.Columns("A:A").ColumnWidth = 21
.Columns("B:E").ColumnWidth = 13
'Tabellenüberschriften Fettdruck
.Rows(1).Font.Bold = True
.Rows(8).Font.Bold = True
.Rows(15).Font.Bold = True
.Rows(22).Font.Bold = True
.Rows(29).Font.Bold = True
.Rows(36).Font.Bold = True
End With
End Sub
Das Vlookup:

'SVerweis über Barcode für "LP Nutzen" aus BarcodeLPMatrix
With Worksheets("Hilfstabelle")
For j = 2 To Zeilenzahl
.Range("D" & j).Value = Application.WorksheetFunction.VLookup(.Range("A" & j).Value, Worksheets( _
"BarcodeLPMatrix").Range("A2:B146"), 2, False)
Next j
End With
Nur übersichtlichkeitshalber:
Die Barcodeliste befindet sich auf dem Tabellenblatt
"BarcodeLPMatrix"
Daten mit den Barcodes werden aus den folgenden 5 Tabellenblättern
"R1", "R2", "R3", "R4" und "R5"
in das Tabellenblatt
"Hilfstabelle"
kopiert und ausgewertet.
Vielen Dank im Voraus!
Anzeige

6
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
und? sollen wir das jetzt nachbauen? (owT)
21.02.2018 11:39:53
EtoPHG

AW: und? sollen wir das jetzt nachbauen? (owT)
21.02.2018 11:43:32
Burak
letzten Endes fehlt da ja nur ein Vlookup; IfNotMatch then next j, oder sehe ich das falsch?
AW: Vlookup, wenn nicht gefunden...
21.02.2018 11:44:48
UweD
Hallo
dann prüfe das vorher..
    Dim WF
    Set WF = Application.WorksheetFunction
    'SVerweis über Barcode für "LP Nutzen" aus BarcodeLPMatrix 
    With Worksheets("Hilfstabelle")
        For j = 2 To Zeilenzahl
            If WF.CountIf(Worksheets("BarcodeLPMatrix").Range("A2:A146"), .Range("D" & j).Value) > 0 Then
                .Range("D" & j).Value = WF.VLookup(.Range("A" & j).Value, Worksheets( _
                    "BarcodeLPMatrix").Range("A2:B146"), 2, False)
            End If
        Next j
    End With

Anzeige
AW: Vlookup, wenn nicht gefunden...
21.02.2018 12:20:39
Burak
Ein Fehler kriege ich nicht mehr, aber dafür sind einige Ergebnisse verfälscht (Nullen).
Hier ein kleiner Beispielausschnitt ohne Makros etc.:
https://www.herber.de/bbs/user/119967.xlsx
Vllt hilft das etwas weiter.
AW: Vlookup, wenn nicht gefunden...
21.02.2018 12:19:53
Rudi
Hallo,
nimm statt WorksheetFunktion.VLookup besser Application.Vlookup. Das liefert einen Fehlerwert, erzeugt aber keinen Fehler.
Schema:
Dim vntRet as Variant
'Code
vntRet= Application.Vlookup(......)
if Not IsError(vntRet) Then
'mach was
End If
Gruß
Rudi
Anzeige
AW: Vlookup, wenn nicht gefunden...
21.02.2018 13:13:42
Burak
Super! habe noch hinzugefügt, dass er bei Error eine 0 reinschreiben soll, damit SumIf kein ErrorWert ausgibt und jetzt funktioniert es. Danke dir und Danke auch an alle anderen :*
;
Anzeige

Infobox / Tutorial

Vlookup in VBA: Fehlerbehebung und Optimierung


Schritt-für-Schritt-Anleitung

  1. Code Vorbereitung: Stelle sicher, dass Du den bestehenden VBA-Code für die Verarbeitung Deiner Barcodes hast. Dieser sollte bereits eine Schleife enthalten, die durch die Barcodes iteriert.

  2. Vlookup Implementierung: Ersetze die Standard VLookup Funktion durch Application.VLookup, um Fehler zu vermeiden. Dies ermöglicht es Dir, den Fehlerstatus abzufangen.

    Dim vntRet As Variant
    vntRet = Application.VLookup(.Range("A" & j).Value, Worksheets("BarcodeLPMatrix").Range("A2:B146"), 2, False)
    If Not IsError(vntRet) Then
       .Range("D" & j).Value = vntRet
    Else
       .Range("D" & j).Value = 0 ' Setze 0 bei Fehler
    End If
  3. Fehlerbehandlung einfügen: Füge Fehlerprüfungen in Deine Schleife ein, um sicherzustellen, dass Du bei nicht gefundenen Werten einfach zur nächsten Iteration übergehst.


Häufige Fehler und Lösungen

  • Fehler: VLookup gibt einen Fehler zurück: Wenn Du WorksheetFunction.VLookup verwendest, kann es bei nicht gefundenen Werten zu einem Fehler kommen. Wechsel zu Application.VLookup und überprüfe auf Fehler mit IsError.

  • Problem mit Nullwerten: Wenn ein Barcode nicht gefunden wird und Du dies nicht abfängst, kann dies zu fehlerhaften Berechnungen führen. Setze im Fehlerfall einfach eine 0.

  • Einträge werden nicht gefunden: Manchmal kann es vorkommen, dass die Barcodes nicht im richtigen Format vorliegen. Stelle sicher, dass die Barcodes in beiden Tabellenblättern (Hilfstabelle und BarcodeLPMatrix) dasselbe Format haben.


Alternative Methoden

Eine Alternative zur Verwendung von VLookup ist die Verwendung einer Kombination aus Match und Index. Diese Methode kann flexibler sein und ermöglicht eine bessere Fehlerbehandlung.

Dim matchIndex As Variant
matchIndex = Application.Match(.Range("A" & j).Value, Worksheets("BarcodeLPMatrix").Range("A2:A146"), 0)
If Not IsError(matchIndex) Then
    .Range("D" & j).Value = Worksheets("BarcodeLPMatrix").Cells(matchIndex + 1, 2).Value
Else
    .Range("D" & j).Value = 0
End If

Praktische Beispiele

Hier ist ein einfaches Beispiel, das zeigt, wie Du die VLookup-Funktion in einer Schleife implementieren kannst:

Sub BeispielVLookup()
    Dim ws As Worksheet
    Dim i As Long
    Set ws = ThisWorkbook.Worksheets("Hilfstabelle")

    For i = 2 To ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
        Dim vntRet As Variant
        vntRet = Application.VLookup(ws.Cells(i, 1).Value, Worksheets("BarcodeLPMatrix").Range("A2:B146"), 2, False)
        If Not IsError(vntRet) Then
            ws.Cells(i, 4).Value = vntRet
        Else
            ws.Cells(i, 4).Value = 0
        End If
    Next i
End Sub

Tipps für Profis

  • Verwende Option Explicit am Anfang Deines Moduls, um sicherzustellen, dass alle Variablen deklariert sind. Dies hilft, Fehler frühzeitig zu erkennen.

  • Dokumentiere Deinen Code gut, um die Nachverfolgbarkeit zu gewährleisten. Kommentare sind besonders hilfreich, wenn andere Deinen Code verwenden.

  • Teste den Code in einer sicheren Umgebung, um sicherzustellen, dass alle Fehler behandelt werden, bevor Du ihn in einer Produktionsumgebung verwendest.


FAQ: Häufige Fragen

1. Was ist der Unterschied zwischen WorksheetFunction.VLookup und Application.VLookup?
WorksheetFunction.VLookup gibt einen Fehler zurück, wenn der gesuchte Wert nicht gefunden wird, während Application.VLookup einen Fehlerwert zurückgibt, den Du abfangen kannst.

2. Wie kann ich sicherstellen, dass alle Barcodes korrekt verarbeitet werden?
Verwende Fehlerprüfungen wie IsError und setze Standardwerte (wie 0), um sicherzustellen, dass Deine Berechnungen nicht unterbrochen werden.

3. Gibt es eine Möglichkeit, nicht gefundene Barcodes aufzulisten?
Ja, Du kannst eine zusätzliche Sammlung oder ein Array verwenden, um die nicht gefundenen Barcodes zu speichern und sie am Ende Deiner Schleife anzuzeigen oder zu protokollieren.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige