Sel tidak kosong terakhir di kolom

112

Adakah yang tahu rumus untuk menemukan nilai sel tidak kosong terakhir di kolom, di Microsoft Excel?

MichaelS
sumber
Saya akan mencari VBA untuk ini.
David Heffernan

Jawaban:

76

Ini bekerja dengan teks dan angka dan tidak peduli jika ada sel kosong, yaitu, ini akan mengembalikan sel tidak kosong terakhir.

Ini harus dimasukkan dalam array , artinya Anda menekan Ctrl-Shift-Enter setelah Anda mengetik atau menempelkannya. Di bawah ini untuk kolom A:

=INDEX(A:A,MAX((A:A<>"")*(ROW(A:A))))
Doug Glancy
sumber
@ Jean-François, Maaf, saya mengetahuinya di komentar tadi malam, tapi salah taruh di postingan asli. Itu berhasil di XL 2007 dan 2010. Terima kasih.
Doug Glancy
Tidak berfungsi untuk saya di Excel 2007. Saya menempelkan rumus yang tepat. Saya memiliki kolom (A), di mana nilainya = ROW () hingga 127ish, dan rumus mengembalikan "1"
DontFretBrett
2
@DontFretBrett, Pastikan untuk memasukkannya sebagai rumus array dengan Ctrl-Shift-Enter seperti yang ditentukan dalam jawaban.
Doug Glancy
@DougGlancy gagal di pihak saya. Terima kasih!
DontFretBrett
1
Perbedaan penting adalah bahwa yang satu ini mengembalikan referensi sel (sehingga bisa diteruskan ke misalnya CELL()atau OFFSET()), sedangkan yang lebih disukai mengembalikan nilai tanpa memberi tahu Anda di mana tempatnya.
GSerg
128

Menggunakan rumus sederhana berikut jauh lebih cepat

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

Untuk Excel 2003:

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

Ini memberi Anda keuntungan sebagai berikut:

  • itu bukan rumus array
  • itu bukan formula yang mudah menguap

Penjelasan:

  • (A:A<>"") mengembalikan array {TRUE,TRUE,..,FALSE,..}
  • 1/(A:A<>"")memodifikasi larik ini menjadi {1,1,..,#DIV/0!,..}.
  • Karena LOOKUPmengharapkan array yang diurutkan dalam urutan menaik , dan dengan mempertimbangkan bahwa jika LOOKUPfungsi tidak dapat menemukan kecocokan yang tepat, ia memilih nilai terbesar dalam lookup_range(dalam kasus kami {1,1,..,#DIV/0!,..}) yang kurang dari atau sama dengan nilai (dalam kasus kami 2), rumus menemukan terakhir 1dalam larik dan mengembalikan nilai yang sesuai dari result_range(parameter ketiga - A:A).

Juga sedikit catatan - rumus di atas tidak memperhitungkan sel dengan kesalahan (Anda dapat melihatnya hanya jika sel yang tidak kosong terakhir memiliki kesalahan). Jika Anda ingin mempertimbangkannya, gunakan:

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

Gambar di bawah ini menunjukkan perbedaannya:

masukkan deskripsi gambar di sini

Dmitry Pavliv
sumber
terima kasih untuk penjelasan dan gambar yang bagus. Masih ada beberapa pertanyaan yang masih terbuka: 1. Dokumentasi yang LOOKUPmengatakan bahwa argumen terakhir result_vectoradalah opsional. Namun jika saya menghilangkannya, saya mendapatkan hasil yang sangat aneh yang tidak saya mengerti.
Honza Zidek
2. Dokumentasi mengatakan "Jika LOOKUPfungsi tidak dapat menemukan lookup_value, fungsi cocok dengan nilai terbesar lookup_vectoryang kurang dari atau sama dengan lookup_value." Jika saya menggunakan =LOOKUP(2,A:A<>"",A:A)tanpa menghasilkan #DIV/0!kesalahan oleh 1/..., tampaknya ia mengembalikan beberapa nilai di tengah vektor. Saya belum menemukan apa fungsi sebenarnya dalam kasus ini.
Honza Zidek
1
Penjelasan yang sangat bagus. Setelah baru-baru ini memangkas hitungan menit dengan memindahkan rumus dari rumus array ke versi non-array, saya selalu siap untuk logika yang berfungsi tanpa memerlukan rumus array.
tobriand
1
@Enissay, ya, yang satu ini akan mengembalikan nomor baris =LOOKUP(2,1/(A:A<>""),ROW(A:A))tetapi menambahkan ROWfungsi akan menambahkan efek "volatilitas" - rumus akan dihitung ulang setiap kali sel di lembar kerja berubah
Dmitry Pavliv
1
Hei yang disana. Terima kasih telah memposting ini. Hanya ingin tahu, saya menemukan rumus yang sama persis dan kata-kata yang hampir sama di exceljet.net/formula/get-value-of-last-non-empty-cell . Apakah itu juga Anda atau orang lain? Tidak ada hubungan yang jelas.
Solomon Rutzky
24

Ini opsi lain: =OFFSET($A$1;COUNTA(A:A)-1;0)

Patrick Honorez
sumber
9
Ini tidak akan berfungsi jika ada sel dengan nilai non-numerik (gunakan COUNTAsebagai pengganti COUNT). Belum lagi sel kosong.
Jean-François Corbett
3
Ini harus di atas. ini sederhana dan tidak bergantung pada detail yang tidak jelas dari fungsi yang tidak umum.
Tmdean
9
Seharusnya tidak di atas karena salah bila hasil sudah tertanam kosong.
Myrddin Emrys
17

Terinspirasi oleh petunjuk luar biasa yang diberikan oleh jawaban Doug Glancy, saya menemukan cara untuk melakukan hal yang sama tanpa memerlukan rumus array. Jangan tanya saya mengapa, tapi saya ingin menghindari penggunaan rumus array jika memungkinkan (bukan karena alasan tertentu, itu hanya gaya saya).

Ini dia:

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

Untuk mencari baris terakhir yang tidak kosong menggunakan Kolom A sebagai kolom referensi

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

Untuk mencari kolom tidak kosong terakhir menggunakan baris 1 sebagai baris referensi

Ini dapat digunakan lebih lanjut dalam hubungannya dengan fungsi indeks untuk secara efisien mendefinisikan rentang bernama dinamis, tetapi ini adalah sesuatu untuk posting lain karena ini tidak terkait dengan pertanyaan langsung yang dibahas di sini.

Saya telah menguji metode di atas dengan Excel 2010, baik "native" dan dalam "Compatibility Mode" (untuk versi Excel yang lebih lama) dan berhasil. Sekali lagi, dengan ini Anda tidak perlu melakukan Ctrl + Shift + Enter. Dengan memanfaatkan cara kerja sumproduct di Excel, kita dapat membantu kebutuhan untuk menjalankan operasi array tetapi kita melakukannya tanpa formula-array. Saya berharap seseorang di luar sana dapat menghargai keindahan, kesederhanaan, dan keanggunan solusi produk yang diusulkan ini sama seperti saya. Saya tidak membuktikan efisiensi memori dari solusi di atas. Hanya saja mereka sederhana, terlihat cantik, membantu tujuan yang dimaksudkan dan cukup fleksibel untuk memperluas penggunaannya untuk tujuan lain :)

Semoga ini membantu!

Semua yang terbaik!

Santiago
sumber
1
Tentang mengapa menggunakan rumus non-array, lihat jawaban di bawah ini .
sancho.s ReinstateMonicaCellio
17

Saya tahu pertanyaan ini sudah tua, tetapi saya tidak puas dengan jawaban yang diberikan.

  • LOOKUP, VLOOKUP dan HLOOKUP memiliki masalah kinerja dan tidak boleh digunakan.

  • Fungsi array memiliki banyak overhead dan juga dapat memiliki masalah performa, jadi sebaiknya hanya digunakan sebagai pilihan terakhir.

  • HITUNGAN dan COUNTA mengalami masalah jika datanya tidak secara berdekatan tidak kosong, yaitu Anda memiliki spasi kosong dan kemudian data lagi dalam kisaran yang dimaksud

  • TIDAK LANGSUNG mudah menguap sehingga hanya digunakan sebagai upaya terakhir

  • OFFSET mudah berubah sehingga hanya digunakan sebagai pilihan terakhir

  • referensi apa pun ke baris atau kolom terakhir yang memungkinkan (baris ke 65536 di Excel 2003, misalnya) tidak kuat dan menghasilkan overhead tambahan

Ini yang saya gunakan

  • ketika tipe datanya dicampur: =max(MATCH(1E+306,[RANGE],1),MATCH("*",[RANGE],-1))

  • ketika diketahui bahwa datanya hanya berisi angka: =MATCH(1E+306,[RANGE],1)

  • ketika diketahui bahwa data hanya berisi teks: =MATCH("*",[RANGE],-1)

MATCH memiliki overhead terendah dan non-volatile, jadi jika Anda bekerja dengan banyak data, ini yang terbaik untuk digunakan.

W5ALIVE
sumber
Ini adalah jawaban yang bagus (+1), tetapi masih ada beberapa celah yang dapat dilewatkan oleh metode ini. Misalnya jika ada sel dengan nilai logika ( TRUE/ FALSE), mereka tidak akan terdeteksi. Terlepas dari kenyataan bahwa jawaban ini tidak antipeluru, menurut saya jawaban ini memiliki dampak paling kecil pada kinerja.
ImaginaryHuman072889
2
Kecocokan mengembalikan indeks, bukan nilai sel. Anda dapat menggunakan fungsi indeks untuk mendapatkan nilainya. Juga, Anda mungkin harus memasukkan sesuatu tentang apa [RANGE] yang seharusnya. Saya memilih seluruh kolom dengan menggunakan "N: N". Berikut adalah contoh yang berhasil bagi saya: =INDEX(N:N,MATCH(1E+306,N:N,1))
swimfar
10

Ini berfungsi di Excel 2003 (& lebih baru dengan suntingan kecil, lihat di bawah). Tekan Ctrl + Shift + Enter (bukan hanya Enter) untuk memasukkan ini sebagai rumus array.

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

Sadarilah bahwa Excel 2003 tidak dapat menerapkan rumus array ke seluruh kolom. Melakukannya akan menghasilkan #NUM!; hasil yang tidak dapat diprediksi mungkin terjadi! (EDIT : Informasi yang bertentangan dari Microsoft: Hal yang sama mungkin atau mungkin tidak benar tentang Excel 2007; masalah mungkin telah diperbaiki pada tahun 2010. )

Itu sebabnya saya menerapkan rumus array ke range A1:A65535dan memberikan perlakuan khusus pada sel terakhir, yaitu A65536di Excel 2003. Tidak bisa hanya mengatakan A:Aatau bahkan A1:A65536saat yang terakhir secara otomatis kembali ke A:A.

Jika Anda benar-benar yakin A65536kosong, Anda dapat melewati IFbagian ini:

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

Perhatikan bahwa jika Anda menggunakan Excel 2007 atau 2010, nomor baris terakhir adalah 1048576 bukan 65536, jadi sesuaikan di atas sebagaimana mestinya.

Jika tidak ada sel kosong di tengah data Anda, saya hanya akan menggunakan rumus yang lebih sederhana =INDEX(A:A,COUNTA(A:A)),.

Jean-François Corbett
sumber
Untuk ROW alih-alih kolom, ini berhasil untuk saya=INDEX(19:19,COUNTA(19:19))
Serj Sagan
8

Solusi alternatif tanpa rumus array, mungkin lebih kuat daripada jawaban sebelumnya dengan solusi (petunjuk ke a) tanpa rumus array , adalah

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

Lihat jawaban ini sebagai contoh. Kudos to Brad dan barry houdini , yang membantu menjawab pertanyaan ini .

Kemungkinan alasan untuk memilih rumus non-larik diberikan dalam:

  1. Halaman resmi Microsoft (cari "Kerugian menggunakan rumus array").
    Rumus array mungkin tampak ajaib, tetapi mereka juga memiliki beberapa kelemahan:

    • Anda mungkin terkadang lupa menekan CTRL + SHIFT + ENTER. Ingatlah untuk menekan kombinasi tombol ini setiap kali Anda memasukkan atau mengedit rumus array.
    • Pengguna lain mungkin tidak memahami rumus Anda. Rumus array relatif tidak terdokumentasi, jadi jika orang lain perlu mengubah buku kerja Anda, Anda harus menghindari rumus array atau memastikan pengguna tersebut memahami cara mengubahnya.
    • Bergantung pada kecepatan pemrosesan dan memori komputer Anda, rumus array besar dapat memperlambat penghitungan.
  2. Array Formula Sesat .

sancho.s ReinstateMonicaCellio
sumber
Saya tidak bisa mendapatkan ini untuk bekerja dengan kolom D. Saya mengganti semua Akejadian dengan a D. Apa yang saya lakukan salah?
Marc. 2377
5

Jika Anda mencari di Kolom (A) gunakan:

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

jika rentang Anda adalah A1: A10, Anda dapat menggunakan:

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

dalam rumus ini:

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

mengembalikan nomor baris terakhir yang tidak kosong, dan tidak langsung () mengembalikan nilai sel.

Sharif Lotfi
sumber
2

=INDEX(A:A, COUNTA(A:A), 1)diambil dari sini

HattrickNZ
sumber
2

=MATCH("*";A1:A10;-1) untuk data tekstual

=MATCH(0;A1:A10;-1) untuk data numerik

liharvi
sumber
Harap gunakan blok kode saat memberikan cuplikan kode dalam jawaban Anda.
β.εηοιτ.βε
Saya pikir rumus ini akan memberi kita sel tidak kosong pertama, bukan sel tidak kosong terakhir.
Baodad
2

Saya sudah mencoba semua versi non-volatile tetapi Tidak satu pun versi yang diberikan di atas berhasil .. excel 2003 / 2007update. Tentunya ini bisa dilakukan di excel 2003. Bukan sebagai array atau rumus standar. Saya hanya mendapatkan kesalahan kosong, 0 atau #value. Jadi saya menggunakan metode volatile .. Ini berhasil ..

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

@Julian Kroné .. Menggunakan ";" bukannya "," TIDAK berfungsi! Saya pikir Anda menggunakan Libre Office bukan MS excel? LOOKUP sangat menjengkelkan sehingga saya menggunakannya hanya sebagai upaya terakhir

terpencil
sumber
0

Tempatkan kode ini dalam modul VBA. Menyimpan. Di bawah fungsi, Pencarian yang ditentukan pengguna untuk fungsi ini.

Function LastNonBlankCell(Range As Excel.Range) As Variant
    Application.Volatile
    LastNonBlankCell = Range.End(xlDown).Value
End Function
Mac vd Wsthuizen
sumber
2
Ini belum tentu sel kosong TERAKHIR, hanya sel kosong NEXT yang dimulai dari atas.
Portland Runner
Pertanyaannya adalah tentang formula, bukan VBA
Patrick Honorez
0

untuk data tekstual:

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

untuk data numerik:

EQUIV(0;A1:A10;-1)

Ini memberi Anda indeks relatif dari sel tidak kosong terakhir dalam kisaran yang dipilih (di sini A1: A10).

Jika Anda ingin mendapatkan nilainya, akses melalui INDIRECT setelah membangun -tekstual- referensi sel absolut, misalnya:

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

Saya juga memiliki masalah yang sama. Formula ini juga bekerja dengan baik: -

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

14 adalah nomor baris dari baris pertama dalam baris yang ingin Anda hitung.

Gigi Cakar Kronis

Gigi Cakar Kronis
sumber
0

Saya menggunakan HLOOKUP

A1berkencan; A2:A8memiliki prakiraan yang ditangkap pada waktu yang berbeda, saya ingin yang terbaru

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

Ini menggunakan rumus hlookup standar dengan array pencarian yang ditentukan oleh jumlah entri.

Chris
sumber
0

Jika Anda tahu bahwa tidak akan ada sel kosong di antaranya, cara tercepat adalah ini.

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

Ini hanya menghitung sel yang tidak kosong dan merujuk ke sel yang sesuai.

Ini juga dapat digunakan untuk rentang tertentu.

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

Ini mengembalikan sel tidak kosong terakhir dalam rentang O4: O34.

Tassos Mallis
sumber
0

Untuk Microsoft office 2013

"Terakhir tapi satu" dari baris yang tidak kosong:

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

Baris "terakhir" tidak kosong:

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

Formula ini bekerja dengan saya untuk kantor 2010:

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

A1: sel pertama A100: merujuk ke sel terakhir dalam perbandingan

Wahed
sumber
0

Saya pikir tanggapan dari W5ALIVE paling dekat dengan apa yang saya gunakan untuk menemukan baris terakhir data dalam kolom. Dengan asumsi saya mencari baris terakhir dengan data di Kolom A, saya akan menggunakan yang berikut ini untuk pencarian yang lebih umum:

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

MATCH pertama akan menemukan sel teks terakhir dan MATCH kedua menemukan sel numerik terakhir. Fungsi IFERROR mengembalikan nol jika MATCH pertama menemukan semua sel numerik atau jika kecocokan kedua menemukan semua sel teks.

Pada dasarnya ini adalah variasi kecil dari teks campuran dan solusi angka W5ALIVE.

Dalam menguji waktu, ini secara signifikan lebih cepat daripada variasi LOOKUP yang setara.

Untuk mengembalikan nilai sebenarnya dari sel terakhir itu, saya lebih suka menggunakan referensi sel tidak langsung seperti ini:

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

Metode yang ditawarkan oleh sancho.s mungkin merupakan opsi yang lebih bersih, tetapi saya akan mengubah bagian yang menemukan nomor baris menjadi ini:

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

satu-satunya perbedaan adalah bahwa ", 1" mengembalikan nilai pertama sedangkan ", 0" mengembalikan seluruh larik nilai (semua kecuali satu tidak diperlukan). Saya masih cenderung lebih suka mengarahkan sel ke fungsi indeks di sana, dengan kata lain, mengembalikan nilai sel dengan:

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

Benang bagus!

FocusWiz
sumber
0

Jika Anda tidak takut menggunakan array, maka berikut ini adalah rumus yang sangat sederhana untuk menyelesaikan masalah tersebut:

= SUM (IF (A: A <> "", 1,0))

Anda harus menekan CTRL + SHIFT + ENTER karena ini adalah rumus array.

Bits_of_guy
sumber
-1

Yang sederhana yang berhasil untuk saya:

=F7-INDEX(A:A,COUNT(A:A))
nemo
sumber
-1

Oke, jadi saya memiliki masalah yang sama dengan penanya, dan mencoba kedua jawaban teratas. Tetapi hanya mendapatkan kesalahan rumus. Ternyata saya perlu menukar "," menjadi ";" agar rumus bekerja. Saya menggunakan XL 2007.

Contoh:

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

atau

=INDEX(A:A;MAX((A:A<>"")*(ROW(A:A))))
Julian Kroné
sumber
-3

Untuk pelacakan versi (menambahkan huruf v ke awal angka), saya menemukan yang ini berfungsi dengan baik di Xcelsius (SAP Dashboards)

="v"&MAX(A2:A500)
Tuan B
sumber
1
Tampaknya tidak cukup umum, karena mengandalkan urutan naik secara ketat.
Nathan Tuggy