Saya sudah terbiasa bekerja dengan VLOOKUP tetapi kali ini saya memiliki tantangan. Saya tidak ingin nilai yang cocok pertama, tetapi yang terakhir. Bagaimana? (Saya bekerja dengan LibreOffice Calc tetapi solusi MS Excel seharusnya sama-sama berguna.)
Alasannya adalah bahwa saya memiliki dua kolom teks dengan ribuan baris, katakanlah satu adalah daftar penerima pembayaran transaksi (Amazon, Ebay, majikan, toko kelontong, dll.) Dan yang lainnya adalah daftar kategori pengeluaran (upah, pajak, rumah tangga, sewa, dll.). Beberapa transaksi tidak memiliki kategori pengeluaran yang sama setiap waktu, dan saya ingin mengambil yang terakhir digunakan. Perhatikan bahwa daftar ini tidak diurutkan berdasarkan kolom (sebenarnya berdasarkan tanggal), dan saya tidak ingin mengubah urutan pengurutan.
Apa yang saya miliki (tidak termasuk penanganan kesalahan) adalah rumus "pertandingan pertama" yang biasa:
=VLOOKUP(
[payee field] , [payee+category range] , [index of category column] ,
0 )
Saya telah melihat solusi seperti ini, tetapi saya mendapatkan #DIV/0!
kesalahan:
=LOOKUP(2 , 1/( [payee range] = [search value] ) , [category range] )
Solusinya dapat berupa formula apa pun, tidak harus VLOOKUP. Saya juga dapat menukar kolom penerima pembayaran / kategori di sekitar. Tolong, tidak ada perubahan dalam kolom penyortiran.
Poin bonus untuk solusi yang memilih nilai paling sering daripada yang terakhir!
sumber
IF
tidak dapat menangani array.Evaluate Formula
untuk melihat bagian mana dari rumus yang menghasilkan kesalahan. Fitur ini ada di Excel, dan saya akan terkejut jika LibreOffice Calc tidak memiliki fitur yang sama.=VLOOKUP(J1061;$J$2:$K$9999;2;0)
mana col J berisi penerima pembayaran dan col K kategori. Ini mengembalikan pertandingan pertama seperti yang diharapkan.(Menjawab di sini karena tidak ada pertanyaan terpisah untuk data yang diurutkan.)
Jika data yang diurutkan, Anda bisa menggunakan
VLOOKUP
denganrange_lookup
argumenTRUE
(atau dihilangkan, karena itu default), yang secara resmi dijelaskan untuk Excel sebagai "mencari pertandingan perkiraan".Dengan kata lain, untuk data yang diurutkan:
FALSE
mengembalikan nilai pertama , danTRUE
mengembalikan nilai terakhir .Ini sebagian besar tidak berdokumen dan tidak jelas, tetapi tanggal untuk VisiCalc (1979), dan hari ini memegang setidaknya dalam Microsoft Excel, LibreOffice Calc, dan Google Sheets. Hal ini pada akhirnya karena pelaksanaan awal
LOOKUP
di VisiCalc (dan dari situVLOOKUP
danHLOOKUP
), ketika tidak ada parameter keempat. Nilai ditemukan oleh pencarian biner , menggunakan terikat kiri inklusif dan terikat kanan eksklusif (implementasi umum dan elegan), yang menghasilkan perilaku ini.Secara teknis ini berarti bahwa seseorang memulai pencarian dengan interval kandidat
[0, n)
, di manan
panjang array, dan kondisi loop invarian adalah bahwaA[imin] <= key && key < A[imax]
(batas kiri adalah <= target, batas kanan, yang dimulai satu setelah akhir, adalah > target; untuk memvalidasi, baik memeriksa nilai pada titik akhir sebelumnya, atau memeriksa hasil setelah), dan berturut-turut membagi dua dan memilih pihak mana saja yang mempertahankan invarian ini: dengan mengesampingkan satu sisi akan, sampai Anda mencapai interval dengan 1 term[k, k+1)
,, dan Algoritma kemudian kembalik
. Ini tidak perlu kecocokan persis (!): Itu hanya kecocokan terdekat dari bawah. Dalam hal duplikat pertandingan, ini menghasilkan mengembalikan pertandingan terakhir , karena mengharuskan nilai berikutnya lebih besardaripada kunci (atau akhir array). Dalam kasus duplikat Anda memerlukan beberapa perilaku, dan ini masuk akal dan mudah diimplementasikan.Perilaku ini dinyatakan secara eksplisit dalam artikel Pangkalan Pengetahuan Microsoft yang lama ini (penekanan ditambahkan): "XL: Cara Mengembalikan Pertandingan Pertama atau Terakhir dalam Array" ( Q214069 ):
Dokumentasi resmi untuk beberapa spreadsheet mengikuti; tidak dalam perilaku "pertandingan terakhir" yang dinyatakan, tetapi tersirat dalam dokumentasi Google Sheets:
Microsoft Excel
Google Sheets :
sumber
Jika nilai dalam array pencarian berurutan (yaitu Anda sedang mencari nilai terbesar, seperti tanggal terbaru), Anda bahkan tidak perlu menggunakan fungsi INDIRECT. Coba kode sederhana ini:
Sekali lagi, masukkan formula menggunakan CTRL + SHIFT + ENTER
sumber
Saya mendapat nilai paling sering. Tidak yakin apakah itu akan berfungsi di libreOffice, tetapi tampaknya bekerja di excel
Kolom A akan menjadi penerima pembayaran, kolom B akan menjadi kategori, D2 adalah penerima pembayaran yang ingin Anda filter. Saya tidak yakin mengapa ini menempatkan linebreak tambahan pada fungsi di atas.
Fungsi saya untuk menemukan sel terakhir adalah sebagai berikut:
Secara tidak langsung saya menentukan kolom yang ingin saya kembalikan dan menemukan baris secara langsung (jadi saya tidak perlu mengurangi jumlah baris tajuk.
Kedua fungsi ini harus dimasukkan menggunakan Ctrl + shift + enter
sumber
Ini akan memberi Anda nilai terakhir
Apakah saya mendapatkan poin bonus karena terlambat 3 tahun?
sumber
Anda mendapat
#DIV/0!
kesalahan karena Anda sebaiknya menulis rumus seperti:ini akan berfungsi dan akan menemukan kecocokan terakhir.
([payee range] = [search value])
: boolean matrix TRUE / FALSEIF(([payee range] = [search value]);1;"")
: matriks pseudo-boolean 1 / ""=LOOKUP(2; {pseudo-boolean matrix 1/""} );[category range])
: alway mengembalikan1
posisi terakhirsumber
LOOKUP
hanya berfungsi pada daftar yang diurutkan, output dari perbandingan Anda akan menghasilkan daftar1
s dan spasi dengan cara yang tidak diurutkan, sehingga tidak akan memberikan hasil yang benar.