Dieses Forum nutzt Cookies
Dieses Forum verwendet Cookies, um deine Login-Informationen zu speichern, wenn du registriert bist, und deinen letzten Besuch, wenn du es nicht bist. Cookies sind kleine Textdokumente, die auf deinem Computer gespeichert werden. Die von diesem Forum gesetzten Cookies werden nur auf dieser Website verwendet und stellen kein Sicherheitsrisiko dar. Cookies aus diesem Forum speichern auch die spezifischen Themen, die du gelesen hast und wann du zum letzten Mal gelesen hast. Bitte bestätige, ob du diese Cookies akzeptierst oder ablehnst.

Ein Cookie wird in deinem Browser unabhängig von der Wahl gespeichert, um zu verhindern, dass dir diese Frage erneut gestellt wird. Du kannst deine Cookie-Einstellungen jederzeit über den Link in der Fußzeile ändern.

Excel VBA VLookup
#1
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
Antworten Top
#2
Schema: 
Dim vRet as Vatiant
vRet = Application.Vlookup(…). 
If Iserror(vRet) then…

Niemals Worksheetfunction.Vlookup() verwenden, wenn du Fehler auswerten können willst.
Hat Dir mein Beitrag geholfen? Dann hilf auch Du - mit einer Spende an Wikipediadie Tafeln oder aktion-deutschland-hilft.de
Antworten Top
#3
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?
Antworten Top
#4
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.
Antworten Top
#5
(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.
Hat Dir mein Beitrag geholfen? Dann hilf auch Du - mit einer Spende an Wikipediadie Tafeln oder aktion-deutschland-hilft.de
Antworten Top
#6
(28.11.2022, 06:45)legiminator schrieb: Solltet ihr eine Beispieldatei benötigen, gebt mir Bescheid, dann werde ich eine erstellen und hochladen.

Bescheid!
Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. 
Lehre einen Mann zu fischen und du ernährst ihn für sein Leben. (Konfuzius)
Antworten Top
#7
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


Angehängte Dateien
.xlsm   Muster für VLookUp_2022.11.28.xlsm (Größe: 57,77 KB / Downloads: 5)
Antworten Top
#8
(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.
Hat Dir mein Beitrag geholfen? Dann hilf auch Du - mit einer Spende an Wikipediadie Tafeln oder aktion-deutschland-hilft.de
[-] Folgende(r) 1 Nutzer sagt Danke an EarlFred für diesen Beitrag:
  • legiminator
Antworten Top
#9
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
Antworten Top
#10
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.
.      \\\|///      Hoffe, geholfen zu haben.
       ( ô ô )      Grüße, André aus G in T  
  ooO-(_)-Ooo    (Excel 97-2019+365)
[-] Folgende(r) 1 Nutzer sagt Danke an schauan für diesen Beitrag:
  • legiminator
Antworten Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste