มีใครทราบสูตรในการค้นหาค่าของเซลล์สุดท้ายที่ไม่ว่างเปล่าในคอลัมน์ใน Microsoft Excel หรือไม่?
มีใครทราบสูตรในการค้นหาค่าของเซลล์สุดท้ายที่ไม่ว่างเปล่าในคอลัมน์ใน Microsoft Excel หรือไม่?
คำตอบ:
วิธีนี้ใช้ได้กับทั้งข้อความและตัวเลขและไม่สนใจว่ามีเซลล์ว่างหรือไม่กล่าวคือจะส่งคืนเซลล์สุดท้ายที่ไม่ว่างเปล่า
ต้องป้อนอาร์เรย์หมายความว่าคุณกด Ctrl-Shift-Enter หลังจากพิมพ์หรือวางด้านล่างนี้ใช้สำหรับคอลัมน์ A:
=INDEX(A:A,MAX((A:A<>"")*(ROW(A:A))))
CELL()
หรือOFFSET()
) ในขณะที่ยิ่งมีการโหวตมากขึ้นจะส่งคืนค่าโดยไม่บอกคุณว่าอยู่ที่ไหน
ใช้สูตรง่ายๆต่อไปนี้เร็วกว่ามาก
=LOOKUP(2,1/(A:A<>""),A:A)
สำหรับ Excel 2003:
=LOOKUP(2,1/(A1:A65535<>""),A1:A65535)
จะให้ข้อดีดังต่อไปนี้:
คำอธิบาย:
(A:A<>"")
ส่งคืนอาร์เรย์ {TRUE,TRUE,..,FALSE,..}
1/(A:A<>"")
{1,1,..,#DIV/0!,..}
ปรับเปลี่ยนอาร์เรย์นี้LOOKUP
คาดว่าอาร์เรย์ที่เรียงลำดับจากน้อยไปหามากและคำนึงว่าหากLOOKUP
ฟังก์ชันไม่สามารถหาค่าที่ตรงกันได้ก็จะเลือกค่าที่มากที่สุดในlookup_range
(ในกรณีของเรา{1,1,..,#DIV/0!,..}
) ที่น้อยกว่าหรือเท่ากับค่า (ในกรณีของเรา2
) สูตรค้นหาค่าสุดท้าย1
ในอาร์เรย์และส่งกลับค่าที่สอดคล้องกันจากresult_range
(พารามิเตอร์ที่สาม - A:A
)หมายเหตุเล็กน้อย - สูตรข้างต้นไม่ได้คำนึงถึงเซลล์ที่มีข้อผิดพลาด (คุณสามารถดูได้เฉพาะเมื่อเซลล์ที่ไม่ว่างสุดท้ายมีข้อผิดพลาด) หากคุณต้องการพิจารณาให้ใช้:
=LOOKUP(2,1/(NOT(ISBLANK(A:A))),A:A)
ภาพด้านล่างแสดงความแตกต่าง:
LOOKUP
ระบุว่าอาร์กิวเมนต์สุดท้ายresult_vector
เป็นทางเลือก อย่างไรก็ตามหากฉันมองข้ามไปฉันจะได้ผลลัพธ์ที่แปลกมากซึ่งฉันไม่เข้าใจ
LOOKUP
ไม่พบlookup_value
ฟังก์ชันฟังก์ชันจะตรงกับค่าที่มากที่สุดlookup_vector
ซึ่งน้อยกว่าหรือเท่ากับlookup_value.
" ถ้าฉันใช้=LOOKUP(2,A:A<>"",A:A)
โดยไม่สร้าง#DIV/0!
ข้อผิดพลาดโดย1/...
ดูเหมือนว่าจะส่งคืนค่าบางอย่างที่อยู่ตรงกลางของ เวกเตอร์ ฉันไม่พบฟังก์ชันการทำงานที่แน่นอนในกรณีนี้
=LOOKUP(2,1/(A:A<>""),ROW(A:A))
แต่การเพิ่มROW
ฟังก์ชันจะเพิ่มเอฟเฟกต์ "ความผันผวน" - สูตรจะคำนวณใหม่ทุกครั้งที่เซลล์ใด ๆ ใน wroksheet เปลี่ยนแปลง
นี่คืออีกทางเลือกหนึ่ง: =OFFSET($A$1;COUNTA(A:A)-1;0)
COUNTA
แทนCOUNT
) ไม่ต้องพูดถึงเซลล์ว่าง
แรงบันดาลใจจากผู้นำที่ยอดเยี่ยมที่ได้รับจากคำตอบของ Doug Glancy ฉันคิดวิธีทำสิ่งเดียวกันโดยไม่ต้องใช้สูตรอาร์เรย์ อย่าถามฉันว่าทำไม แต่ฉันกระตือรือร้นที่จะหลีกเลี่ยงการใช้สูตรอาร์เรย์ถ้าเป็นไปได้ (ไม่ใช่ด้วยเหตุผลใดก็ตามมันเป็นแค่สไตล์ของฉัน)
นี่คือ:
=SUMPRODUCT(MAX(($A:$A<>"")*(ROW(A:A))))
สำหรับการค้นหาแถวสุดท้ายที่ไม่ว่างโดยใช้คอลัมน์ A เป็นคอลัมน์อ้างอิง
=SUMPRODUCT(MAX(($1:$1<>"")*(COLUMN(1:1))))
สำหรับการค้นหาคอลัมน์สุดท้ายที่ไม่ว่างโดยใช้แถวที่ 1 เป็นแถวอ้างอิง
สิ่งนี้สามารถใช้เพิ่มเติมร่วมกับฟังก์ชันดัชนีเพื่อกำหนดช่วงที่ตั้งชื่อแบบไดนามิกได้อย่างมีประสิทธิภาพ แต่นี่เป็นสิ่งสำหรับโพสต์อื่นเนื่องจากไม่เกี่ยวข้องกับคำถามที่ระบุไว้ในที่นี้
ฉันได้ทดสอบวิธีการข้างต้นกับ Excel 2010 ทั้งแบบ "ดั้งเดิม" และใน "โหมดความเข้ากันได้" (สำหรับ Excel เวอร์ชันเก่า) และใช้ได้ผล อีกครั้งด้วยสิ่งเหล่านี้คุณไม่จำเป็นต้องทำ Ctrl + Shift + Enter ใด ๆ ด้วยการใช้ประโยชน์จากวิธีการทำงานของ sumproduct ใน Excel ทำให้เราสามารถรับมือกับความจำเป็นในการดำเนินการอาร์เรย์ได้ แต่เราทำได้โดยไม่ต้องใช้สูตรอาร์เรย์ ฉันหวังว่าใครบางคนอาจชื่นชอบความงามความเรียบง่ายและความสง่างามของโซลูชันการผลิตที่เสนอเหล่านี้มากพอ ๆ กับที่ฉันทำ ฉันไม่ยืนยันถึงประสิทธิภาพหน่วยความจำของโซลูชันข้างต้น เพียงแค่ว่ามันเรียบง่ายดูสวยงามช่วยให้บรรลุวัตถุประสงค์และมีความยืดหยุ่นเพียงพอที่จะขยายการใช้งานไปยังวัตถุประสงค์อื่น ๆ :)
หวังว่านี่จะช่วยได้!
ดีที่สุด!
ฉันรู้ว่าคำถามนี้เก่า แต่ฉันไม่พอใจกับคำตอบที่ให้ไว้
LOOKUP, VLOOKUP และ HLOOKUP มีปัญหาด้านประสิทธิภาพและไม่ควรใช้จริงๆ
ฟังก์ชันอาร์เรย์มีค่าใช้จ่ายจำนวนมากและอาจมีปัญหาด้านประสิทธิภาพดังนั้นจึงควรใช้เป็นทางเลือกสุดท้ายเท่านั้น
COUNT และ COUNTA ประสบปัญหาหากข้อมูลไม่ติดกันไม่ว่างเปล่ากล่าวคือคุณมีช่องว่างแล้วข้อมูลอีกครั้งในช่วงที่เป็นปัญหา
INDIRECT มีความผันผวนดังนั้นจึงควรใช้เป็นทางเลือกสุดท้ายเท่านั้น
OFFSET มีความผันผวนดังนั้นจึงควรใช้เป็นทางเลือกสุดท้ายเท่านั้น
การอ้างอิงถึงแถวหรือคอลัมน์สุดท้ายที่เป็นไปได้ (เช่นแถวที่ 65536 ใน Excel 2003) ไม่แข็งแรงและส่งผลให้มีค่าใช้จ่ายเพิ่มเติม
นี่คือสิ่งที่ฉันใช้
เมื่อผสมชนิดข้อมูล: =max(MATCH(1E+306,[RANGE],1),MATCH("*",[RANGE],-1))
เมื่อทราบว่าข้อมูลมีเพียงตัวเลข: =MATCH(1E+306,[RANGE],1)
เมื่อทราบว่าข้อมูลมีเฉพาะข้อความ: =MATCH("*",[RANGE],-1)
MATCH มีค่าโสหุ้ยต่ำสุดและไม่มีความผันผวนดังนั้นหากคุณกำลังทำงานกับข้อมูลจำนวนมากสิ่งนี้ดีที่สุดที่จะใช้
TRUE
/ FALSE
) ก็จะตรวจไม่พบ แม้ว่าคำตอบนี้จะไม่สามารถกันกระสุนได้ แต่ฉันก็ยังคิดว่าคำตอบนี้มีผลต่อประสิทธิภาพน้อยที่สุด
=INDEX(N:N,MATCH(1E+306,N:N,1))
สิ่งนี้ใช้ได้ใน Excel 2003 (และใหม่กว่าด้วยการแก้ไขเล็กน้อยดูด้านล่าง) กด Ctrl + Shift + Enter (ไม่ใช่แค่ Enter) เพื่อป้อนเป็นสูตรอาร์เรย์
=IF(ISBLANK(A65536),INDEX(A1:A65535,MAX((A1:A65535<>"")*(ROW(A1:A65535)))),A65536)
โปรดทราบว่า Excel 2003 ไม่สามารถใช้สูตรอาร์เรย์กับทั้งคอลัมน์ได้ การทำเช่นนั้นให้ผลตอบแทน#NUM!
; ผลลัพธ์ที่คาดเดาไม่ได้อาจเกิดขึ้น! (แก้ไข : ข้อมูลที่ขัดแย้งกันจาก Microsoft: สิ่งเดียวกันนี้อาจเป็นจริงหรือไม่เป็นจริงเกี่ยวกับ Excel 2007 ปัญหาอาจได้รับการแก้ไขในปี 2010 )
นั่นเป็นเหตุผลที่ผมใช้สูตรอาร์เรย์ช่วงA1:A65535
และให้การดูแลเป็นพิเศษไปยังเซลล์ที่ผ่านมาซึ่งเป็นA65536
ใน Excel 2003 ไม่สามารถเพียงแค่พูดA:A
หรือแม้กระทั่งเป็นหลังย้อนกลับโดยอัตโนมัติA1:A65536
A:A
หากคุณแน่ใจว่าA65536
ว่างเปล่าคุณสามารถข้ามไฟล์IF
ส่วนนี้ได้:
=INDEX(A1:A65535,MAX((A1:A65535<>"")*(ROW(A1:A65535))))
โปรดทราบว่าหากคุณกำลังใช้ Excel 2007 หรือ 2010 หมายเลขแถวสุดท้ายคือ 1048576 ไม่ใช่ 65536 ดังนั้นให้ปรับค่าด้านบนตามความเหมาะสม
หากไม่มีเซลล์ว่างอยู่ตรงกลางข้อมูลของคุณฉันจะใช้สูตรที่ง่ายกว่า=INDEX(A:A,COUNTA(A:A))
นี้
=INDEX(19:19,COUNTA(19:19))
โซลูชันทางเลือกที่ไม่มีสูตรอาร์เรย์ซึ่งอาจมีประสิทธิภาพมากกว่าคำตอบก่อนหน้าด้วยโซลูชัน (hint to a) ที่ไม่มีสูตรอาร์เรย์คือ
=INDEX(A:A,INDEX(MAX(($A:$A<>"")*(ROW(A:A))),0))
ดูคำตอบนี้เป็นตัวอย่าง รุ่งโรจน์เพื่อแบรดและแบร์รี่ฮูดินี่ผู้ช่วยแก้คำถามนี้
เหตุผลที่เป็นไปได้ในการเลือกใช้สูตรที่ไม่ใช่อาร์เรย์มีให้ใน:
หน้าอย่างเป็นทางการของ Microsoft (มองหา "ข้อเสียของการใช้สูตรอาร์เรย์")
สูตรอาร์เรย์อาจดูเหมือนวิเศษ แต่ก็มีข้อเสีย:
A
เหตุการณ์ทั้งหมดด้วยไฟล์D
. ผมทำอะไรผิดหรือเปล่า?
หากคุณค้นหาในคอลัมน์ (A) ให้ใช้:
=INDIRECT("A" & SUMPRODUCT(MAX((A:A<>"")*(ROW(A:A)))))
หากช่วงของคุณคือ A1: A10 คุณสามารถใช้:
=INDIRECT("A" & SUMPRODUCT(MAX(($A$1:$A10<>"")*(ROW($A$1:$A10)))))
ในสูตรนี้:
SUMPRODUCT(MAX(($A$1:$A10<>"")*(ROW($A$1:$A10))))
ส่งคืนหมายเลขแถวสุดท้ายที่ไม่ว่างเปล่าและทางอ้อม () ส่งกลับค่าเซลล์
=INDEX(A:A, COUNTA(A:A), 1)
นำมาจากที่นี่
=MATCH("*";A1:A10;-1)
สำหรับข้อมูลที่เป็นข้อความ
=MATCH(0;A1:A10;-1)
สำหรับข้อมูลตัวเลข
ฉันได้ลองใช้เวอร์ชันที่ไม่ลบเลือนทั้งหมดแล้ว แต่ไม่มีเวอร์ชันใดเวอร์ชันหนึ่งที่ให้ไว้ข้างต้นได้ผล .. excel 2003 / 2007update แน่นอนสิ่งนี้สามารถทำได้ใน excel 2003 ไม่ใช่อาร์เรย์หรือสูตรมาตรฐาน ฉันได้รับข้อผิดพลาดเพียงช่องว่าง 0 หรือ #value เลยใช้วิธีระเหย.. ได้ผล ..
= LOOKUP (2,1 / (T4: T369 <> ""), T4: T369)
@Julian Kroné .. การใช้ ";" แทนที่จะเป็น "," ไม่ทำงาน! ฉันคิดว่าคุณใช้ Libre Office ไม่ใช่ MS excel? LOOKUP เป็นสิ่งที่ผันผวนอย่างน่ารำคาญฉันใช้มันเป็นทางเลือกสุดท้ายเท่านั้น
วางรหัสนี้ในโมดูล VBA บันทึก ภายใต้ฟังก์ชันผู้ใช้กำหนดให้มองหาฟังก์ชันนี้
Function LastNonBlankCell(Range As Excel.Range) As Variant
Application.Volatile
LastNonBlankCell = Range.End(xlDown).Value
End Function
สำหรับข้อมูลที่เป็นข้อความ:
EQUIV("";A1:A10;-1)
สำหรับข้อมูลตัวเลข:
EQUIV(0;A1:A10;-1)
สิ่งนี้ให้ดัชนีสัมพัทธ์ของเซลล์สุดท้ายที่ไม่ว่างในช่วงที่เลือก (ที่นี่ A1: A10)
หากคุณต้องการรับค่าให้เข้าถึงผ่านทาง INDIRECT หลังจากสร้าง -textually- การอ้างอิงเซลล์สัมบูรณ์เช่น:
INDIRECT("A" & (nb_line_where_your_data_start + EQUIV(...) - 1))
ฉันก็มีปัญหาเหมือนกัน สูตรนี้ก็ใช้ได้ดีไม่แพ้กัน: -
=INDIRECT(CONCATENATE("$G$",(14+(COUNTA($G$14:$G$65535)-1))))
14 เป็นหมายเลขแถวของแถวแรกในแถวที่คุณต้องการนับ
Clawtooth เรื้อรัง
ฉันใช้ HLOOKUP
A1
มีวันที่;
A2:A8
มีการคาดการณ์ในช่วงเวลาที่ต่างกันฉันต้องการข้อมูลล่าสุด
=Hlookup(a1,a1:a8,count(a2:a8)+1)
สิ่งนี้ใช้สูตร hlookup มาตรฐานที่มีอาร์เรย์การค้นหาที่กำหนดโดยจำนวนรายการ
ถ้าคุณรู้ว่าจะไม่มีเซลล์ว่างอยู่ระหว่างนั้นวิธีที่เร็วที่สุดคือ
=INDIRECT("O"&(COUNT(O:O,"<>""")))
เพียงแค่นับเซลล์ที่ไม่ว่างเปล่าและอ้างถึงเซลล์ที่เหมาะสม
สามารถใช้สำหรับช่วงเฉพาะได้เช่นกัน
=INDIRECT("O"&(COUNT(O4:O34,"<>""")+3))
สิ่งนี้จะส่งคืนเซลล์สุดท้ายที่ไม่ว่างในช่วง O4: O34
สำหรับ Microsoft office 2013
"สุดท้าย แต่เป็นหนึ่ง" ของแถวที่ไม่ว่าง:
=OFFSET(Sheet5!$C$1,COUNTA(Sheet5!$C:$C)-2,0)
แถวที่ไม่ว่าง "สุดท้าย":
=OFFSET(Sheet5!$C$1,COUNTA(Sheet5!$C:$C)-1,0)
สูตรนี้ใช้ได้กับฉันสำหรับ office 2010:
= LOOKUP (2; 1 / (A1: A100 <> ""); A1: A100)
A1: เซลล์แรก A100: อ้างถึงเซลล์สุดท้ายในการเปรียบเทียบ
ฉันคิดว่าการตอบสนองจาก W5ALIVE ใกล้เคียงที่สุดกับสิ่งที่ฉันใช้เพื่อค้นหาแถวสุดท้ายของข้อมูลในคอลัมน์ สมมติว่าฉันกำลังมองหาแถวสุดท้ายที่มีข้อมูลในคอลัมน์ A ฉันจะใช้สิ่งต่อไปนี้สำหรับการค้นหาทั่วไปเพิ่มเติม:
=MAX(IFERROR(MATCH("*",A:A,-1),0),IFERROR(MATCH(9.99999999999999E+307,A:A,1),0))
MATCH แรกจะพบเซลล์ข้อความสุดท้ายและ MATCH ที่สองจะพบเซลล์ตัวเลขสุดท้าย ฟังก์ชัน IFERROR จะส่งคืนค่าศูนย์หาก MATCH แรกพบเซลล์ตัวเลขทั้งหมดหรือหากคู่ที่สองพบเซลล์ข้อความทั้งหมด
โดยทั่วไปนี่เป็นรูปแบบเล็กน้อยของโซลูชันข้อความและตัวเลขผสมของ W5ALIVE
ในการทดสอบเวลาสิ่งนี้เร็วกว่ารูปแบบ LOOKUP ที่เทียบเท่าอย่างมาก
ในการส่งคืนค่าจริงของเซลล์สุดท้ายนั้นฉันต้องการใช้การอ้างอิงเซลล์ทางอ้อมเช่นนี้:
=INDIRECT("A"&MAX(IFERROR(MATCH("*",A:A,-1),0),IFERROR(MATCH(9.99999999999999E+307,A:A,1),0)))
วิธีการที่นำเสนอโดย sancho.s อาจเป็นตัวเลือกที่สะอาดกว่า แต่ฉันจะแก้ไขส่วนที่ค้นหาหมายเลขแถวเป็น:
=INDEX(MAX((A:A<>"")*(ROW(A:A))),1)
ความแตกต่างเพียงอย่างเดียวคือ ", 1" ส่งกลับค่าแรกในขณะที่ ", 0" ส่งกลับค่าอาร์เรย์ทั้งหมด (ทั้งหมดยกเว้นค่าใดค่าหนึ่ง) ฉันยังคงชอบกำหนดที่อยู่เซลล์ไปยังฟังก์ชันดัชนีที่นั่นกล่าวอีกนัยหนึ่งคือส่งคืนค่าเซลล์ด้วย:
=INDIRECT("A"&INDEX(MAX((A:A<>"")*(ROW(A:A))),1))
กระทู้เยี่ยม!
หากคุณไม่กลัวที่จะใช้อาร์เรย์ต่อไปนี้เป็นสูตรง่ายๆในการแก้ปัญหา:
= SUM (IF (A: A <> "", 1,0))
คุณต้องกด CTRL + SHIFT + ENTER เนื่องจากเป็นสูตรอาร์เรย์
วิธีง่ายๆที่เหมาะกับฉัน:
=F7-INDEX(A:A,COUNT(A:A))
โอเคฉันมีปัญหาเดียวกันกับผู้ถามและลองใช้คำตอบยอดนิยมทั้งสอง แต่ได้รับข้อผิดพลาดของสูตรเท่านั้น กลายเป็นว่าฉันต้องแลก "," เป็น ";" เพื่อให้สูตรทำงานได้ ฉันใช้ XL 2007
ตัวอย่าง:
=LOOKUP(2;1/(A:A<>"");A:A)
หรือ
=INDEX(A:A;MAX((A:A<>"")*(ROW(A:A))))
สำหรับการติดตามเวอร์ชัน (เพิ่มตัวอักษร v ที่จุดเริ่มต้นของตัวเลข) ฉันพบว่าอันนี้ทำงานได้ดีใน Xcelsius (SAP Dashboards)
="v"&MAX(A2:A500)