Jestem przyzwyczajony do pracy z VLOOKUP, ale tym razem mam wyzwanie. Nie chcę pierwszej pasującej wartości, ale ostatniej. W jaki sposób? (Pracuję z LibreOffice Calc, ale rozwiązanie MS Excel powinno być równie przydatne.)
Powodem jest to, że mam dwie kolumny tekstowe z tysiącami wierszy, powiedzmy, że jedna to lista odbiorców transakcji (Amazon, Ebay, pracodawca, sklep spożywczy itp.), A druga to lista kategorii wydatków (płace, podatki, gospodarstwo domowe, czynsz itp.). Niektóre transakcje nie mają tej samej kategorii wydatków za każdym razem i chcę skorzystać z ostatnio używanej. Zauważ, że lista nie jest sortowana według żadnej kolumny (w rzeczywistości według daty) i nie chcę zmieniać kolejności sortowania.
To, co mam (oprócz obsługi błędów), to zwykła formuła „pierwszego dopasowania”:
=VLOOKUP(
[payee field] , [payee+category range] , [index of category column] ,
0 )
Widziałem takie rozwiązania , ale dostaję #DIV/0!
błędy:
=LOOKUP(2 , 1/( [payee range] = [search value] ) , [category range] )
Rozwiązaniem może być dowolna formuła, niekoniecznie WYSZUKAJ.PIONOWO. Mogę również zamieniać kolumny odbiorcy / kategorii. Poprostu brak zmian w kolumnie sortowania.
Punkty bonusowe za rozwiązanie, które wybiera najczęstszą wartość zamiast ostatniej!
źródło
IF
nie obsługuje tablic.Evaluate Formula
aby sprawdzić, która część formuły generuje błąd. Ta funkcja istnieje w programie Excel i byłbym zaskoczony, jeśli LibreOffice Calc nie ma tej samej funkcji.=VLOOKUP(J1061;$J$2:$K$9999;2;0)
gdzie kolumna J zawiera odbiorców i kolumna K. kategorie. Zwraca pierwsze dopasowanie zgodnie z oczekiwaniami.(Odpowiedź tutaj jako osobne pytanie dla posortowanych danych).
Jeśli dane były sortowane, można użyć
VLOOKUP
zrange_lookup
argumentemTRUE
(lub jest pominięty, ponieważ jest to ustawienie domyślne), która jest oficjalnie opisany dla programu Excel jako „szukaj przybliżonej meczu”.Innymi słowy, dla posortowanych danych:
FALSE
zwracał pierwszą wartość, orazTRUE
zwrócenia ostatniej wartości.Jest to w dużej mierze nieudokumentowane i niejasne, ale datuje się na VisiCalc (1979), a dziś ma co najmniej w Microsoft Excel, LibreOffice Calc i Arkuszach Google. Jest to ostatecznie spowodowane początkową implementacją
LOOKUP
w VisiCalc (i stamtądVLOOKUP
iHLOOKUP
), kiedy nie było czwartego parametru. Wartość znajduje się w wyszukiwaniu binarnym , z wykorzystaniem włączonej lewej granicy i wyłącznej prawej granicy (wspólna i elegancka implementacja), co powoduje takie zachowanie.Technicznie oznacza to, że wyszukiwanie rozpoczyna się od przedziału kandydującego
[0, n)
, gdzien
jest długość tablicy, a warunkiem niezmiennym dla pętli jest to, żeA[imin] <= key && key < A[imax]
(lewa granica to <= cel, prawa granica, która zaczyna się po końcu, to: > cel; w celu sprawdzenia poprawności albo sprawdź wartości w punktach końcowych przed, albo sprawdź wynik po), a następnie dzielenie na sekcje i wybranie dowolnej strony zachowuje ten niezmiennik: wykluczając jedną ze stron, dopóki nie dojdziesz do przedziału z 1 terminem[k, k+1)
, a algorytm następnie zwracak
. To nie musi być dokładne dopasowanie (!): To tylko najbliższe dopasowanie od dołu. W przypadku zduplikowanych dopasowań powoduje to zwrócenie ostatniego dopasowania, ponieważ wymaga, aby następna wartość była większaniż klucz (lub koniec tablicy). W przypadku duplikatów trzeba pewne zachowania, a to jest rozsądne i łatwe do wdrożenia.To zachowanie jest wyraźnie określone w starym artykule z bazy wiedzy Microsoft Knowledge Base (wyróżnienie dodane): „XL: Jak zwrócić pierwszy lub ostatni wynik w tablicy” ( Q214069 ):
Poniżej przedstawiono oficjalną dokumentację niektórych arkuszy kalkulacyjnych; nie podano też zachowania „ostatniego dopasowania”, ale jest to sugerowane w dokumentacji Arkuszy Google:
Microsoft Excel
Arkusze Google :
źródło
Jeśli wartości w tablicy wyszukiwania są sekwencyjne (tzn. Szukasz największej wartości, takiej jak najnowsza data), nie musisz nawet używać funkcji POŚREDNIE. Wypróbuj ten prosty kod:
Ponownie wprowadź formułę za pomocą CTRL + SHIFT + ENTER
źródło
Próbowałem najczęstszej wartości. Nie jestem pewien, czy zadziała w libreOffice, ale wydaje się, że działa w programie Excel
Kolumna A to odbiorca, kolumna B to kategoria, D2 to odbiorca, według którego chcesz filtrować. Nie jestem pewien, dlaczego dodaje dodatkowe łamanie linii w powyższej funkcji.
Moja funkcja znajdowania ostatniej komórki wyglądałaby następująco:
Pośrednie pozwala mi określić kolumnę, którą chcę zwrócić, i znaleźć wiersz bezpośrednio (więc nie muszę odejmować liczby wierszy nagłówka.
Obie te funkcje należy wprowadzić za pomocą Ctrl + Shift + Enter
źródło
Otrzymasz ostatnią wartość
Czy dostaję punkty bonusowe za spóźnienie 3 lata?
źródło
Wystąpiły
#DIV/0!
błędy, ponieważ powinieneś raczej napisać formułę:to zadziała i znajdzie ostatni mecz.
([payee range] = [search value])
: macierz logiczna TRUE / FALSEIF(([payee range] = [search value]);1;"")
: pseudo-boolean matrix 1 / ""=LOOKUP(2; {pseudo-boolean matrix 1/""} );[category range])
: zawsze zwracaj ostatnią1
pozycjęźródło
LOOKUP
działa tylko na posortowanej liście, wynik twojego porównania spowoduje utworzenie listy1
s i spacji w nieposortowany sposób, więc nie da poprawnego wyniku.