โว้ว! Excel Rank ข้อมูลที่เป็น Text ได้ด้วยเหรอ

“อยาก Rank ข้อมูลที่เป็น Text ทำยังไงดีครับ?” ตั้มจู่โจมด้วยคำถาม

ผมฟังแล้วสตันไป 3 วิ เพราะฟังก์ชัน RANK.EQ หรือ RANK.AVG ใช้ได้กับข้อมูลที่เป็นตัวเลข
แต่ใช้กับข้อมูลที่เป็น Text ไม่ได้!

งั้นทำยังไงดี?

ต้องมี ‘เล่นแรแปรธาตุ’ กันนิดนึงครับ ^_^

ก่อนจะ Rank หาอันดับของ Text เรามาทำความเข้าใจหลักการเรียงข้อมูลกันก่อน
ในมุมมองของ Excel นั้น อักขระ (Character) ทุกตัวมีโค้ด เช่น
โค้ดของ 1 คือ 49
โค้ดของ 2 คือ 50
โค้ดของ A คือ 65
โค้ดของ B คือ 66
โค้ดของ a คือ 97
โค้ดของ b คือ 98

โค้ดที่ว่านี้ อ้างอิงตามหลัก ASCII ซึ่งเป็นหลักสากล

สามารถเช็คโค้ดของทุกอักขระโดยใช้ฟังก์ชัน CODE (หรือ UNICODE)

จากหลักการนี้
A<B
B<C
และ A<B<C

คราวนี้กลับมาเรื่องการ Rank ข้อมูลที่เป็นตัวอักษรกัน
เพื่อให้เข้าใจง่ายขึ้น สมมติข้อมูลเป็นชื่อสินค้า หน้าตาประมาณนี้

ต้องการเขียนสูตรที่คอลัมน์ B เพื่อแสดงอันดับของสินค้า
ถ้าเป็น Computer ต้องได้ผลลัพธ์เท่ากับ 3
ถ้าเป็น Book ต้องได้ผลลัพธ์เท่ากับ 1
ถ้าเป็น Chair ต้องได้ผลลัพธ์เท่ากับ 2

ตรรกะที่ใช้คือ นับข้อมูลที่น้อยกว่าหรือเท่ากับตัวมันเอง

จากหลักการเรียงข้อมูล
A<B<C
นั่นคือ
Book<Chair<Computer<Desk

ช่วงข้อมูลคือ $A$2:$A$11
ถ้าตัวมันเป็น Book นับแค่ Book
ถ้าตัวมันเป็น Chair นับแค่ Book, Chair
ถ้าตัวมันเป็น Computer นับแค่ Book, Chair, Computer

หรือเขียนสูตรได้เป็น

=COUNTIF($A$2:$A$11,"<="&A2)

“ว้าว! เพิ่งรู้ว่าเขียนสูตรแบบนี้ได้ด้วย” ตั้มโห่ร้อง
“มันต้องเล่นแร่แปรธาตุกันนิดนึง” ผมยิ้ม

“ว่าแต่.. ทดลองแล้วเจอปัญหานิดนึงครับ”
“ปัญหาคือ?”
ผมถามกลับ
“คือถ้ามีข้อมูลซ้ำจะได้อันดับเท่ากัน แต่ผมอยากให้อันดับเรียงต่อกันไปเลย ทำไงดีครับ?”

เพื่อให้เห็นภาพ สมมติ Chair, Notebook มีข้อมูลซ้ำ แล้วใช้สูตรเดิม ผลลัพธ์จะกลายเป็น

แต่สิ่งที่ตั้มต้องการคือ ต้องเรียงอันดับต่อกันไปเลย

ถ้าต้องการผลลัพธ์แบบนี้ ต้องเปลี่ยนตรรกะการเขียนสูตรเป็น

นับข้อมูลที่น้อยกว่าตัวเอง + นับข้อมูลที่เป็นตัวเองตั้งแต่แถวแรกจนถึงแถวที่ตัวเองอยู่

โดย นับข้อมูลที่น้อยกว่าตัวเอง เขียนสูตรได้เป็น

=COUNTIF($A$2:$A$11,"<"&A2)

ถ้าเทียบกับสูตรแรก ก็แค่เปลี่ยนเครื่องหมายจาก “<=” เป็น “=” นั่นเอง

ส่วน นับข้อมูลที่เป็นตัวเองตั้งแต่แถวแรกจนถึงแถวที่ตัวเองอยู่ เขียนสูตรได้เป็น

=COUNTIF($A$2:A2,A2)

สังเกตว่าใช้ช่วงข้อมูลเป็น $A$2:A2 แปลว่าให้ล็อกข้อมูลแถวแรก ($A$2) ส่วนข้อมูลแถวหลัง (A2) เปลี่ยนไปตามบรรทัดนั้น ๆ

รวมสูตรเข้าด้วยกันเป็น

=COUNTIF($A$2:$A$11,"<"&A2)
+COUNTIF($A$2:A2,A2)

“โอ้! ใช่เลยครับ” ตั้มร้อง

“ว่าแต่… ผมเจอปัญหาอีกนิดนึงครับ?”
“ว่าไงตั้ม”
“คือถ้าข้อมูลมีตัวเลขด้วย สูตรจะผิดครับ”

ถ้ามีตัวเลขด้วย ข้อมูลที่เป็นตัวหนังสือกับตัวเลขจะถูกนับแยกกัน

แต่สิ่งที่ตั้มต้องการคือ ต้องนับตัวเลขก่อน แล้วต่อด้วยตัวหนังสือ แบบนี้

งั้นคงใช้ตรรกะเดิมไม่ได้ ต้องใช้ตรรกะใหม่เป็น

นับข้อมูลที่น้อยกว่าหรือเท่ากับตัวมันเอง + นับจำนวนตัวเลขทั้งหมด (ถ้าตัวมันเองเป็น Text)

นับข้อมูลที่น้อยกว่าหรือเท่ากับตัวมันเอง ใช้สูตรเดิมคือ COUNTIF($A$2:$A$11,”<=”&A2)

ปัญหาคือ นับจำนวนตัวเลขทั้งหมด (ถ้าตัวมันเองเป็น Text) จะเขียนสูตรยังไง?

ถ้าเป็น นับจำนวนตัวเลขทั้งหมด
สูตรที่ใช้คือ COUNT($A$2:$A$11)
แต่ต้องนับเฉพาะเคสที่ตัวมันเองเป็น Text

หลายคนอาจนึกถึงฟังก์ชัน IF
จริง ๆ แล้วใช้ IF ก็ได้ แต่สูตรจะยาวนิดนึง
เคสนี้ใช้ฟังก์ชัน ISTEXT ดีกว่า โดยใช้ ISTEXT เช็คว่าเป็น Text หรือเปล่า แล้วนำไปคูณกัน
(ผลลัพธ์ของ ISTEXT คือ TRUE, FALSE)
หรือเขียนสูตรเป็น

=COUNT($A$2:$A$11)*ISTEXT(A2)

รวมสูตรเข้าด้วยกันเป็น

=COUNTIF($A$2:$A$11,"<="&A2)
+COUNT($A$2:$A$11)*ISTEXT(A2)

“ว้าว! แบบนี้ใช่เลยครับพี่” ตั้มโห่ร้องอีกครั้ง

“ว่าแต่.. แล้วถ้าอยากแสดงข้อมูลตั้งแต่ลำดับแรกจนถึงลำดับสุดท้ายล่ะครับ เขียนสูตรยังไงดี?” ตั้มเกิดความคิดสร้างสรรค์

ถ้าอยากแสดงข้อมูลตั้งแต่ลำดับแรกจนถึงลำดับสุดท้าย อาจใช้ร่วมกับฟังก์ชัน INDEX, MATCH และ ROWS หรือเขียนสูตรเป็น

=INDEX($A$2:$A$11,MATCH(ROWS($B$2:B2),$B$2:$B$11,0))

“โห! สูตรยากจัง มีวิธีที่ง่ายกว่านี้ไหมครับ?” ตั้มเห็นสูตรแล้วห่อไหล่
“ตั้มใช้ Excel เวอร์ชันอะไร?”
“Microsoft 365 ครับ”
“งั้นใช้ฟังก์ชัน SORT ได้เลย”
ผมยิ้ม

สูตรที่ใช้คือ

=SORT(A2:A11)

“เฮ้ย! แบบนี้ก็ได้หรือพี่” ตั้มตะโกนเสียงดัง

ฟังก์ชัน SORT เป็นหนึ่งในฟังก์ชันตระกูล Dynamic Array Formula ซึ่งใช้ได้เฉพาะ Microsoft 365 เท่านั้น (Excel 2016/ 2019 ไม่มีฟังก์ชันนี้)

นอกจากเป็นฟังก์ชันที่ฉลาดมากแล้ว ยังเขียนสูตรแค่บรรทัดแรกบรรทัดเดียว (เช่น จากภาพเขียนสูตรที่ D2) แล้วข้อมูลที่เหลือจะ SPILL ขึ้นมาเองโดยอัตโนมัติ (ไม่ต้องก็อปปี้สูตร)
เจ๋งสุด ๆ ใช่ไหมล่ะ ^_^

หวังว่าบทความนี้จะจุดประกายไอเดียการเขียนสูตร แม้บางครั้ง Excel อาจไม่มีฟังก์ชันที่ให้ผลลัพธ์แบบที่เราต้องการ แต่ถ้าใช้ตรรกะ ต่อให้ผลลัพธ์พิสดารแค่ไหน ก็ไม่ไกลเกินไปแน่นอน

สำหรับใครที่สนใจไฟล์ตัวอย่างของบทความนี้ ดาวน์โหลดเพื่อศึกษาเพิ่มเติมได้เลยครับ

บทความนี้แชร์ได้นะครับ ยิ่งมีคนอ่าน คนเขียนยิ่งมีกำลังใจครับ ^_^

Reference:
https://exceljet.net/formula/basic-text-sort-formula
https://exceljet.net/formula/sort-text-and-numbers-with-formula
https://www.get-digital-help.com/how-to-rank-text-uniquely-in-excel/

วิศวกรรีพอร์ต

คนธรรมดาผู้มีประสบการณ์ทำงานหลากหลายตำแหน่ง คลุกคลีกับการทำรีพอร์ตมาโดยตลอด สุดท้ายค้นพบแนวทางของตัวเอง จึงอยากแบ่งปันเคล็ดลับและประสบการณ์ให้กับผู้สนใจ

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.