Jawaban:
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))))
CELL()
atau OFFSET()
), sedangkan yang lebih disukai mengembalikan nilai tanpa memberi tahu Anda di mana tempatnya.
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:
Penjelasan:
(A:A<>"")
mengembalikan array {TRUE,TRUE,..,FALSE,..}
1/(A:A<>"")
memodifikasi larik ini menjadi {1,1,..,#DIV/0!,..}
.LOOKUP
mengharapkan array yang diurutkan dalam urutan menaik , dan dengan mempertimbangkan bahwa jika LOOKUP
fungsi 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 1
dalam 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:
LOOKUP
mengatakan bahwa argumen terakhir result_vector
adalah opsional. Namun jika saya menghilangkannya, saya mendapatkan hasil yang sangat aneh yang tidak saya mengerti.
LOOKUP
fungsi tidak dapat menemukan lookup_value
, fungsi cocok dengan nilai terbesar lookup_vector
yang 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.
=LOOKUP(2,1/(A:A<>""),ROW(A:A))
tetapi menambahkan ROW
fungsi akan menambahkan efek "volatilitas" - rumus akan dihitung ulang setiap kali sel di lembar kerja berubah
Ini opsi lain: =OFFSET($A$1;COUNTA(A:A)-1;0)
COUNTA
sebagai pengganti COUNT
). Belum lagi sel kosong.
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!
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.
TRUE
/ FALSE
), mereka tidak akan terdeteksi. Terlepas dari kenyataan bahwa jawaban ini tidak antipeluru, menurut saya jawaban ini memiliki dampak paling kecil pada kinerja.
=INDEX(N:N,MATCH(1E+306,N:N,1))
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:A65535
dan memberikan perlakuan khusus pada sel terakhir, yaitu A65536
di Excel 2003. Tidak bisa hanya mengatakan A:A
atau bahkan A1:A65536
saat yang terakhir secara otomatis kembali ke A:A
.
Jika Anda benar-benar yakin A65536
kosong, Anda dapat melewati IF
bagian 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))
,.
=INDEX(19:19,COUNTA(19:19))
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:
Halaman resmi Microsoft (cari "Kerugian menggunakan rumus array").
Rumus array mungkin tampak ajaib, tetapi mereka juga memiliki beberapa kelemahan:
A
kejadian dengan a D
. Apa yang saya lakukan salah?
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.
=INDEX(A:A, COUNTA(A:A), 1)
diambil dari sini
=MATCH("*";A1:A10;-1)
untuk data tekstual
=MATCH(0;A1:A10;-1)
untuk data numerik
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
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
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))
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
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.
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!
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.
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))))
Untuk pelacakan versi (menambahkan huruf v ke awal angka), saya menemukan yang ini berfungsi dengan baik di Xcelsius (SAP Dashboards)
="v"&MAX(A2:A500)