Bagaimana cara mendapatkan VLOOKUP untuk mengembalikan * pertandingan * terakhir?

12

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!

Torben Gundtofte-Bruun
sumber

Jawaban:

3

Anda bisa menggunakan rumus array untuk mendapatkan data dari catatan pencocokan terakhir.

=INDEX(IF($A$1:$A$20="c",$B$1:$B$20),MAX(IF($A$1:$A$20="c",ROW($A$1:$A$20))))

Masukkan rumus menggunakan Ctrl+ Shift+ Enter.

Ini bekerja seperti INDEX/ MATCHkonstruksi dari a VLOOKUP, tetapi dengan kondisi yang MAXdigunakan, bukan MATCH.

Perhatikan bahwa ini mengasumsikan bahwa tabel Anda dimulai pada baris 1. Jika data Anda mulai pada baris yang berbeda, Anda harus menyesuaikan ROW(...)bagian dengan mengurangi perbedaan antara baris atas dan 1.

Excellll
sumber
Saya bingung tentang huruf "c" - saya pikir evaluasi selalu salah, jadi apa fungsinya?
Torben Gundtofte-Bruun
Saya telah menguji saran Anda (dan memeriksa bahwa saran itu diterima sebagai rumus array). Saya menganggap Kol A adalah penerima pembayaran dan B adalah kategori, bukan? Sayangnya, LibreOffice mengembalikan "ERR: 502" yang diterjemahkan menjadi "Argumen tidak valid: Argumen fungsi tidak valid. Misalnya, angka negatif untuk fungsi SQRT (), untuk ini silakan gunakan IMSQRT ()". Saya memeriksa bahwa semua fungsi ada dengan nama itu di LibreOffice, tetapi saya bertanya-tanya apakah LibreOffice IFtidak dapat menangani array.
Torben Gundtofte-Bruun
Maaf, literal "c" hanyalah nama penerima pembayaran yang ingin Anda cocokkan. Itu adalah peninggalan dari data sampel saya yang saya mainkan. Saya berasumsi bahwa akan diganti dengan referensi sel di lembar Anda.
Excellll
@ TorbenGundtofte-Bruun Care untuk membagikan formula yang Anda gunakan? Saya mungkin dapat memecahkan masalah jika saya bisa melihatnya. Selain itu, Anda selalu dapat mencoba menelusuri rumus dengan Evaluate Formulauntuk 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.
Excellll
Formula asli saya mudah, itu sebabnya tidak memadai :-) di =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.
Torben Gundtofte-Bruun
2

(Menjawab di sini karena tidak ada pertanyaan terpisah untuk data yang diurutkan.)

Jika data yang diurutkan, Anda bisa menggunakan VLOOKUPdengan range_lookupargumen TRUE(atau dihilangkan, karena itu default), yang secara resmi dijelaskan untuk Excel sebagai "mencari pertandingan perkiraan".

Dengan kata lain, untuk data yang diurutkan:

  • mengatur argumen terakhir untuk FALSEmengembalikan nilai pertama , dan
  • mengatur argumen terakhir untuk TRUEmengembalikan 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 LOOKUPdi VisiCalc (dan dari situ VLOOKUPdan HLOOKUP), 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 mana npanjang array, dan kondisi loop invarian adalah bahwa A[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 kembali k. 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 ):

Anda dapat menggunakan fungsi LOOKUP () untuk mencari nilai dalam array data yang diurutkan dan mengembalikan nilai terkait yang terkandung dalam posisi itu dalam array lain. Jika nilai pencarian diulang dalam array, itu mengembalikan kecocokan terakhir yang ditemui . Perilaku ini berlaku untuk fungsi VLOOKUP (), HLOOKUP (), dan LOOKUP ().

Dokumentasi resmi untuk beberapa spreadsheet mengikuti; tidak dalam perilaku "pertandingan terakhir" yang dinyatakan, tetapi tersirat dalam dokumentasi Google Sheets:

  • Microsoft Excel

    TRUE mengasumsikan kolom pertama dalam tabel diurutkan baik secara numerik atau alfabet, dan kemudian akan mencari nilai terdekat .

  • Google Sheets :

    Jika is_sortedini TRUEatau dihilangkan, pertandingan terdekat ( kurang dari atau sama dengan kunci pencarian) dikembalikan

Nils von Barth
sumber
Itu pertandingan terdekat hal itu membuatku gila!
dukedave
1

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:

=MAX(IF($A$1:$A$20="c",$B$1:$B$20,)

Sekali lagi, masukkan formula menggunakan CTRL + SHIFT + ENTER

Stich
sumber
0

Saya mendapat nilai paling sering. Tidak yakin apakah itu akan berfungsi di libreOffice, tetapi tampaknya bekerja di excel

= INDEX ($ B $ 2: $ B $ 9, MATCH (MAX (- ($ A $ 2: $ A $ 9 = D2) * COUNTIFS ($ B $ 2: $ B $ 9, $ B $ 2: $ B $ 9, $ A $ 2 : $ A $ 9, D2)), - ($ A $ 2: $ A $ 9 = D2) * COUNTIFS ($ B $ 2: $ B $ 9, $ B $ 2: $ B $ 9, $ A $ 2: $ A $ 9, D2 ), 0))

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:

= TIDAK LANGSUNG ("B" & MAX (- ($ A $ 2: $ A $ 9 = D2) * ROW ($ A $ 2: $ A $ 9))))

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

gtwebb
sumber
0
=LOOKUP([payee field] , [payee range] , [category range])

Ini akan memberi Anda nilai terakhir

Apakah saya mendapatkan poin bonus karena terlambat 3 tahun?

DavePenn
sumber
-1

Anda mendapat #DIV/0!kesalahan karena Anda sebaiknya menulis rumus seperti:

=LOOKUP(2;IF(([payee range] = [search value]);1;"");[category range])

ini akan berfungsi dan akan menemukan kecocokan terakhir.

([payee range] = [search value]) : boolean matrix TRUE / FALSE

IF(([payee range] = [search value]);1;"") : matriks pseudo-boolean 1 / ""

=LOOKUP(2; {pseudo-boolean matrix 1/""} );[category range]): alway mengembalikan 1posisi terakhir

Samuel
sumber
LOOKUPhanya berfungsi pada daftar yang diurutkan, output dari perbandingan Anda akan menghasilkan daftar 1s dan spasi dengan cara yang tidak diurutkan, sehingga tidak akan memberikan hasil yang benar.
Máté Juhász