Ostatnia niepusta komórka w kolumnie

112

Czy ktoś zna formułę znajdującą wartość ostatniej niepustej komórki w kolumnie, w programie Microsoft Excel?

Michael S.
źródło
W tym celu szukałbym VBA.
David Heffernan,

Odpowiedzi:

76

Działa to zarówno z tekstem, jak i liczbami i nie ma znaczenia, czy są puste komórki, tj. Zwróci ostatnią niepustą komórkę.

Musi być wpisany w tablicę , co oznacza, że po wpisaniu lub wklejeniu naciśniesz Ctrl-Shift-Enter . Poniższe dotyczy kolumny A:

=INDEX(A:A,MAX((A:A<>"")*(ROW(A:A))))
Doug Glancy
źródło
@ Jean-François, Przepraszam, przyznałem to w komentarzu zeszłej nocy, ale przez pomyłkę umieściłem to w oryginalnym poście. Działa w XL 2007 i 2010. Dzięki.
Doug Glancy,
Nie działa dla mnie w programie Excel 2007. Wklejałem dokładną formułę. Mam kolumnę (A), w której wartości są = WIERSZ () aż do 127 godzin, a formuła zwraca „1”
DontFretBrett
2
@DontFretBrett, pamiętaj, aby wprowadzić go jako formułę tablicową z Ctrl-Shift-Enter, jak określono w odpowiedzi.
Doug Glancy
@DougGlancy zawodzi z mojej strony. Dziękuję Ci!
DontFretBrett
1
Ważną różnicą jest to, że ta zwraca odwołanie do komórki (więc można ją przekazać np. CELL()Lub OFFSET()), podczas gdy ta z większą liczbą głosów zwraca wartość bez informowania, gdzie ona się znajduje.
GSerg
128

Korzystanie z prostego wzoru jest znacznie szybsze

=LOOKUP(2,1/(A:A<>""),A:A)

W przypadku programu Excel 2003:

=LOOKUP(2,1/(A1:A65535<>""),A1:A65535)

Daje następujące korzyści:

  • to nie jest formuła tablicowa
  • to nie jest lotna formuła

Wyjaśnienie:

  • (A:A<>"") zwraca tablicę {TRUE,TRUE,..,FALSE,..}
  • 1/(A:A<>"")modyfikuje tę tablicę na {1,1,..,#DIV/0!,..}.
  • Ponieważ LOOKUPoczekuje posortowanej tablicy w porządku rosnącym i biorąc pod uwagę, że jeśli LOOKUPfunkcja nie może znaleźć dokładnego dopasowania, wybiera największą wartość w lookup_range(w naszym przypadku {1,1,..,#DIV/0!,..}), która jest mniejsza lub równa wartości (w naszym przypadku 2), formuła znajduje ostatnie 1w tablicy i zwraca odpowiednią wartość z result_range(trzeci parametr - A:A).

Mała uwaga - powyższa formuła nie uwzględnia komórek z błędami (widać to tylko wtedy, gdy ostatnia niepusta komórka zawiera błąd). Jeśli chcesz je wziąć pod uwagę, użyj:

=LOOKUP(2,1/(NOT(ISBLANK(A:A))),A:A)

obraz poniżej pokazuje różnicę:

wprowadź opis obrazu tutaj

Dmitry Pavliv
źródło
dzięki za wyjaśnienie i ładne zdjęcie. Wciąż pozostaje kilka pytań otwartych: 1. Dokumentacja LOOKUPmówi, że ostatni argument result_vectorjest opcjonalny. Jeśli jednak go pominę, otrzymam bardzo dziwny wynik, którego nie rozumiem.
Honza Zidek
2. Dokumentacja mówi „Jeśli LOOKUPfunkcja nie może znaleźć elementu lookup_value, funkcja dopasowuje największą wartość, lookup_vectorktóra jest mniejsza lub równa lookup_value.”. Jeśli użyję =LOOKUP(2,A:A<>"",A:A)bez generowania #DIV/0!błędu przez 1/..., wygląda na to, że zwraca pewną wartość w środku wektor. Nie znalazłem dokładnej funkcjonalności w tym przypadku.
Honza Zidek
1
Bardzo ładne wyjaśnienie. Ponieważ ostatnio skróciłem minuty z obliczeń, przenosząc formuły z formuł tablicowych do wersji innych niż tablicowe, zawsze wybieram logikę, która działa bez konieczności stosowania formuł tablicowych.
tobriand
1
@Enissay, tak, ten zwróci numer wiersza, =LOOKUP(2,1/(A:A<>""),ROW(A:A))ale dodanie ROWfunkcji doda efekt "zmienności" - formuła zostanie przeliczona za każdym razem, gdy zmieniona zostanie dowolna komórka w arkuszu
Dmitry Pavliv
1
No hej. Dzięki za opublikowanie tego. Po prostu zaciekawiony, znalazłem dokładnie te same formuły i prawie takie same sformułowania na exceljet.net/formula/get-value-of-last-non-empty-cell . Czy to także ty czy ktoś inny? Nie ma oczywistego związku.
Solomon Rutzky
24

Oto inna opcja: =OFFSET($A$1;COUNTA(A:A)-1;0)

Patrick Honorez
źródło
9
To nie zadziała, jeśli istnieją komórki z wartościami nienumerycznymi (użyj COUNTAzamiast COUNT). Nie wspominając o pustych komórkach.
Jean-François Corbett
3
To powinno być u góry. jest prosty i nie opiera się na niejasnych szczegółach nietypowych funkcji.
Tmdean
9
Nie powinien znajdować się na górze, ponieważ jest błędny, gdy wyniki mają osadzone spacje.
Myrddin Emrys
17

Zainspirowany wspaniałą wskazówką udzieloną przez odpowiedź Douga Glancy'ego, wymyśliłem sposób na zrobienie tego samego bez potrzeby stosowania formuły tablicowej. Nie pytaj mnie dlaczego, ale staram się unikać stosowania formuł tablicowych, jeśli to w ogóle możliwe (nie z żadnego konkretnego powodu, to tylko mój styl).

Oto ona:

=SUMPRODUCT(MAX(($A:$A<>"")*(ROW(A:A))))

Aby znaleźć ostatni niepusty wiersz przy użyciu kolumny A jako kolumny odniesienia

=SUMPRODUCT(MAX(($1:$1<>"")*(COLUMN(1:1))))

Aby znaleźć ostatnią niepustą kolumnę, używając wiersza 1 jako wiersza odniesienia

Może to być dalej wykorzystane w połączeniu z funkcją indeksu, aby efektywnie definiować dynamiczne nazwane zakresy, ale jest to temat na inny post, ponieważ nie jest to związane z bezpośrednim pytaniem, o którym tutaj mowa.

Przetestowałem powyższe metody w programie Excel 2010, zarówno „natywnie”, jak iw „Trybie zgodności” (dla starszych wersji programu Excel) i działają. Ponownie, dzięki tym nie musisz wykonywać żadnej z kombinacji Ctrl + Shift + Enter. Wykorzystując sposób, w jaki sumproduct działa w programie Excel, możemy ogarnąć potrzebę wykonywania operacji tablicowych, ale robimy to bez formuły tablicowej. Mam nadzieję, że ktoś może docenić piękno, prostotę i elegancję proponowanych rozwiązań sumarycznych tak samo jak ja. Nie zaświadczam jednak o wydajności pamięci powyższych rozwiązań. Wystarczy, że są proste, pięknie wyglądają, pomagają w zamierzonym celu i są na tyle elastyczne, że można je rozszerzyć na inne cele :)

Mam nadzieję że to pomoże!

Wszystkiego najlepszego!

Santiago
źródło
1
Aby dowiedzieć się, dlaczego używać formuł innych niż tablicowe, zapoznaj się z poniższą odpowiedzią .
sancho.s ReinstateMonicaCellio
17

Wiem, że to stare pytanie, ale nie jestem zadowolony z udzielonych odpowiedzi.

  • WYSZUKAJ, WYSZUKAJ.PIONOWO i WYSZUKAJ.PIONOWO mają problemy z wydajnością i nigdy nie powinny być używane.

  • Funkcje tablicowe wiążą się z dużym obciążeniem i mogą mieć również problemy z wydajnością, dlatego należy ich używać tylko w ostateczności.

  • COUNT i COUNTA napotykają problemy, jeśli dane nie są ciągłe niepuste, tj. Masz spacje, a następnie dane ponownie w przedmiotowym zakresie

  • POŚREDNI jest niestabilny, więc powinien być używany tylko w ostateczności

  • OFFSET jest niestabilny, więc powinien być używany tylko w ostateczności

  • wszelkie odniesienia do ostatniego możliwego wiersza lub kolumny (na przykład 65536-ty wiersz w programie Excel 2003) nie są solidne i powodują dodatkowe obciążenie

To jest to, czego używam

  • gdy typ danych jest mieszany: =max(MATCH(1E+306,[RANGE],1),MATCH("*",[RANGE],-1))

  • gdy wiadomo, że dane zawierają tylko liczby: =MATCH(1E+306,[RANGE],1)

  • gdy wiadomo, że dane zawierają tylko tekst: =MATCH("*",[RANGE],-1)

MATCH ma najniższy narzut i jest nieulotny, więc jeśli pracujesz z dużą ilością danych, jest to najlepsze rozwiązanie.

W5ALIVE
źródło
To dobra odpowiedź (+1), ale nadal istnieją pewne luki, których ta metoda może pominąć. Na przykład, jeśli istnieją komórki z wartościami logicznymi ( TRUE/ FALSE), pozostaną niewykryte. Pomimo tego, że ta odpowiedź nie jest kuloodporna, nadal uważam, że ta odpowiedź ma najmniejszy wpływ na wydajność.
ImaginaryHuman072889
2
Dopasowanie zwraca indeks, a nie wartość komórki. Możesz użyć funkcji indeksu, aby uzyskać wartość. Powinieneś także prawdopodobnie dołączyć coś na temat tego, czym powinien być [RANGE]. Wybrałem całą kolumnę za pomocą „N: N”. Oto przykład, który zadziałał dla mnie: =INDEX(N:N,MATCH(1E+306,N:N,1))
swimfar
10

Działa to w programie Excel 2003 (i później z niewielkimi zmianami, patrz poniżej). Naciśnij Ctrl + Shift + Enter (nie tylko Enter), aby wprowadzić to jako formułę tablicową.

=IF(ISBLANK(A65536),INDEX(A1:A65535,MAX((A1:A65535<>"")*(ROW(A1:A65535)))),A65536)

Należy pamiętać, że program Excel 2003 nie może zastosować formuły tablicowej do całej kolumny. Takie postępowanie przynosi rezultaty #NUM!; mogą wystąpić nieprzewidywalne skutki! (EDIT : Sprzeczne informacje z firmy Microsoft: ten sam maj lub nie mogą być prawdziwe w programie Excel 2007, problemem może zostały ustalone w 2010 roku )

Dlatego stosuję formułę tablicową do zakresu A1:A65535i traktuję w specjalny sposób ostatnią komórkę, która jest A65536w programie Excel 2003. Nie mogę po prostu powiedzieć, A:Aani nawet, A1:A65536gdy ta ostatnia automatycznie powraca do A:A.

Jeśli masz absolutną pewność, że A65536jest puste, możesz pominąć tę IFczęść:

=INDEX(A1:A65535,MAX((A1:A65535<>"")*(ROW(A1:A65535))))

Zwróć uwagę, że jeśli używasz programu Excel 2007 lub 2010, ostatni numer wiersza to 1048576, a nie 65536, więc dostosuj powyższe odpowiednio.

Jeśli nie ma puste komórki w środku swoich danych, to bym po prostu użyć prostszej formuły =INDEX(A:A,COUNTA(A:A)).

Jean-François Corbett
źródło
Dla ROW zamiast kolumny, to zadziałało dla mnie=INDEX(19:19,COUNTA(19:19))
Serj Sagan
8

Alternatywnym rozwiązaniem bez formuł tablicowych, prawdopodobnie bardziej niezawodnym niż to z poprzedniej odpowiedzi z rozwiązaniem (wskazówka do a) bez formuł tablicowych , jest

=INDEX(A:A,INDEX(MAX(($A:$A<>"")*(ROW(A:A))),0))

Zobacz tę odpowiedź jako przykład. Uznanie dla Brada i Barry'ego Houdiniego , którzy pomogli rozwiązać to pytanie .

Możliwe przyczyny preferowania formuły innej niż tablicowa są podane w:

  1. Oficjalna strona firmy Microsoft (poszukaj informacji „Wady używania formuł tablicowych”).
    Formuły tablicowe mogą wydawać się magiczne, ale mają też pewne wady:

    • Czasami możesz zapomnieć o naciśnięciu CTRL + SHIFT + ENTER. Pamiętaj, aby nacisnąć tę kombinację klawiszy za każdym razem, gdy wprowadzasz lub edytujesz formułę tablicową.
    • Inni użytkownicy mogą nie rozumieć twoich formuł. Formuły tablicowe są stosunkowo nieudokumentowane, więc jeśli inne osoby muszą modyfikować Twoje skoroszyty, powinieneś albo unikać formuł tablicowych, albo upewnić się, że ci użytkownicy wiedzą, jak je zmienić.
    • W zależności od szybkości przetwarzania i pamięci komputera duże formuły tablicowe mogą spowolnić obliczenia.
  2. Array Formuła Herezja .

sancho.s ReinstateMonicaCellio
źródło
Nie mogę zmusić tego do pracy z kolumną D. Zastąpiłem wszystkie Awystąpienia D. Co ja robię źle?
Marc 2377
5

jeśli szukasz w kolumnie (A) użyj:

=INDIRECT("A" & SUMPRODUCT(MAX((A:A<>"")*(ROW(A:A)))))

jeśli Twój zakres to A1: A10, możesz użyć:

=INDIRECT("A" & SUMPRODUCT(MAX(($A$1:$A10<>"")*(ROW($A$1:$A10)))))

w tym wzorze:

SUMPRODUCT(MAX(($A$1:$A10<>"")*(ROW($A$1:$A10))))

zwraca ostatni niepusty numer wiersza, a funkcja pośrednia () zwraca wartość komórki.

Sharif Lotfi
źródło
2

=INDEX(A:A, COUNTA(A:A), 1)zaczerpnięte stąd

HattrickNZ
źródło
2

=MATCH("*";A1:A10;-1) dla danych tekstowych

=MATCH(0;A1:A10;-1) dla danych liczbowych

liharvi
źródło
Proszę używać bloków kodu, podając fragmenty kodu w odpowiedziach.
β.εηοιτ.βε
Myślę, że te formuły dadzą nam pierwszą niepustą komórkę, a nie ostatnią niepustą komórkę.
Baodad
2

Wypróbowałem wszystkie nieulotne wersje, ale żadna z wersji podanych powyżej nie zadziałała. Excel 2003/2007 aktualizacja. Z pewnością można to zrobić w programie Excel 2003. Nie jako tablica ani standardowa formuła. Otrzymuję tylko pusty błąd, 0 lub # wartość. Więc uciekam się do niestabilnych metod. To zadziałało.

= WYSZUKAJ (2,1 / (T4: T369 <> ""); T4: T369)

@Julian Kroné .. Używając „;” zamiast „,” NIE działa! Myślę, że używasz Libre Office, a nie MS Excel? LOOKUP jest tak irytująco zmienny, że używam go tylko w ostateczności

zdalny
źródło
0

Umieść ten kod w module VBA. Zapisać. W obszarze Funkcje, Użytkownik szuka tej funkcji.

Function LastNonBlankCell(Range As Excel.Range) As Variant
    Application.Volatile
    LastNonBlankCell = Range.End(xlDown).Value
End Function
Mac vd Wsthuizen
źródło
2
Niekoniecznie jest to OSTATNIA pusta komórka, tylko NASTĘPNA pusta komórka zaczynająca się od góry.
Portland Runner
Pytanie dotyczy formuły, a nie VBA
Patrick Honorez
0

dla danych tekstowych:

EQUIV("";A1:A10;-1)

dla danych liczbowych:

EQUIV(0;A1:A10;-1)

To daje ci względny indeks ostatniej niepustej komórki w wybranym zakresie (tutaj A1: A10).

Jeśli chcesz uzyskać wartość, uzyskaj do niej dostęp przez POŚREDNIE po zbudowaniu - tekstowo - bezwzględnego odwołania do komórki, np .:

INDIRECT("A" & (nb_line_where_your_data_start + EQUIV(...) - 1))
Adel
źródło
0

Ja też miałem ten sam problem. Ta formuła również działa równie dobrze: -

=INDIRECT(CONCATENATE("$G$",(14+(COUNTA($G$14:$G$65535)-1))))

14 to numer pierwszego wiersza w wierszach, które chcesz policzyć.

Przewlekły Clawtooth

Przewlekły Clawtooth
źródło
0

Użyłem HLOOKUP

A1ma randkę; A2:A8ma prognozy zrobione w różnym czasie, chcę najnowsze

=Hlookup(a1,a1:a8,count(a2:a8)+1)

Używa standardowej formuły hlookup z tablicą przeglądową zdefiniowaną przez liczbę wpisów.

Chris
źródło
0

Jeśli wiesz, że między nimi nie będzie pustych komórek, najszybszym sposobem jest ta.

=INDIRECT("O"&(COUNT(O:O,"<>""")))

Po prostu zlicza niepuste komórki i odwołuje się do odpowiedniej komórki.

Może być również używany do określonego zakresu.

=INDIRECT("O"&(COUNT(O4:O34,"<>""")+3))

Zwraca ostatnią niepustą komórkę z zakresu O4: O34.

Tassos Mallis
źródło
0

W przypadku pakietu Microsoft Office 2013

„Przedostatni” niepustego wiersza:

=OFFSET(Sheet5!$C$1,COUNTA(Sheet5!$C:$C)-2,0)

„Ostatni” niepusty wiersz:

=OFFSET(Sheet5!$C$1,COUNTA(Sheet5!$C:$C)-1,0)
aprodan
źródło
0

Ta formuła działała ze mną w przypadku pakietu Office 2010:

= WYSZUKAJ (2; 1 / (A1: A100 <> ""); A1: A100)

A1: pierwsza komórka A100: odnosi się do ostatniej komórki w porównaniu

Wahed
źródło
0

Myślę, że odpowiedź W5ALIVE jest najbliższa temu, czego używam do znalezienia ostatniego wiersza danych w kolumnie. Zakładając, że szukam ostatniego wiersza z danymi w kolumnie A, użyłbym następujących dla bardziej ogólnego wyszukiwania:

=MAX(IFERROR(MATCH("*",A:A,-1),0),IFERROR(MATCH(9.99999999999999E+307,A:A,1),0))

Pierwsza PODAJ.POZYCJĘ wyszuka ostatnią komórkę tekstową, a druga PODAJ.POZYCJĘ wyszuka ostatnią komórkę numeryczną. Funkcja JEŻELI.BŁĄD zwraca zero, jeśli pierwsze PODAJ.POZYCJĘ znajdzie wszystkie komórki liczbowe lub jeśli drugie dopasowanie znajdzie wszystkie komórki tekstowe.

Zasadniczo jest to niewielka odmiana rozwiązania mieszanego tekstu i liczb W5ALIVE.

Podczas testowania synchronizacji było to znacznie szybsze niż równoważne warianty LOOKUP.

Aby zwrócić rzeczywistą wartość ostatniej komórki, wolę używać pośrednich odwołań do komórek w następujący sposób:

=INDIRECT("A"&MAX(IFERROR(MATCH("*",A:A,-1),0),IFERROR(MATCH(9.99999999999999E+307,A:A,1),0)))

Metoda oferowana przez sancho.s jest prawdopodobnie czystszą opcją, ale zmodyfikowałbym część, która znajduje numer wiersza, do tego:

=INDEX(MAX((A:A<>"")*(ROW(A:A))),1)

jedyną różnicą jest to, że „, 1” zwraca pierwszą wartość, a „, 0” zwraca całą tablicę wartości (wszystkie oprócz jednej nie są potrzebne). Nadal preferuję adresowanie komórki do funkcji indeksu, innymi słowy, zwracanie wartości komórki za pomocą:

=INDIRECT("A"&INDEX(MAX((A:A<>"")*(ROW(A:A))),1))

Świetny wątek!

FocusWiz
źródło
0

Jeśli nie boisz się używać tablic, oto bardzo prosta formuła rozwiązania problemu:

= SUMA (JEŻELI (A: A <> ""; 1,0))

Musisz nacisnąć klawisze CTRL + SHIFT + ENTER, ponieważ jest to formuła tablicowa.

Bits_of_guy
źródło
-1

Prosty, który mi pasuje:

=F7-INDEX(A:A,COUNT(A:A))
nemo
źródło
-1

OK, więc miałem ten sam problem co pytający i wypróbowałem obie najlepsze odpowiedzi. Ale tylko błędy w formułach. Okazało się, że muszę zamienić "," na ";" aby formuły działały. Używam XL 2007.

Przykład:

=LOOKUP(2;1/(A:A<>"");A:A)

lub

=INDEX(A:A;MAX((A:A<>"")*(ROW(A:A))))
Julian Kroné
źródło
-3

W przypadku śledzenia wersji (dodawanie litery v na początku numeru) uznałem, że ten działa dobrze w Xcelsius (SAP Dashboards)

="v"&MAX(A2:A500)
Pan B.
źródło
1
Wydaje się niewystarczająco ogólne, ponieważ opiera się na porządku ściśle rosnącym.
Nathan Tuggy,