จะทำให้ VLOOKUP ส่งคืนการแข่งขัน * สุดท้ายได้อย่างไร?


12

ฉันเคยทำงานกับ VLOOKUP แต่ครั้งนี้ฉันมีความท้าทาย ฉันไม่ต้องการค่าการจับคู่แรก แต่สุดท้าย อย่างไร? (ฉันทำงานกับ LibreOffice Calc แต่โซลูชัน MS Excel ควรมีประโยชน์เท่ากัน)

เหตุผลก็คือฉันมีคอลัมน์ข้อความสองคอลัมน์ที่มีหลายพันแถวสมมติว่ารายการหนึ่งเป็นรายการผู้รับชำระเงิน (Amazon, Ebay, นายจ้าง, ร้านขายของชำ ฯลฯ ) และอีกรายการหนึ่งคือรายการหมวดหมู่การใช้จ่าย (ค่าจ้าง, ภาษี, ของใช้ในครัวเรือน, เช่า, ฯลฯ ) ธุรกรรมบางรายการไม่มีหมวดหมู่ค่าใช้จ่ายเท่ากันทุกครั้งและฉันต้องการคว้ารายการที่ใช้ล่าสุด โปรดทราบว่ารายการจะเรียงตามคอลัมน์ไม่ (ตามความเป็นจริงตามวันที่) และฉันไม่ต้องการเปลี่ยนลำดับการจัดเรียง

สิ่งที่ฉันมี (ยกเว้นการจัดการข้อผิดพลาด) เป็นสูตร "การจับคู่ครั้งแรก" ตามปกติ:

=VLOOKUP( 
[payee field] , [payee+category range] , [index of category column] , 
0 )

ฉันเห็นวิธีแก้ปัญหาเช่นนี้ แต่ฉันพบ#DIV/0!ข้อผิดพลาด:

=LOOKUP(2 , 1/( [payee range] = [search value] ) , [category range] )

การแก้ปัญหาสามารถเป็นสูตรใด ๆ ไม่จำเป็นต้องเป็น VLOOKUP ฉันยังสามารถสลับคอลัมน์ผู้รับเงิน / หมวดหมู่ได้ กรุณาเปลี่ยนคอลัมน์การจัดเรียงไม่ได้


คะแนนโบนัสสำหรับการแก้ปัญหาที่เลือกค่าที่บ่อยที่สุดแทนที่จะเป็นครั้งสุดท้าย!

คำตอบ:


3

คุณสามารถใช้สูตรอาร์เรย์เพื่อรับข้อมูลจากระเบียนที่ตรงกันล่าสุด

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

ใส่สูตรโดยใช้Ctrl+ +ShiftEnter

งานนี้เหมือนINDEX/ MATCHก่อสร้างVLOOKUPแต่มีเงื่อนไขนำมาใช้แทนMAXMATCH

โปรดทราบว่านี่ถือว่าสมมติว่าตารางของคุณเริ่มต้นที่แถว 1 หากข้อมูลของคุณเริ่มที่แถวที่แตกต่างกันคุณจะต้องปรับROW(...)ส่วนด้วยการลบความแตกต่างระหว่างแถวบนและ 1


ฉันสับสนเกี่ยวกับตัวอักษร "c" ที่แท้จริง - ฉันคิดว่าการประเมินผลเป็นเท็จเสมอดังนั้นมันจะทำอย่างไร?
Torben Gundtofte-Bruun

ฉันได้ทดสอบข้อเสนอแนะของคุณ (และตรวจสอบว่าได้รับการยอมรับว่าเป็นสูตรอาร์เรย์) ฉันถือว่า Col A เป็นผู้รับเงินและ B เป็นประเภทใช่ไหม น่าเสียดาย LibreOffice ส่งคืน "ERR: 502" ซึ่งแปลเป็น "อาร์กิวเมนต์ไม่ถูกต้อง: อาร์กิวเมนต์ของฟังก์ชันไม่ถูกต้องตัวอย่างเช่นจำนวนลบสำหรับฟังก์ชัน SQRT () สำหรับสิ่งนี้โปรดใช้ IMSQRT ()" ฉันตรวจสอบว่ามีฟังก์ชั่นทั้งหมดที่มีชื่อนั้นใน LibreOffice แต่ฉันสงสัยว่า LibreOffice IFไม่สามารถจัดการกับอาร์เรย์ได้หรือไม่
Torben Gundtofte-Bruun

ขออภัยตัวอักษร "c" เป็นเพียงชื่อผู้รับเงินที่คุณต้องการจับคู่ นั่นเป็นของที่ระลึกจากข้อมูลตัวอย่างของฉันที่ฉันเล่นด้วย ฉันคิดว่ามันจะถูกแทนที่ด้วยการอ้างอิงเซลล์ในแผ่นงานของคุณ
Excellll

@ TorbenGundtofte-Bruun Care เพื่อแบ่งปันสูตรที่คุณใช้อยู่หรือไม่? ฉันอาจแก้ไขปัญหาได้หากฉันเห็น นอกจากนี้คุณสามารถลองผ่านสูตรด้วยEvaluate Formulaเพื่อดูว่าส่วนใดของสูตรที่สร้างข้อผิดพลาด มีคุณลักษณะนี้ใน Excel และฉันจะประหลาดใจหาก Lotus Symphony Spreadsheets ไม่มีคุณสมบัติเดียวกัน
Excellll

สูตรดั้งเดิมของฉันตรงไปตรงมานั่นคือเหตุผล :-) ไม่เพียงพอ=VLOOKUP(J1061;$J$2:$K$9999;2;0)โดยที่ col J มีผู้รับเงินและหมวดหมู่ K ส่งคืนการแข่งขันครั้งแรกตามที่คาดไว้
Torben Gundtofte-Bruun

2

(ตอบคำถามที่นี่โดยไม่มีคำถามแยกต่างหากสำหรับข้อมูลที่เรียงลำดับ)

หากข้อมูลถูกเรียงลำดับคุณสามารถใช้VLOOKUPกับrange_lookupอาร์กิวเมนต์TRUE(หรือละเว้นเนื่องจากเป็นค่าเริ่มต้น) ซึ่งอธิบายอย่างเป็นทางการสำหรับ Excel ว่า "ค้นหาการจับคู่โดยประมาณ"

กล่าวอีกนัยหนึ่งสำหรับข้อมูลที่เรียงลำดับ:

  • การตั้งค่าอาร์กิวเมนต์สุดท้ายให้FALSEส่งคืนค่าแรกและ
  • การตั้งค่าอาร์กิวเมนต์สุดท้ายเพื่อTRUEส่งกลับค่าสุดท้าย

สิ่งนี้ส่วนใหญ่ไม่มีเอกสารและปิดบัง แต่วันที่จะ VisiCalc (1979) และวันนี้ถืออย่างน้อยใน Microsoft Excel, LibreOffice Calc และ Google ชีต ในที่สุดมันก็เกิดจากการเริ่มต้นใช้งานLOOKUPใน VisiCalc (และจากนั้นVLOOKUPและHLOOKUP) เมื่อไม่มีพารามิเตอร์ที่สี่ พบค่าโดยการค้นหาแบบไบนารีโดยใช้ขอบเขตด้านซ้ายแบบรวมและขอบเขตด้านขวาแบบเอกสิทธิ์เฉพาะบุคคล

ในทางเทคนิคนี่หมายความว่าเราเริ่มค้นหาด้วยช่วงเวลาที่ผู้สมัคร[0, n)อยู่ที่ไหนnความยาวของอาเรย์และเงื่อนไขที่ไม่เปลี่ยนแปลงวนรอบคือA[imin] <= key && key < A[imax](ขอบเขตซ้ายคือ <= เป้าหมายคือขอบเขตขวาซึ่งเริ่มหนึ่งหลังจากสิ้นสุดคือ: > เป้าหมาย; ในการตรวจสอบทั้งตรวจสอบค่าที่ปลายทางก่อนหรือผลการตรวจสอบหลัง) และต่อเนื่องตัดเลือกฝ่ายไหนจะรักษาค่าคงที่นี้โดยการยกเว้นด้านหนึ่งจะจนกว่าคุณจะได้รับช่วงเวลา 1 เทอม[k, k+1)และ kอัลกอริทึมแล้วผลตอบแทน สิ่งนี้ไม่จำเป็นต้องเป็นการจับคู่ที่แน่นอน (!): เป็นเพียงการจับคู่ที่ใกล้เคียงที่สุดจากด้านล่าง ในกรณีที่มีการแข่งขันซ้ำผลลัพธ์นี้จะคืนค่าการแข่งขันครั้งสุดท้ายเนื่องจากต้องการให้ค่าถัดไปมีค่ามากกว่ากว่าคีย์ (หรือจุดสิ้นสุดของอาร์เรย์) ในกรณีที่ซ้ำซ้อนคุณต้องมีพฤติกรรมบางอย่างและนี่คือเหตุผลและใช้งานง่าย

พฤติกรรมนี้มีการระบุไว้อย่างชัดเจนในบทความฐานความรู้ของ Microsoft เก่า (เน้นเพิ่ม): "XL: วิธีการส่งคืนการจับคู่ครั้งแรกหรือครั้งสุดท้ายในอาร์เรย์" ( Q214069 ):

คุณสามารถใช้ฟังก์ชัน LOOKUP () เพื่อค้นหาค่าภายในอาร์เรย์ของข้อมูลที่เรียงลำดับแล้วส่งคืนค่าที่สอดคล้องกันซึ่งอยู่ในตำแหน่งนั้นภายในอาร์เรย์อื่น หากค่าการค้นหาซ้ำแล้วซ้ำอีกภายในอาร์เรย์ที่จะส่งกลับการแข่งขันที่ผ่านมาพบ พฤติกรรมนี้เป็นจริงสำหรับฟังก์ชัน VLOOKUP (), HLOOKUP () และ LOOKUP ()

เอกสารอย่างเป็นทางการสำหรับบางสเปรดชีตติดตาม; ไม่ว่าจะเป็นพฤติกรรม "การจับคู่ครั้งสุดท้าย" ที่ระบุ แต่ก็มีนัยในเอกสารของ Google ชีต:

  • Microsoft Excel

    TRUEถือว่าคอลัมน์แรกในตารางจะถูกจัดเรียงอย่างใดอย่างหนึ่งหรือตัวเลขตัวอักษรและจากนั้นจะค้นหาค่าที่ใกล้เคียงที่สุด

  • Google ชีต :

    หากis_sortedเป็นTRUEหรือละทิ้งการจับคู่ที่ใกล้ที่สุด ( น้อยกว่าหรือเท่ากับคีย์ค้นหา) จะถูกส่งคืน


สิ่งที่ใกล้เคียงที่สุดคือสิ่งที่ทำให้ฉันบ้า!
davetapley

1

หากค่าในอาร์เรย์การค้นหาเรียงตามลำดับ (เช่นคุณกำลังมองหาค่าที่ใหญ่ที่สุดเช่นวันที่ล่าสุด) คุณไม่จำเป็นต้องใช้ฟังก์ชัน INDIRECT ลองใช้รหัสง่ายๆนี้:

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

ป้อนสูตรอีกครั้งโดยใช้ CTRL + SHIFT + ENTER


0

ฉันไปที่ค่าบ่อยที่สุด ไม่แน่ใจว่ามันจะทำงานใน libreOffice หรือไม่ แต่ดูเหมือนว่าจะทำงานได้ดีกว่า

= 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))

คอลัมน์ A จะเป็นผู้รับเงินคอลัมน์ B จะเป็นหมวดหมู่ D2 เป็นผู้รับเงินที่คุณต้องการกรอง ฉันไม่แน่ใจว่าทำไมมันวาง linebreaks พิเศษในฟังก์ชั่นด้านบน

ฟังก์ชั่นของฉันเพื่อค้นหาเซลล์สุดท้ายจะเป็นดังนี้:

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

ทางอ้อมให้ฉันระบุคอลัมน์ที่ฉันต้องการส่งคืนและค้นหาแถวโดยตรง (ดังนั้นฉันไม่จำเป็นต้องลบจำนวนแถวส่วนหัว

ทั้งสองฟังก์ชั่นเหล่านี้จำเป็นต้องป้อนโดยใช้Ctrl + shift + enter


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

นี่จะทำให้คุณได้รับค่าสุดท้าย

ฉันจะได้รับคะแนนโบนัสเมื่ออายุเกิน 3 ปีหรือไม่?


-1

คุณมี#DIV/0!ข้อผิดพลาดเนื่องจากคุณควรเขียนสูตรดังนี้:

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

สิ่งนี้จะได้ผลและจะพบการแข่งขันครั้งสุดท้าย

([payee range] = [search value]) : บูลีนเมทริกซ์ TRUE / FALSE

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

=LOOKUP(2; {pseudo-boolean matrix 1/""} );[category range]): กลับ1ตำแหน่งสุดท้ายเสมอ


LOOKUPใช้งานได้เฉพาะในรายการที่เรียงลำดับเอาต์พุตของ comarison ของคุณจะส่งผลให้มีรายการของ1s และช่องว่างในแบบที่ไม่เรียงลำดับดังนั้นมันจะไม่ให้ผลลัพธ์ที่ถูกต้อง
MátéJuhász
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.