Ich bin es gewohnt, mit VLOOKUP zu arbeiten, aber diesmal habe ich eine Herausforderung. Ich möchte nicht den ersten übereinstimmenden Wert, sondern den letzten. Wie? (Ich arbeite mit LibreOffice Calc, aber eine MS Excel-Lösung sollte ebenso nützlich sein.)
Der Grund ist, dass ich zwei Textspalten mit Tausenden von Zeilen habe. Nehmen wir an, eine ist eine Liste der Transaktionsempfänger (Amazon, Ebay, Arbeitgeber, Lebensmittelgeschäft usw.) und die andere ist eine Liste der Ausgabenkategorien (Löhne, Steuern, Haushalt, Miete usw.). Einige Transaktionen haben nicht jedes Mal dieselbe Ausgabenkategorie, und ich möchte die zuletzt verwendete auswählen. Beachten Sie, dass die Liste nach keiner Spalte (tatsächlich nach Datum) sortiert ist und ich die Sortierreihenfolge nicht ändern möchte.
Was ich habe (ohne Fehlerbehandlung), ist die übliche "First-Match" -Formel:
=VLOOKUP(
[payee field] , [payee+category range] , [index of category column] ,
0 )
Ich habe solche Lösungen gesehen , aber ich erhalte #DIV/0!
Fehler:
=LOOKUP(2 , 1/( [payee range] = [search value] ) , [category range] )
Die Lösung kann eine beliebige Formel sein, nicht unbedingt VLOOKUP. Ich kann auch die Spalten des Zahlungsempfängers / der Kategorie vertauschen. Nur bitte keine Änderung in der Sortierspalte.
Bonuspunkte für eine Lösung, die eher den häufigsten als den letzten Wert auswählt!
quelle
IF
keine Arrays verarbeiten kann.Evaluate Formula
zu durchlaufen, um festzustellen , welcher Teil der Formel den Fehler generiert. Diese Funktion ist in Excel vorhanden, und ich wäre überrascht, wenn LibreOffice Calc nicht dieselbe Funktion hätte.=VLOOKUP(J1061;$J$2:$K$9999;2;0)
wobei Spalte J Zahlungsempfänger und Spalte K die Kategorien enthält. Es gibt das erste Match wie erwartet zurück.(Beantwortung hier als keine separate Frage für sortierte Daten.)
Wenn die Daten wurden sortiert, könnten Sie
VLOOKUP
mit demrange_lookup
ArgumentTRUE
(oder weggelassen wird , da es die Standardeinstellung), die offiziell für Excel beschrieben wird als „für ungefähre Übereinstimmung finden“.Mit anderen Worten für sortierte Daten:
FALSE
um den ersten Wert zurückzugeben, undTRUE
der letzte Wert zurückgegeben wird.Dies ist weitgehend undokumentiert und unklar, stammt jedoch aus VisiCalc (1979) und gilt heute zumindest für Microsoft Excel, LibreOffice Calc und Google Sheets. Dies ist letztendlich auf die anfängliche Implementierung
LOOKUP
in VisiCalc (und von dortVLOOKUP
undHLOOKUP
) zurückzuführen, als es keinen vierten Parameter gab. Der Wert wird durch binäre Suche unter Verwendung von inklusive linker und exklusiver rechter Grenze (eine übliche und elegante Implementierung) gefunden, was zu diesem Verhalten führt.Technisch bedeutet dies, dass man die Suche mit dem Kandidatenintervall startet
[0, n)
, wobein
die Länge des Arrays ist, und die schleifeninvariante Bedingung ist, dassA[imin] <= key && key < A[imax]
(die linke Grenze ist <= das Ziel, die rechte Grenze, die eine nach dem Ende beginnt, ist > das Ziel (zu validieren, entweder die Werte an den Endpunkten vorher oder das Ergebnis danach zu überprüfen) und nacheinander die Seite zu halbieren und auszuwählen, die diese Invariante beibehält: durch Ausschluss wird eine Seite, bis Sie zu einem Intervall mit 1 Term kommen[k, k+1)
, und die Der Algorithmus kehrt dann zurückk
. Dies muss keine exakte Übereinstimmung (!) Sein: Es ist nur die engste Übereinstimmung von unten. Bei doppelten Übereinstimmungen wird die letzte Übereinstimmung zurückgegeben, da der nächste Wert größer sein mussals der Schlüssel (oder das Ende des Arrays). Im Falle von Duplikaten benötigen Sie ein gewisses Verhalten, das sinnvoll und einfach zu implementieren ist.Dieses Verhalten wird in diesem alten Microsoft Knowledge Base-Artikel explizit angegeben (Hervorhebung hinzugefügt): "XL: Zurückgeben der ersten oder letzten Übereinstimmung in einem Array" ( Q214069 ):
Offizielle Dokumentation für einige Tabellenkalkulationen folgt; In beiden Fällen wird das Verhalten "Letzte Übereinstimmung" nicht angegeben, es ist jedoch in der Google Sheets-Dokumentation enthalten:
Microsoft Excel
Google Sheets :
quelle
Wenn die Werte im Sucharray sequentiell sind (dh Sie suchen nach dem größten Wert, z. B. dem letzten Datum), müssen Sie nicht einmal die INDIRECT-Funktion verwenden. Versuchen Sie diesen einfachen Code:
Geben Sie die Formel erneut mit STRG + UMSCHALT + EINGABETASTE ein
quelle
Ich habe es mit dem häufigsten Wert versucht. Ich bin mir nicht sicher, ob es in libreOffice funktionieren würde, aber es scheint in Excel zu funktionieren
Spalte A wäre der Zahlungsempfänger, Spalte B wäre die Kategorie, D2 ist der Zahlungsempfänger, nach dem Sie filtern möchten. Ich bin mir nicht sicher, warum es in der obigen Funktion zusätzliche Zeilenumbrüche verursacht.
Meine Funktion, um die letzte Zelle zu finden, wäre wie folgt:
Indirekt kann ich die Spalte angeben, die ich zurückgeben möchte, und die Zeile direkt suchen (sodass ich die Anzahl der Kopfzeilen nicht subtrahieren muss.
Beide Funktionen müssen mit Strg + Umschalt + Eingabetaste eingegeben werden
quelle
Dadurch erhalten Sie den letzten Wert
Bekomme ich Bonuspunkte für 3 Jahre Verspätung?
quelle
Sie haben
#DIV/0!
Fehler erhalten, weil Sie Ihre Formel lieber wie folgt schreiben sollten:Dies wird funktionieren und das letzte Spiel finden.
([payee range] = [search value])
: Boolesche Matrix TRUE / FALSEIF(([payee range] = [search value]);1;"")
: Pseudo-Boolesche Matrix 1 / ""=LOOKUP(2; {pseudo-boolean matrix 1/""} );[category range])
: Immer die letzte1
Position zurückgebenquelle
LOOKUP
Funktioniert nur mit sortierten Listen. Die Ausgabe Ihres Vergleichs führt zu einer Liste von1
s und Leerzeichen auf nicht sortierte Weise, sodass kein korrektes Ergebnis erzielt wird .