Quelle: https://www.clever-excel-forum.de/Thread-SVerweis-mit-3-Bedingungen-wobei-eine-einen-festen-Wert-hat-und-die-2-einen-Wert
Stand: 07.11.2024, 17:45
Hier der Eröffnungsbeitrag aus dem Forum:
Moin Zusammen,
ich suche einen SVerweis, der 1. ist ein eindeutiger Wert, der 2. + 3. Wert soll dann mit >= gefunden werden. Anbei ein Beispiel.
Ich möchte im Feld I2 den Preis des jeweiligen Produktes erhalten,
wenn der Wert aus den Spalten „A” und „F” übereinstimmt,
der Wert aus Spalte G den passenden Wert (<,> oder =) in Spalte B findet und
wenn in Spalte C ein Wert vorhanden ist, muss dieser mit dem Wert aus Spalte H übereinstimmen (<,> oder =).
Wenn die Werte eindeutig übereinander passen, dann funktioniert diese Formel
=SVERWEIS(F2&G2&H2; WAHL({1.2.3}; A2:A17&B2:B17&C2:C17;D2:D17);2;0)
Ich hoffe ich habe das irgendwie verständlich erklärt und meine Beispieldatei erklärt es.
Danke für Eure Hilfe.
Veit
Angehängte Dateien Beispiel SVerweis mit 3 Bedingungen.xlsx
Ausnahmsweise habe ich die vorgegebenen Daten des Fragestellers geändert, denn nach dem Motto „Das Gegenteil von gut ist gut gemeint“ ist mir nach einigem Hin und Her aufgefallen, dass der Satz „Form follows function“ hier absolut zutrifft. Dass die Größer-Zeichen (>) wegen des dort veränderten Zahlenformats keinerlei Wirkung in Sachen Berechnung zeigten, das ist eine echte „Spitzenleistung“ des Erstellers. 🙁
Und die leeren Zellen im Bereich der beiden Tabellen habe ich der besseren Auswertbarkeit wegen mit dem Wert 0 (Zahl null) gefüllt. Beide Änderungen habe ich im zu importierenden Excel-Arbeitsblatt vorgenommen.
Und noch ein Wort zu meiner Lösung und dem zwischenzeitlich deutlich ausgeweiteten Threadverlauf: Ich habe meine Lösung nach der anfangs eingestellten und von mir angepassten *.xlsx erstellt. Die späteren Änderungen (Stand per 09.11.24) verwirren mich mehr als aufzuklären und ich finde stetige Änderungen und Anpassungen der Grundforderung nur gut, wenn es sich um zahlende Kunden handelt, welche sich des Mehraufwands für mich bewusst sind. 😉 Wegen dieser ganzen Ungereimtheiten habe ich auch recht lange gezögert, ob ich meine Lösung hier im Blog veröffentlichen soll. Mein Entschluss zum „ja“ ist dadurch bedingt, dass das evaluieren eines Ausdrucks in Power Query zu den selteneren aber durchaus interessanten Vorgehensweisen gehört.
Mir ist bewusst, dass diese Lösung weit über meine Devise „PQ möglichst nur mit Mausklicks“ hinausgeht, aber ich kann mir gut vorstellen, dass eine Formel-Lösung auch nicht gerade profan daherkommt. 🙂 Und ich habe auch bewusst einige Schritte mehr inkauf genommen, um die Abfolge möglichst transparent zu halten. Der nachfolgende M-Code ist etwas kommentiert; wenn Sie mehr Erklärungen oder Hilfe möchten, schreiben Sie mir eine E‑Mail.
let
// Abfrage "RawData"
// Die von mir angepassten Roh-Daten des Fragestellers
Quelle = Excel.CurrentWorkbook(){[Name="RawData"]}[Content],
// Größe und Länge: Einheitlich Typ Text
#"Geänderter Typ" = Table.TransformColumnTypes(Quelle,{{"Name", type text}, {"Größe", type text}, {"Länge", type text}, {"Preis", type any}}),
#"Hinzugefügter Index" = Table.AddIndexColumn(#"Geänderter Typ", "Index", 0, 1, Int64.Type),
// KÜRZEN()
#"Abgeschnittener Text" = Table.TransformColumns(#"Hinzugefügter Index",{{"Größe", Text.Trim, type text}, {"Länge", Text.Trim, type text}}),
// Leerzeichen entfernt
#"Ersetzter Wert" = Table.ReplaceValue(#"Abgeschnittener Text","> ",">",Replacer.ReplaceText,{"Größe", "Länge"}),
#"Ersetzter Wert1" = Table.ReplaceValue(#"Ersetzter Wert",null,"0",Replacer.ReplaceValue,{"Größe", "Länge"}),
#"Hinzugefügte benutzerdefinierte Spalte" = Table.AddColumn(#"Ersetzter Wert1", "HSp", each 0),
// Erst einmal für alle…
#"Präfix hinzugefügt" = Table.TransformColumns(#"Hinzugefügte benutzerdefinierte Spalte", {{"Größe", each "=" & _, type text}}),
#"Präfix hinzugefügt1" = Table.TransformColumns(#"Präfix hinzugefügt", {{"Länge", each "=" & _, type text}}),
// … und bei '>' wieder entfernt
#"Ersetzter Wert2" = Table.ReplaceValue(#"Präfix hinzugefügt1","=>",">",Replacer.ReplaceText,{"Größe", "Länge"}),
// Hier wird die Hilfsspalte 'HSp' gebraucht
#"Zusammengeführte Abfragen" = Table.NestedJoin(#"Ersetzter Wert2", {"HSp"}, Bedingungen, {"HSp"}, "Bedingungen", JoinKind.FullOuter),
#"Erweiterte Bedingungen" = Table.ExpandTableColumn(#"Zusammengeführte Abfragen", "Bedingungen", {"Name V", "Größe V", "Meter V", "Index"}, {"Name V", "Größe V", "Meter V", "Index.1"}),
// Dient als Datenquelle beim Zusammenfügen; so bleiben beim Zusammenfügen die ursprünglichen Spalten erhalten (werden säter zum Anzeigen des Ergebnisses gebraucht)
#"Duplizierte Spalte" = Table.DuplicateColumn(#"Erweiterte Bedingungen", "Größe V", "Größe V - Kopie"),
#"Duplizierte Spalte1" = Table.DuplicateColumn(#"Duplizierte Spalte", "Meter V", "Meter V - Kopie"),
#"Hinzugefügte benutzerdefinierte Spalte1" = Table.AddColumn(#"Duplizierte Spalte1", "Benutzerdefiniert", each [Name]=[Name V]),
#"Gefilterte Zeilen" = Table.SelectRows(#"Hinzugefügte benutzerdefinierte Spalte1", each ([Benutzerdefiniert] = true)),
#"Entfernte Spalten" = Table.RemoveColumns(#"Gefilterte Zeilen",{"Benutzerdefiniert", "Name V"}),
// SO ist eine Evaluierung per PQ möglich
#"Zusammengeführte Spalten" = Table.CombineColumns(#"Entfernte Spalten",{"Größe V - Kopie", "Größe"},Combiner.CombineTextByDelimiter("", QuoteStyle.None),"GrößeZgef"),
#"Zusammengeführte Spalten1" = Table.CombineColumns(#"Zusammengeführte Spalten",{"Meter V - Kopie", "Länge"},Combiner.CombineTextByDelimiter("", QuoteStyle.None),"LängeZgef"),
#"Hinzugefügte benutzerdefinierte Spalte2" = Table.AddColumn(#"Zusammengeführte Spalten1", "GrößeEval", each Expression.Evaluate([GrößeZgef])),
#"Gefilterte Zeilen1" = Table.SelectRows(#"Hinzugefügte benutzerdefinierte Spalte2", each ([GrößeEval] = true)),
#"Entfernte Spalten1" = Table.RemoveColumns(#"Gefilterte Zeilen1",{"GrößeEval"}),
#"Hinzugefügte benutzerdefinierte Spalte3" = Table.AddColumn(#"Entfernte Spalten1", "LängeEval", each Expression.Evaluate([LängeZgef])),
#"Gefilterte Zeilen2" = Table.SelectRows(#"Hinzugefügte benutzerdefinierte Spalte3", each ([LängeEval] = true)),
#"Entfernte Spalten2" = Table.RemoveColumns(#"Gefilterte Zeilen2",{"GrößeZgef", "LängeZgef", "Index", "HSp", "LängeEval"}),
// Der Optik wegen… ;-)
#"Neu angeordnete Spalten" = Table.ReorderColumns(#"Entfernte Spalten2",{"Name", "Größe V", "Meter V", "Preis"}),
#"Sortierte Zeilen" = Table.Sort(#"Neu angeordnete Spalten",{{"Index.1", Order.Ascending}}),
#"Entfernte Spalten3" = Table.RemoveColumns(#"Sortierte Zeilen",{"Index.1"})
in
#"Entfernte Spalten3"
let // Abfrage "Bedingungen" Quelle = Excel.CurrentWorkbook(){[Name="Bedingungen"]}[Content], #"Geänderter Typ" = Table.TransformColumnTypes(Quelle,{{"Name V", type text}, {"Größe V", type text}, {"Meter V", type text}}), // Erforderlich, damit die beiden Tabellen 'sauber' zusammengeführt werden können #"Hinzugefügte benutzerdefinierte Spalte" = Table.AddColumn(#"Geänderter Typ", "HSp", each 0), // So wird im Ergebnis die gewünschte Reihenfolge gewährleistet #"Hinzugefügter Index" = Table.AddIndexColumn(#"Hinzugefügte benutzerdefinierte Spalte", "Index", 0, 1, Int64.Type) in #"Hinzugefügter Index"
Und hier, beim Stichwort last but not least finden Sie noch einen Hinweis, wo und wie Sie Antworten auf eventuelle Fragen oder auch die ausgearbeitete Datei bekommen können. Grundlegendes zum Thema M-Code lesen Sie hier im Blog nach.