Bir sütundaki son boş olmayan hücre


Yanıtlar:


76

Bu hem metin hem de sayılarla çalışır ve boş hücreler olup olmadığı umurunda değildir, yani boş olmayan son hücreyi döndürür.

Dizi olarak girilmesi gerekir , yani yazdıktan veya yapıştırdıktan sonra Ctrl-Shift-Enter tuşlarına basmanız gerekir. Aşağıdakiler A sütunu içindir:

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

@ Jean-François, Üzgünüm, dün gece bir yorumda bunu kabul ettim ama yanlışlıkla orijinal gönderiye koydum. XL 2007 ve 2010'da çalışıyor. Teşekkürler.
Doug Glancy

Excel 2007'de benim için çalışmıyor. Tam formülü yapıştırdım. Değerlerin 127ish'e kadar = SATIR () olduğu ve formülün "1" döndürdüğü bir sütun (A) var
DontFretBrett

2
@DontFretBrett, cevabında belirtildiği gibi Ctrl-Shift-Enter ile bir dizi formülü olarak girdiğinizden emin olun.
Doug Glancy

@DougGlancy benim açımdan başarısız. Teşekkür ederim!
DontFretBrett

1
Önemli fark, bunun bir hücre referansı döndürmesidir (böylece, örneğin CELL()veya 'ye aktarılabilir OFFSET()), oysa daha fazla oy alan , size nerede olduğunu söylemeden bir değer döndürür.
GSerg

128

Aşağıdaki basit formülü kullanmak çok daha hızlı

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

Excel 2003 için:

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

Size aşağıdaki avantajları sağlar:

  • öyle dizi değil formül
  • bu kadar uçucu olmayan formül

Açıklama:

  • (A:A<>"") dizi döndürür {TRUE,TRUE,..,FALSE,..}
  • 1/(A:A<>"")bu diziyi olarak değiştirir {1,1,..,#DIV/0!,..}.
  • Yana LOOKUPbeklediği sıralanmış içinde dizi artan düzeni ve eğer dikkate alarak LOOKUPfonksiyonu tam bir eşleşme bulamazsa, bu en büyük değeri seçer lookup_range(bizim durumumuzda {1,1,..,#DIV/0!,..}(bizim durumumuzda veya değere eşit az olduğunu) 2), formül 1dizinin sonunu bulur ve ilgili değeri result_range(üçüncü parametre - A:A) döndürür .

Ayrıca küçük bir not - yukarıdaki formül hatalı hücreleri hesaba katmaz (bunu yalnızca son boş olmayan hücrede hata varsa görebilirsiniz). Bunları hesaba katmak istiyorsanız, kullanın:

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

aşağıdaki resim farkı göstermektedir:

görüntü açıklamasını buraya girin


açıklama ve güzel resim için teşekkürler. Yine de bazı sorular açık kalır: 1. LOOKUPSon argümanın result_vectoristeğe bağlı olduğunu söyleyen belgeler . Ancak atlarsam, anlamadığım çok garip bir sonuç alıyorum.
Honza Zidek

2. Dokümantasyon "Eğer LOOKUPfonksiyon bulamazsa, lookup_valuefonksiyon en büyük değerle eşleşiyorsa lookup_vectorveya ona eşittir lookup_value." Hatayı =LOOKUP(2,A:A<>"",A:A)oluşturmadan kullanırsam , ortada bir değer döndürüyor gibi görünüyor vektör. Bu durumda tam işlevselliğin ne olduğunu bulamadım. #DIV/0!1/...
Honza Zidek

1
Çok güzel bir açıklama. Son zamanlarda formülleri dizi formüllerinden dizi olmayan sürümlere taşıyarak hesaplamadan dakikalar sonra tasarruf ettikten sonra, dizi formülleri gerektirmeden çalışan mantığa her zaman hazırım.
tobriand

1
@Enissay, evet, bu satır numarasını döndürecek, =LOOKUP(2,1/(A:A<>""),ROW(A:A))ancak ROWişlev eklemek "oynaklık" efekti ekleyecek - formül, wroksheet üzerindeki herhangi bir hücre her değiştiğinde yeniden hesaplanacak
Dmitry Pavliv

1
Selam. Bunu gönderdiğiniz için teşekkürler. Merak ediyorum, aynı formülleri ve neredeyse aynı ifadeyi exceljet.net/formula/get-value-of-last-non-empty-cell adresinde buldum . Bu da sen mi yoksa başkası mı? Belirgin bir bağlantı yok.
Solomon Rutzky

24

İşte başka bir seçenek: =OFFSET($A$1;COUNTA(A:A)-1;0)


9
Sayısal olmayan değerlere sahip hücreler varsa bu çalışmayacaktır ( COUNTAyerine kullanın COUNT). Boş hücrelerden bahsetmiyorum bile.
Jean-François Corbett

3
Bu en üstte olmalı. basittir ve yaygın olmayan işlevlerin belirsiz ayrıntılarına dayanmaz.
Tmdean

9
Üstte olmamalıdır çünkü sonuçlarda boşluklar gömülü olduğunda yanlıştır.
Myrddin Emrys

17

Doug Glancy'nin cevabının verdiği büyük ipucundan esinlenerek, aynı şeyi bir dizi formülüne ihtiyaç duymadan yapmanın bir yolunu buldum. Bana nedenini sormayın, ancak mümkünse dizi formüllerinin kullanımından kaçınmaya istekliyim (herhangi bir nedenle değil, bu sadece benim tarzım).

İşte burada:

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

Referans sütun olarak Sütun A kullanılarak boş olmayan son satırı bulmak için

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

1. satırı referans satırı olarak kullanarak son boş olmayan sütunu bulmak için

Bu, dinamik adlandırılmış aralıkları verimli bir şekilde tanımlamak için indeks işlevi ile birlikte kullanılabilir, ancak bu, burada ele alınan acil soruyla ilgili olmadığından başka bir gönderi için bir şeydir.

Yukarıdaki yöntemleri Excel 2010 ile hem "yerel olarak" hem de "Uyumluluk Modu" nda (Excel'in eski sürümleri için) test ettim ve çalışıyorlar. Yine, bunlarla Ctrl + Shift + Enter tuşlarından herhangi birini yapmanıza gerek yoktur. Excel'de sumproduct'ın çalışma şeklinden yararlanarak, dizi işlemlerini taşıma ihtiyacını karşılayabiliriz, ancak bunu bir dizi formülü olmadan yaparız. Umarım dışarıdaki biri bu önerilen sumproduct çözümlerinin güzelliğini, sadeliğini ve zarafetini benim kadar takdir edebilir. Yine de yukarıdaki çözümlerin bellek verimliliğini onaylamıyorum. Sadece basit olmaları, güzel görünmeleri, amaçlanan amaca yardımcı olmaları ve kullanımlarını başka amaçlara genişletecek kadar esnek olmaları :)

Bu yardımcı olur umarım!

Herşey gönlünce olsun!


1
Neden dizi olmayan formüllerin kullanıldığına gelince, aşağıdaki cevaba bakın .
sancho.s ReinstateMonicaCellio

17

Bu sorunun eski olduğunu biliyorum, ancak verilen cevaplardan memnun değilim.

  • LOOKUP, DÜŞEYARA ve YATAYARA performans sorunları içerir ve gerçekten asla kullanılmamalıdır.

  • Dizi işlevlerinin çok fazla ek yükü vardır ve ayrıca performans sorunları da olabilir, bu nedenle yalnızca son çare olarak kullanılmalıdır.

  • Veriler bitişik olarak boş değilse COUNT ve COUNTA sorunla karşılaşır, yani boşluklarınız varsa ve ardından söz konusu aralıkta tekrar verileriniz olur

  • DOLAYLI uçucudur, bu nedenle yalnızca son çare olarak kullanılmalıdır

  • OFFSET uçucudur, bu nedenle yalnızca son çare olarak kullanılmalıdır

  • olası son satır veya sütuna yapılan başvurular (örneğin, Excel 2003'teki 65536. satır) sağlam değildir ve fazladan ek yüke neden olur

Bu benim kullandığım şey

  • veri türü karıştırıldığında: =max(MATCH(1E+306,[RANGE],1),MATCH("*",[RANGE],-1))

  • verilerin yalnızca sayı içerdiği bilindiğinde: =MATCH(1E+306,[RANGE],1)

  • verilerin yalnızca metin içerdiği bilindiğinde: =MATCH("*",[RANGE],-1)

MATCH en düşük ek yüke sahiptir ve uçucu değildir, bu nedenle çok fazla veriyle çalışıyorsanız, en iyisi budur.


Bu iyi bir cevap (+1), ancak yine de bu yöntemin gözden kaçırabileceği bazı boşluklar var. Örneğin, mantıksal değerlere ( TRUE/ FALSE) sahip hücreler varsa , bunlar algılanmayacaktır. Bu cevabın kesin olmamasına rağmen, yine de bu cevabın performans üzerinde en az etkiye sahip olduğunu düşünüyorum.
ImaginaryHuman072889

2
Match, hücrenin değerini değil, bir dizin döndürür. Değeri almak için dizin işlevini kullanabilirsiniz. Ayrıca, muhtemelen [ARALIK] ile ilgili bir şey eklemelisiniz. "N: N" kullanarak tüm sütunu seçtim. İşte benim için çalışan bir örnek: =INDEX(N:N,MATCH(1E+306,N:N,1))
swimfar

10

Bu, Excel 2003'te çalışır (ve daha sonra küçük düzenlemelerle, aşağıya bakın). Bunu bir dizi formülü olarak girmek için Ctrl + Shift + Enter tuşlarına (yalnızca Enter değil) basın.

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

Excel 2003 olduğunu unutmayın yapamaz bütün bir sütuna dizi formülünün uygulanması. Bunu yapmak verim sağlar #NUM!; öngörülemeyen sonuçlar ortaya çıkabilir! (DÜZENLEME : Microsoft'tan çelişkili bilgiler: Aynı durum Excel 2007 için de geçerli olabilir veya olmayabilir ; sorun 2010'da düzeltilmiş olabilir . )

Bu yüzden dizi formülünü aralık A1:A65535ve son hücreye özel bir muamele vermek için uyguluyorum, ki bu A65536Excel 2003'te. Sadece söyleyemez A:Aya da A1:A65536ikincisi otomatik olarak döndüğü gibi bile olamaz A:A.

A65536Boş olduğundan kesinlikle eminseniz , IFbölümü atlayabilirsiniz :

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

Excel 2007 veya 2010 kullanıyorsanız, son satır numarasının 65536 değil 1048576 olduğunu unutmayın, bu nedenle yukarıdakileri uygun şekilde ayarlayın.

Verilerinizin ortasında boş hücre yoksa, daha basit olan formülü kullanırdım =INDEX(A:A,COUNTA(A:A)).


Sütun yerine SATIR için, bu benim için çalıştı=INDEX(19:19,COUNTA(19:19))
Serj Sagan

8

Muhtemelen dizi formülleri olmayan alternatif bir çözüm, daha sağlam ve daha dizi formülleri olmayan çözelti, bir (a ipucu) ile bir önceki yanıt , bir

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

Bu yanıtı örnek olarak görün . Bu sorunun çözülmesine yardımcı olan Brad ve Barry Houdini'ye şeref .

Dizi olmayan bir formülü tercih etmenin olası nedenleri aşağıda verilmiştir:

  1. Resmi bir Microsoft sayfası ("Dizi formüllerini kullanmanın dezavantajları" na bakın).
    Dizi formülleri büyülü görünebilir, ancak bazı dezavantajları da vardır:

    • Ara sıra CTRL + SHIFT + ENTER tuşlarına basmayı unutabilirsiniz. Bir dizi formülünü her girdiğinizde veya düzenlediğinizde bu tuş kombinasyonuna basmayı unutmayın.
    • Diğer kullanıcılar formüllerinizi anlamayabilir. Dizi formülleri nispeten belgelenmemiş olduğundan, diğer kişilerin çalışma kitaplarınızı değiştirmesi gerekiyorsa, dizi formüllerinden kaçınmalı veya bu kullanıcıların bunları nasıl değiştireceklerini anladığından emin olmalısınız.
    • Bilgisayarınızın işlem hızına ve belleğine bağlı olarak, büyük dizi formülleri hesaplamaları yavaşlatabilir.
  2. Dizi Formülü Sapkınlığı .


Bunun D sütununda çalışmasını sağlayamıyorum. Tüm Aoluşumları bir ile değiştirdim D. Neyi yanlış yapıyorum?
Marc. 2377

5

Sütun (A) 'da arama yaparsanız şunu kullanın:

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

Aralığınız A1: A10 ise şunları kullanabilirsiniz:

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

bu formülde:

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

son boş olmayan satır numarasını döndürür ve dolaylı () hücre değerini döndürür.



2

=MATCH("*";A1:A10;-1) metin verileri için

=MATCH(0;A1:A10;-1) sayısal veriler için


Lütfen yanıtlarınızda kod parçacığı sağlarken kod bloklarını kullanın.
β.εηοιτ.βε

Bu formüllerin bize boş olmayan son hücreyi değil, ilk boş olmayan hücreyi vereceğini düşünüyorum.
Baodad

2

Ive tüm uçucu olmayan sürümleri denedim ama yukarıda verilen bir sürüm işe yaramadı .. excel 2003 / 2007güncelleme. Elbette bu excel 2003'te yapılabilir. Dizi veya standart formül olarak değil. Ya sadece boş, 0 veya # değer hatası alıyorum. Bu yüzden uçucu yöntemlere başvurdum .. Bu işe yaradı ..

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

@Julian Kroné .. ";" kullanarak yerine "," ÇALIŞMAZ! Sanırım MS excel değil Libre Office mi kullanıyorsunuz? LOOKUP o kadar sinir bozucu derecede belirsiz ki, onu yalnızca son çare olarak kullanıyorum


0

Bu kodu bir VBA modülüne yerleştirin. Kayıt etmek. İşlevler altında, Kullanıcı tanımlı Bu işlevi arayın.

Function LastNonBlankCell(Range As Excel.Range) As Variant
    Application.Volatile
    LastNonBlankCell = Range.End(xlDown).Value
End Function

2
Bu mutlaka SON boş hücre olmak zorunda değildir, yalnızca üstten başlayan SONRAKİ boş hücre olmalıdır.
Portland Runner

Soru bir formülle ilgili, VBA değil
Patrick Honorez

0

metin verileri için:

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

sayısal veriler için:

EQUIV(0;A1:A10;-1)

Bu size seçilen aralıktaki boş olmayan son hücrenin göreli dizinini verir (burada A1: A10).

Değeri almak istiyorsanız, mutlak hücre referansını metinsel olarak oluşturduktan sonra DOLAYLI üzerinden erişin, örneğin:

INDIRECT("A" & (nb_line_where_your_data_start + EQUIV(...) - 1))

0

Ben de aynı sorunu yaşadım. Bu formül aynı zamanda eşit derecede iyi çalışır: -

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

14 saymak istediğiniz satırlardaki ilk satırın satır numarasıdır.

Kronik Pençe Dişi


0

HLOOKUP kullandım

A1bir tarihi var; A2:A8farklı zamanlarda alınan tahminler var, en yenisini istiyorum

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

Bu, giriş sayısı ile tanımlanan arama dizisi ile standart bir hlookup formülü kullanır.


0

Arada boş hücre olmayacağını biliyorsanız, en hızlı yol budur.

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

Yalnızca boş olmayan hücreleri sayar ve uygun hücreye başvurur.

Belirli bir aralık için de kullanılabilir.

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

Bu, O4: O34 aralığındaki son boş olmayan hücreyi döndürür.


0

Microsoft office 2013 için

Boş olmayan bir satırın "sonuncusu":

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

"Son" boş olmayan satır:

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

0

Bu formül, ofis 2010 için benimle çalıştı:

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

A1: ilk hücre A100: karşılaştırmada son hücreye bakın


0

W5ALIVE'dan gelen yanıtın, bir sütundaki son veri satırını bulmak için kullandığıma en yakın olduğunu düşünüyorum. Sütun A'daki verilere sahip son satırı aradığımı varsayarsak, daha genel arama için aşağıdakileri kullanırdım:

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

İlk MATCH son metin hücresini bulacaktır ve ikinci MATCH son sayısal hücreyi bulacaktır. EĞERHATA işlevi, ilk KAÇINCI tüm sayısal hücreleri bulursa veya ikinci eşleşme tüm metin hücrelerini bulursa sıfır döndürür.

Temel olarak bu, W5ALIVE'ın karma metin ve sayı çözümünün küçük bir varyasyonudur.

Zamanlamayı test ederken, bu, eşdeğer ARA varyasyonlarından önemli ölçüde daha hızlıydı.

Bu son hücrenin gerçek değerini döndürmek için, dolaylı hücre referansını şu şekilde kullanmayı tercih ederim:

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

Sancho.s tarafından sunulan yöntem belki daha temiz bir seçenektir, ancak satır numarasını bulan kısmı buna göre değiştirirdim:

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

tek fark, ", 1" ilk değeri döndürürken ", 0" değer dizisinin tamamını döndürmesidir (biri hariç tümü gerekli değildir). Hücreyi burada indeks işlevine yönlendirmeyi, başka bir deyişle hücre değerini şu şekilde döndürmeyi tercih ediyorum:

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

Harika iş parçacığı!


0

Dizileri kullanmaktan korkmuyorsanız, aşağıdaki problemi çözmek için çok basit bir formül:

= TOPLA (EĞER (A: A <> "", 1,0))

Bu bir dizi formülü olduğundan CTRL + ÜST KRKT + ENTER tuşlarına basmalısınız.



-1

Tamam, soruyu soranla aynı sorunu yaşadım ve her iki en iyi yanıtı da denedim. Ama sadece formül hataları alıyorum. "," İle ";" değiştirmem gerektiği ortaya çıktı. formüllerin çalışması için. XL 2007 kullanıyorum.

Misal:

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

veya

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

-3

Sürüm izleme için (sayının başına v harfini ekleyerek), bunun Xcelsius'ta (SAP Dashboards) iyi çalıştığını buldum

="v"&MAX(A2:A500)

1
Kesinlikle artan düzene dayandığı için yeterince genel görünmüyor.
Nathan Tuggy
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.