Clever-Excel-Forum

Normale Version: Excel VBA VLookup
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Seiten: 1 2 3
Hallo zusammen,
in einem Makro möchte ich an einer Stelle eine "VLookUp-Funktion verwenden".
Es wird die Materialeigenschaften von einem Bauteil überpürft. Jedes Bauteil besteht mindestens aus einem Material (Spalte 3). Optional können noch zwei weitere Materialien (Spalte 8 & 9) Bestandteil von dem Bauteil sein.
In meiner Prozedur wird überpürft ob das Material eine bestimmte eigenschaft hat ("x"). Hierzu verwende ich die VLookUp- Funktion. Mit dieser wird in ein anderes Tabelenblatt gesehen und geschaut was hier beim zutreffenden Material in der Spalte 11 steht.
Steht in der Spalte 11 bei diesem Material kein "x" muss ein bestimmtes Maß abgezogen werden.

Soweit der Plan. Ich konnte ihn auch schon fast umsetzten. Lediglich bei der Überprüfung der Materialien in der Spalte 8 & 9 komme ich nicht weiter. Das Problem ist das hier nicht immer ein Inhalt drinen ist. Wenn der Inhalt leer ist, bekomme ich den Laufzeitfehler 1004 ausgegeben.

Könnt Ihr mir weiterhelfen wie ich die Formel schreiben muss dass ich dieses Problem umgehen kann?


        If CDec(Mid(Cells(LA, 12), InStrRev(Cells(LA, 12), "X") + 1)) > Range("Max_Fügemaß") Or _
        (WorksheetFunction.VLookup(Sheets("zwischenablage").Cells(LA, 3), Sheets("Lager").[A2:K1048576], 11, False) <> "x") Or _
        (WorksheetFunction.VLookup(Sheets("zwischenablage").Cells(LA, 8), Sheets("Lager").[A2:K1048576], 11, False) <> "x") Or _
        (WorksheetFunction.VLookup(Sheets("zwischenablage").Cells(LA, 9), Sheets("Lager").[A2:K1048576], 11, False) <> "x") Then
        Cells(LA, 19).Value = Cells(LA, 19) - Mid(Cells(LA, 12), InStrRev(Cells(LA, 12), "X") + 1)
        End If

Solltet ihr eine Beispieldatei benötigen, gebt mir Bescheid, dann werde ich eine erstellen und hochladen.

Es würde mich freuen wenn Ihr mir unter die Arme helfen könntet.


Viele Grüße Flo
Schema: 
Dim vRet as Vatiant
vRet = Application.Vlookup(…). 
If Iserror(vRet) then…

Niemals Worksheetfunction.Vlookup() verwenden, wenn du Fehler auswerten können willst.
Hallo EarlFred,
danke für deine Antwort. Ich werde Worksheetfunction durch Application ersetzen.

Wie soll ich dann nach "If Iserror(vRet) then…" weiter machen? Es bedeutet ja das eine andere Funktion erfolgen soll wenn ein Fehler kommt. Sollte dann die selbe funktion nochmals ausgeführt werden?
Hallo EarlFred,
ich habe es mir nochmal angesehen und versucht zu verarbeiten. Es kommt aber Laufzeitfehler 13. An was kann das liegen.




    Dim LA As Integer
    For LA = Cells(Rows.Count, 5).End(xlUp).Row To 1 Step -1
    Dim vRetP As Variant
    Dim vRetBI As Variant
    Dim vRetBA As Variant
    vRetP = Application.VLookup(Sheets("zwischenablage").Cells(LA, 3), Sheets("Lager").[A2:K1048576], 11, False)
    vRetBI = Application.VLookup(Sheets("zwischenablage").Cells(LA, 9), Sheets("Lager").[A2:K1048576], 11, False)
    vRetBA = Application.VLookup(Sheets("zwischenablage").Cells(LA, 8), Sheets("Lager").[A2:K1048576], 11, False)




    If Left(Cells(LA, 12).Value, 3) = "KA_" Then
        If CDec(Mid(Cells(LA, 12), InStrRev(Cells(LA, 12), "X") + 1)) > Range("Max_Fügemaß") Or IsError(vRetP) <> "x" Or IsError(vRetBI) <> "x" Or IsError(vRetBA) <> "x" Then
        Cells(LA, 19).Value = Cells(LA, 19) - Mid(Cells(LA, 12), InStrRev(Cells(LA, 12), "X") + 1)
        End If
    End If


Wäre Super wenn du mir weiter helfen könntest.
(28.11.2022, 08:20)legiminator schrieb: [ -> ]Wie soll ich dann nach "If Iserror(vRet) then…" weiter machen? 
Das kann ich dir nicht sagen, da deine Aufgabenbeschreibung unvollständig ist. 

Zitat:Es kommt aber Laufzeitfehler 13. An was kann das liegen.
 IsError(vRetP) <> "x"  ergibt doch keinen Sinn! IsError liefert WAHR oder FALSCH, das kann man nicht mit "x" vergleichen. Was soll da rauskommen?

Wenn IsError() = WAHR liefert, wird der gesuchte Wert durch VLookUp nicht gefunden, d. h. er existiert nicht. Was dann passieren muss, weißt nur du - siehe vor.

(28.11.2022, 06:45)legiminator schrieb: [ -> ]In meiner Prozedur wird überpürft ob das Material eine bestimmte eigenschaft hat ("x"). Hierzu verwende ich die VLookUp- Funktion. Mit dieser wird in ein anderes Tabelenblatt gesehen und geschaut was hier beim zutreffenden Material in der Spalte 11 steht.
Steht in der Spalte 11 bei diesem Material kein "x" muss ein bestimmtes Maß abgezogen werden.
Was soll passieren, wenn das Material NICHT in der Liste existiert? ?

Zitat:Wenn der Inhalt leer ist, bekomme ich den Laufzeitfehler 1004 ausgegeben.
Und was soll stattdessen passieren? Wie du den Fehler abfangen und behandeln kannst, weiß du doch nun schon.
(28.11.2022, 06:45)legiminator schrieb: [ -> ]Solltet ihr eine Beispieldatei benötigen, gebt mir Bescheid, dann werde ich eine erstellen und hochladen.

Bescheid!
Hallo EarlFred,
anbei das Muster.

Beginn der Prozedur ist das überprüft wird ob der Wert in Spalte 12 eine Kante ist. Dies ist daran zu erkennen das bei einer Kante im Kurzzeichen die ersten drei Buchstaben "KA_" lauten.
Das hat soweit nichts mit dem Problem zu tun.

Bei den nächsten drei Schritten wird es interesant.

Hier soll überprüft werden ob das eingesetzte Material (In Spalte 3, 8 & 9) die Eigenschaft "x" hat.
Ob ein Material die Eingenschaft "x" hat findet man in dem Arbeitsblatt "Lager" hier steht "x" in der Spalte 11.

Wenn eines der drei Materialien kein "x" hat, soll der Wert von Spalte 12 aus dem Arbeirtsblatt "zwischenablage" abgezogen werde. (Von dem Wert dann nur die Zeichenfolge nach den Unterstrich)

Soweit  mal die Idee.


Zitat:Und was soll stattdessen passieren? Wie du den Fehler abfangen und behandeln kannst, weiß du doch nun schon.
Am liebsten wäre es mir das er den Fehler ignoriert und gleich mit der Nächsten Zeile bei der Prüfung weiter macht.

Sollte in der Spalte 8 oder 9 kein Inhalt sein, muss nichts gemacht werden. Nur wenn ein Inhalt drinnen steht muss diesers überprüft werden.

Ich hoffe zusammen mit der Musterdatei kannst du meinen Gedankengängen folgen?

gruß Flo
(28.11.2022, 09:31)EarlFred schrieb: [ -> ]Was soll passieren, wenn das Material NICHT in der Liste existiert?
Erbitte erneut eine Antwort.

(28.11.2022, 10:08)legiminator schrieb: [ -> ]Ich hoffe zusammen mit der Musterdatei kannst du meinen Gedankengängen folgen?
Das, was klar ist, musstest du nicht noch einmal erläutern. Das, was NICHT klar ist, das wäre eine Erläuterung wert.

Letzte (leicht abgewandelte) Idee meinerseits, dann hast du genügend Handwerkszeug für alle Möglichkeiten:
Code:
Dim suche As Variant: suche = 3
Dim vRet As Variant

vRet = Application.IfError(Application.VLookup(suche, Range("A1:B6"), 2, False), "x")
If vRet <> "x" Then
   MsgBox "kein x"
Else
   MsgBox "x"
End If
Wenn das Material suche in der zu durchsuchenden Liste existiert, wird der Zellwert der betreffenden Spalte ausgegeben. Wenn das Material nicht existiert, wird ein "x" zurückgegeben. Das führt dazu, dass beim Fehlen des Materials kein Abzug vorgenommen wird. Aber ob das sinnvoll ist, ein fehlendes Material einfach zu ignorieren (es genügt da schon eine falsche Schreibweise oder ein unbeabsichtigtes Leerzeichen am Ende!), musst du bitte selbst entscheiden. 

Das kannst du nun nach Belieben deinen Wünschen entsprechend anpassen.

(28.11.2022, 10:08)legiminator schrieb: [ -> ]Ich hoffe zusammen mit der Musterdatei kannst du meinen Gedankengängen folgen?
Ich brauche kein Muster, habe nicht danach gefragt und schaue es mir nicht an. Die Logik suche ich mir auch nicht aus, die lieferst du bitte ordentlich verbal ab, wie ich nun schon mehrfach gebeten habe.
Hallo EarlFred,


Zitat:Was soll passieren, wenn das Material NICHT in der Liste existiert?


Gute Frage. Der Ablauf sollte weiter laufen. Es wäre aber sehr gut wenn eine MsgBox aufblinkt in der das flasch geschriebene Material steht.

Danke für deinen Code.
Ich habe mich vermutlich falsch ausgedrückt. Es gibt materialien welche ich mit einem bestimmten Werkzeug bearbeiten kann (Fügen) oder nicht. Kann ich das Material nicht bearbeiten (das "x" fehlt) muss das Maß vom Außenmaß abgezogen werden.

Code:
Dim LA As Integer
    For LA = Cells(Rows.Count, 5).End(xlUp).Row To 1 Step -1
    Dim vRetP As Variant
    Dim vRetBI As Variant
    Dim vRetBA As Variant
    Dim suche3 As Variant: suche = 3
    Dim suche8 As Variant: suche = 8
    Dim suche9 As Variant: suche = 9
    vRetP = Application.IfError(Application.VLookup(suche3, Sheets("Lager").[A2:K1048576], 11, False), "x")
    vRetBI = Application.IfError(Application.VLookup(suche8, Sheets("Lager").[A2:K1048576], 11, False), "x")
    vRetBA = Application.IfError(Application.VLookup(suche9, Sheets("Lager").[A2:K1048576], 11, False), "x")


  If Left(Cells(LA, 12).Value, 3) = "KA_" Then
        If CDec(Mid(Cells(LA, 12), InStrRev(Cells(LA, 12), "X") + 1)) > Range("Max_Fügemaß") Or _
            vRetP <> "x" Or _
            vRetBI <> "x" Or _
            vRetBA <> "x" Then _
        Cells(LA, 19).Value = Cells(LA, 19) - Mid(Cells(LA, 12), InStrRev(Cells(LA, 12), "X") + 1)
        End If

Bei dem Code verzweifel ich aber. Mit dem Material aus der Spalte 1 klappt es wie gewohnt. Bei Spalte 8 & 9 geht leider nichts.


Siehst du den Fehler. Bin etwas am Verzweifeln.

Gruß flo
Hallöchen,

mit Deinem Code suchst Du in Spalte A nach 3, 8 und 9 und holst bei Treffer Daten aus Spalte 11.
Bitte poste doch den Code, wo es um Spalte 8 und 9 geht.
Seiten: 1 2 3