หาตัวเลขที่หายไป

หาตัวเลขที่หายไป จากช่วงตัวเลขที่เรียงลำดับ (Sequence Numbers) มีวิธีที่แตกต่างจากการหา รายการที่หายไป โดยใช้ VLookup หรือ XLookup หรือวิธีอื่น ที่เคยเขียนถึงไปแล้ว สมมติ เรามี Sequence Numbers เป็นเลข 1 ถึง 500 อยากรู้ว่า มีตัวเลขไหนที่หายไปบ้างจะทำอย่างไรได้บ้าง?

เพื่อให้เห็นภาพชัดเจน เรามีตัวเลขที่เรียงลำดับ 1 – 500 อยู่ในคอลัมน์ A โดยเริ่มที่ A2 ไล่ไปจนครบ 500 แล้วแกล้งทำเลข 99 กับ 198 – 201 หาย อันนี้คือโจทย์ว่า เราจะใช้วิธีไหนบ้างที่จะได้คำตอบเป็น 99 198 199 200 201

หาตัวเลขที่หายไป ด้วย Xlookup (หรือ Vlookup)

วิธีแรก จะเป็นวิธีการใช้  VLookup หรือ XLookup โดยทำรายการตัวเลขเต็ม ๆ 1 – 500 เอาไว้ก่อน แล้วค่อยหาว่ามีตัวไหนหายไป (แนวคิดแบบเดียวกับการเปรียบเทียบ 2 ลิสต์ กรุณาย้อนกลับไปอ่าน)

ในตัวอย่าง จะใส่ตัวเลข 1 – 500 ไว้ที่คอลัมน์ A แล้วเอา ลิสต์ที่ต้องการตรวจสอบ ไว้ที่คอลัมน์ B และในคอลัมน์ C2 ใส่สูตรดังนี้

=XLOOKUP(A2,$B$2:$B$501,$B$2:$B$501,"Error",0)

จะเป็นการหา A2 (ตัวเลขจากรายการเต็ม) ว่ามีในช่วง $B$2:$B$501 หรือไม่ ถ้ามีให้แสดงผล แต่ถ้าไม่มี ให้แสดงคำว่า Error

แล้วเราก็คัดกรอง Error ขึ้นมาดูว่าตัวไหนบ้าง โดยดูจาก รายการที่อยู่ในคอลัมน์ A ก็จะได้คำตอบที่ต้องการว่าเลขไหนหายไปบ้าง

ใช้ X Lookup มองหาสิ่งที่หายไปจากรายการ

วิธีนี้เป็นตัวเลือกที่ดีอยู่เหมือนกัน โดยเฉพาะถ้าไม่ใช่ Sequence Number หรือตัวเลขเรียงลำดับแต่มีรายการเต็มของทั้งหมด

ใช้วิธี ลบตัวเลข

ถ้าเป็นตัวเลขเรียงลำดับกัน เราก็เอามาบวกลบกันได้ เอา งั้นเล่นง่าย ๆ เลย ถ้า ตัวเลข 1 2 3 4…แบบนี้ เอา 2-1 ต้องได้ 1 เอา 3 – 2 ต้องได้ 1 เอา 4-3 ต้องได้ 1 นั่นคือ ตัวเลขเรียงลำดับ จะต้องได้ผลลบจากตัวหน้าเป็น 1 เสมอ (ในกรณีที่ห่างกันทีละ 1)

ถ้างั้นก็ไม่ยากแล้วล่ะจ้ะ เอา Cell ตัวล่าง ลบ Cell ตัวบน (หรือจะเอาบนลบล่างก็ไม่ต่างกัน) เช่นใน cell B2 ใส่สูตร A3 – A2 ผลลัพธ์ก็ต้องได้ 1

ถ้างั้นก็ไม่ยากแล้วล่ะจ้ะ เอา Cell ตัวล่าง ลบ Cell ตัวบน (หรือจะเอาบนลบล่างก็ไม่ต่างกัน) เช่นใน cell B2 ใส่สูตร A3 – A2 ผลลัพธ์ก็ต้องได้ 1 ถ้าตรงไหนผลลัพธ์ไม่เท่ากับ 1 ก็แปลว่าไม่ได้เรียงลำดับต่อกัน ใช้ Filter กรองเพื่อเลือกค่าที่มากกว่า 1 มาดูจะได้ตำแหน่งจากจุดท้ายที่เลขไม่เรียงลำดับ พร้อมกับบอกว่าหายไปกี่เลข เช่นตรง เลข 98 จะขึ้น 2 ก็หมายความว่า มีเลขหายไปหลังจากเลขนี้ 1 เลข (2-1 เพราะมันห่างทีละ 1) นั่นก็คือ 99 หรือตรงเลข 197 ขึ้นเลข 5 ก็หมายถึง มีลำดับเลขหายไป 4 เลข (5-1) คือ 198 199 200 201 แบบนี้เป็นต้น

ผลลัพธ์ของการเอามาลบกันดื้อ ๆ

ใช้สูตร IF

หรือถ้าอยากจะให้ดูเท่ แต่ไร้ประโยชน์มาก ก็ใส่สูตร อย่างสูตร IF นี่แหละ เอามาทำให้มันยุ่งยากนิดนึง จะได้สูตรว่า

=IF(A3>A2+1,"OH NO", "Yes")

มาจากแนวคิดเดิมเลย คือ ตัวล่าง (ในตัวอย่างคือ A3) จะต้องเท่ากับ ตัวบน + 1 (คือ A2 +1) ถ้ามันมากกว่าคือผิดแล้ว ให้แสดงผลว่า OH NO ถ้าไม่มากกว่า ให้แสดง Yes

ตรงนี้อย่าลืมว่า มีการเรียงลำดับไว้แล้ว จากน้อยไปมาก

หาตัวเลขที่หายไป
ใช้สูตร IF ซึ่งผลลัพธ์แบบเดียวกัน

ข้อเสียที่เห็นชัด ๆ คือ วิธีลบกันธรรมดา ๆ ยังบอกได้เลยว่า ตัวเลขที่หายไป หายไปกี่ตัว แต่ถ้าใช้วิธี IF แบบนี้ จะไม่รู้ว่า ตัวเลขที่หายไปนั้น หายไปกี่ตัว

แต่ปัญหาใหญ่ของวิธีนี้คือ มันแค่แสดงว่าตรงไหนที่ไม่เรียงลำดับ แต่ โจทย์ที่ต้องการคือ หาตัวเลขที่หายไป ดังนั้นที่เขียนมายืดยาวนี้ ไม่ตอบโจทย์

ท่านผู้อ่านคงก่นด่าอยู่ในใจ…แล้วหลอกให้ตูอ่านทำไมตั้งยืดยาว…555+

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

ใช้สูตรเพื่อหาตัวเลขที่หายไป

สูตรที่จะแนะนำให้ใช้ จะเขียนแบบนี้

=SMALL(IF(COUNTIF($A$1:$A$496,ROW($1:$496))=0, ROW($1:$496),""),ROW(A1))

แล้วลากลงมา มันจะแสดงตัวเลขที่หายไป จนกว่าจะเห็นช่องสุดท้ายเป็น #Num! นั่นคือหมดแล้ว

หาตัวเลขที่หายไป
ผลลัพธ์จากการใช้สูตร

(หมายเหตุ Excel เวอร์ชันที่ datarevol ใช้อยู่เป็นเวอร์ชัน 2019 จึงใช้สูตรนี้ได้เลยทั้งที่เป็นการอ้างอิงแบบ Array แต่ถ้าเป็นเวอร์ชันก่อนหน้านั้น จะต้องบอก Excel ให้รู้ด้วยการใส่ { และ } ครอบหน้าหลังเอาไว้ หรือ กด Ctrl +Shift + Enter จึงจะใช้งานได้)

แนวคิดของสูตร

สูตรนี้ หาตัวเลขที่หายไป โดยใช้ฟังก์ชัน SMALL IF COUNTIF ROW ผสมกัน โดย จะใช้ตัวเลขจาก $A$1:$A$496 คือ Cell จาก A1 ถึง A496 (นับจำนวนจากแถวสุดท้ายที่มีข้อมูล ตัวอย่างนี้อยู่ในคอลัมน์ A มีข้อมูล 495 ข้อมูล + 1 หัวคอลัมน์

ซึ่งตัวเลขเหล่านี้ จะตรวจสอบกับจำนวนแถวที่สร้างใน ROW($1:$500) นั่นคือเราให้สร้างอาร์เรย์ 1 – 500 ตรงนี้ เราคิดจาก ตัว Sequence Numbers ว่าอยู่ในช่วง 1 – 500 ซึ่งมันจะสร้างเป็นอาร์เรย์ {1;2;3;4; ไปเรื่อย ๆ จนถึง 500} โปรดนึกถึงตอนเราหาด้วยวิธี lookup เราจะสร้างรายการจำนวนเต็มเอาไว้เช็ค นี่แหละ ROW($1:$500) ทำหน้าที่อย่างเดียวกัน

ถ้าตรวจสอบแล้ว  มีค่าเท่ากับ 0 (นั่นคือหายไป) ก็ให้ส่งค่านั้นกลับมา ถ้าไม่เท่ากับกับ 0 ก็ไม่ต้องส่งอะไรกลับมา (“”) แล้วก็ให้เรียงลำดับตัวที่หายไปนั้นจากน้อยไปมาก โดยเราจะอ้างอิง ที่ ROW(A1) (โปรดสังเกตว่าตรงนี้จะไม่ตรึงค่าอย่างตำแหน่งอื่นในสูตร) ซึ่งจะส่งกลับค่าตัวที่หายไปน้อยที่สุดลำดับ 1 2 3 ไปจนกว่าจะไม่มี (ขึ้น #Num!)

ขออธิบายเรื่องฟังก์ชันที่ใช้งาน ดังนี้

SMALL

ฟังก์ชัน SMALL นี่ใช้เพื่อส่งกลับค่าที่เล็กที่สุดในอาร์เรย์นั้น มีวิธีการเขียนสูตรคือ

SMALL(array,k)

Array ก็คือค่า Array (เออ แล้วจะอธิบายทำไม) หรือช่วงของข้อมูลตัวเลขที่ต้องการระบุค่าน้อยที่สุดลำดับที่ k

k คือตำแหน่ง (นับจากค่าน้อยที่สุด) ในอาร์เรย์หรือช่วงข้อมูลที่จะส่งกลับ

ดูตัวอย่างละกัน สมมติเรามีค่าในคอลัมน์ A อยู่ 10 ตัวใน cell A2 – A11)  เราต้องการหาค่าที่น้อยที่สุดลำดับที่ 1 ในลิสต์นี้ เราจะเขียนสูตรดังนี้

=SMALL(A2:A11,1)

ถ้าหากว่าในอาร์เรย์ หรือ ในลิสต์นั้น มีเลขซ้ำ มันจะนับลำดับด้วยนะ อย่างเช่น เราเขียนสูตร

=SMALL(A2:A11,7)

คือเราจะหาตัวที่มีค่าน้อยที่สุดลำดับที่ 7 จากลิสต์หรืออาเรย์นี้ จะได้ผลลัพธ์กลับมาเป็น 5 เพราะในลำดับตัวเลขนั้น ถ้าเอามาเรียงคือ 1-2-2-3-4-4-5-6-7-10 มีเลขซ้ำก็ยังนับเป็นลำดับอยู่นะจ๊ะ

ผลลัพธ์จะออกมาเป็น #NUM! (หรือค่าผิดพลาด) ถ้าหากว่าลิสต์หรืออาร์เรย์นั้นว่างเปล่า หรือค่าk เกินกว่าจำนวนข้อมูลที่มี เช่นมีข้อมูล 10 ตัว ไปใส่ 11 ก็จะเป็น #NUM! หรือถ้าเผลอใส่ค่า k ≤ 0 ก็จะส่งค่า #NUM! เช่นกัน

SMALL

ปรับเข้าสูตรหาตัวเลขที่หายไป

เราใช้ SMALL เพื่อให้แสดงค่าตัวที่หายไปน้อยที่สุดเรียงตามลำดับ

ถ้าเราจะหาค่าน้อยที่สุดของ A1 – A496 จะได้สูตรนี้

=SMALL($A$1:$A$496,1)

สูตรนี้คือ หาค่าต่ำสุดลำดับที่ 1 ในช่วงระหว่าง A1 ถึง A496

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

ถ้าเราเปลี่ยนการอ้างอิง ตรงเลข 1 ให้กลายเป็น Relative คือเปลี่ยนจาก 1 เป็น A1 เพื่อที่เวลาลากสูตร จะได้เป็น A1 A2 A3… ไปเรื่อย ๆ

ผลลัพธ์ก็จะเหมือน copy ข้อมูล จาก A1 ถึง A496 แบบเป๊ะ ๆ จนกระทั่ง มาถึงเลข 100 (ข้าม 99 ที่หายไป) ผลลัพธ์จะกลายเป็น 101 ไปทันที (เพราะลำดับมันข้ามไป ค่านี้จะแสดงผล -ตามลำดับ-

เราไม่ต้องการ “ผลลัพธ์จากค่า” เราต้องการค่าลำดับ ดังนั้น เราต้องหาสิ่งที่จะส่งค่าอ้างอิงตามลำดับ แทน ซึ่ง การแสดงค่าตามแถว ก็คือฟังก์ชัน ROW นั่นเอง

ซึ่งจะอธิบายต่อไป

ROW

ฟังก์ชัน Row จะส่งกลับหมายเลขแถวของการอ้างอิง เขียนสูตรดังนี้

Row()

ถ้าใส่แค่ Row() จะแสดงผลว่า cell ที่ใส่สูตรไปอยู่ในแถวที่เท่าไหร่ แต่ถ้าใส่ Row(A10) มันก็จะแสดงค่า 10 เพราะเป็นแถวที่ 10

ปรับเข้าสูตร

จากเดิม ที่เราจะอ้างอิง ตรงค่า k ในฟังก์ชัน SMALL เราปรับให้สูตรเป็น

=SMALL($A$1:$A$496,ROW(A1))

เริ่มจาก A1 เพราะจะให้แสดงค่าแถวที่ 1 เรียงลงมาตามลำดับ แต่ สำหรับ Array ที่ใช้ในการค้นหาตัวเลขที่หายไป ต้องใช้ COUNTIF และ IF ผสมกัน

COUNTIF

เป็นฟังก์ชันที่ให้นับถ้าเข้าเงื่อนไข  สูตรการเขียนคือ

COUNTIF(ช่วงที่ต้องการนับ, เงื่อนไข)

อย่างเช่น สูตร

=COUNTIF(A1:A460, ">104") 

ก็จะหมายถึง ให้นับจำนวนในช่วง A1:A460 ว่าค่าที่มากกว่า 104 มีจำนวนเท่าไหร่ อันนี้ไม่น่ายาก ลองอ่านจากเว็บไมโครซอฟต์ก็ได้

ปรับเข้าสูตร

จากสูตร เราจะใช้ COUNTIF ตรงนี้

COUNTIF($A$1:$A$496,ROW($1:$496))

นั่นคือ A1 ถึง A496 จะเป็นช่วงที่ต้องการนับ และ แถวที่ 1 ถึง 496 จะเป็นเงื่อนไขในการนับ ซึ่งเป็นค่าอาร์เรย์

ใส่เครื่องหมาย $ เพื่อตรึงไม่ให้ขยับ แม้จะมีการลากสูตร

IF

ฟังก์ชัน IF ก็คือ “ถ้า” นี่แหละจ้ะ ถ้าเป็นแบบนี้ให้ทำแบบนี้ ถ้าไม่ใช่แบบนี้ให้เป็นแบบนี้ เป็นทางเลือกสองทาง วิธีการเขียนสูตรก็คือ

=IF (เงื่อนไข, ถ้าเป็นจริงทำอะไร, ถ้าไม่ใช่ให้ทำอะไร)

คำสั่งนี้เป็นคำสั่งที่ใช้กันบ่อยนะ (อย่างน้อยโดยส่วนตัวก็ใช้บ่อย) แต่มีข้อแนะนำว่า ก่อนจะสร้าง IF ให้คำนึงเรื่องตรรกะและการดำเนินการดี ๆ ยิ่งบางทีเราใช้เงื่อนไขซ้อนเงื่อนไข (IF ซ้อน IF) อาจทำให้เกิดความผิดพลาดเกิดขึ้นได้ง่าย

ทุกวันนี้ เราสามารถใช้ฟังก์ชัน IF ซ้อนกันได้ถึง 64 ชั้น แต่ ไม่แนะนำให้ทำ IF ซ้อนกันหลายครั้ง ต้องระมัดระวัง และตรวจสอบให้แน่ใจว่าตรรกะเหล่านั้น สามารถคำนวณตามเงื่อนไขแต่ละข้อได้ถูกต้อง เพราะที่เคยพบคือ มีช่องโหว่ในการคิดตรรกะ ทำให้เกิดช่องว่างแสดงผลลัพธ์ที่ผิดจากลำดับการใช้เงื่อนไข

และที่สำคัญ ถ้าท่านใช้ IF ซ้อนกันหลายชั้นมาก อาจจะงงเองในภายหลังว่าเขียนอะไรไป คนอื่นที่เข้ามาแกะสูตรอาจจะไม่รู้ด้วยซ้ำว่าใช้ทำอะไรบ้างในแต่ละชั้น

ยกตัวอย่างการใช้ IF เพื่อตัดเกรดคะแนน A B C D และ F จะเป็นการสร้าง IF ซ้อน IF หลายชั้น ดังนี้

=IF(B2>89,"A",IF(B2>79,"B",IF(B2>69,"C",IF(B2>59,"D","F"))))

ปรับให้เข้าสูตร

สูตรที่เขียน เราจะให้หาว่า ค่าในอาร์เรย์จาก COUNTIF ที่ได้มานั้น เท่ากับศูนย์หรือเปล่า

IF(COUNTIF($A$1:$A$496,ROW($1:$496))=0,ROW($1:$496),””) ถ้าค่าที่ได้ เท่ากับ ศูนย์ ค่านั้นคือค่าที่หายไป ให้ส่งกลับค่านั้นมานะ ถ้าไม่เท่ากับศูนย์ก็ไม่ต้องแสดงค่าอะไร

UPDATE:

อธิบายขั้นตอนการทำงานของสูตรอีกที ง่าย ๆ

จากที่เขียนไปยืดยาวข้างต้น บางท่านอ่านแล้วจะอาจจะงงว่าอะไรเยอะแยะ แต่ละตัวทำอะไรยังไง (อันนี้คือพยายามอธิบายให้บางคนฟังแล้วดูจะไม่เข้าใจ ถ้า อธิบายปากเปล่าต่อหน้ากันยังไม่ค่อยเข้าใจ ท่านผู้อ่านบางท่านก็อาจจะมีปัญหาเช่นเดียวกัน ต้องขออภัยที่เป็นคนอธิบายอะไรไม่ค่อยเก่ง)

จะกระจายสูตรให้เห็นชัด ๆ อีกรอบ ให้เห็นว่า สูตรเหล่านี้ มีการทำงานอย่างไร ตอนนี้ขอยกตัวอย่างเพียงแค่เลข 10 ตัวก็แล้วกันเนาะ คือ 1 – 10 แล้วจะแกล้งทำเลข 2 และ 7 หาย ไป

หาตัวเลขที่หายไป

เวลาเขียนเป็นสูตร มันจะเป็นดังนี้

=SMALL(IF(COUNTIF($A$1:$A$10,ROW($1:$10))=0,ROW($1:$10),””),ROW(A1))

ถ้ากระจายสูตรนี้ให้เห็นชัด ๆ ก็จะเป็น

$A$1:$A$8 ก็คือ {1;8;4;5;6;3;9;10}

$1:$10 ก็คือ {1;2;3;4;5;6;7;8;9;10}

COUNTIF($A$1:$A$8,ROW($1:$10) ก็คือ

COUNTIF( {1;8;4;5;6;3;9;10}, {1;2;3;4;5;6;7;8;9;10})

ซึ่งจะได้ผลลัพธ์มาเป็นอาร์เรย์แบบนี้

{1;0;1;1;1;1;0;1;1;1}

คือ เรียงลำดับ 1 – 10 อันไหนมีเป็น 1 อันไหนไม่มีเป็น 0 จากตัวอย่างนี้ จะเป็น 0 ตรงลำดับที่ 2 กับ ลำดับที่ 7 ที่หายไป ไม่มี 2 เลขนี้ในเซลล์  A1 ถึง A8

IF(COUNTIF($A$1:$A$8,ROW($1:$10))=0,ROW($1:$10),””) ก็จะได้

IF({1;0;1;1;1;1;0;1;1;1}=0, {1;2;3;4;5;6;7;8;9;10},””)

ก็คือ ถ้าลำดับไหนเท่ากับ 0 ให้แสดงค่าลำดับนั้น (ตามอาร์เรย์) ไม่งั้นก็ไม่ต้องส่งค่าอะไรกลับ

ผลลัพธ์ของสูตร IF จะออกมาแบบนี้

{“”;2;””;””;””;””;7;””;””;””}

เอาไปแทนค่าใน SMALL

=SMALL({“”;2;””;””;””;””;7;””;””;””},ROW(A1))

ซึ่ง ณ Cell แรกสุด (B1ในตัวอย่าง) ค่า ROW(A1) ก็คือ 1

=SMALL({“”;2;””;””;””;””;7;””;””;””},1)

ก็จะส่งผลลัพธ์มาเป็น 2 คือค่าตัวเลขที่น้อยที่สุด ลำดับที่ 1

พอลากสูตรมา ช่อง B2 ค่า จะกลายเป็น ROW(A2) ก็คือ 2

=SMALL({“”;2;””;””;””;””;7;””;””;””},2)

ก็จะส่งผลลัพธ์มาเป็น 7 คือค่าตัวเลขที่น้อยที่สุด ลำดับที่ 2

พอลากสูตรมา ช่อง B3 ค่า จะกลายเป็น ROW(A3) ก็คือ 3

ซึ่ง ไม่มีตัวเลขอะไรในลำดับ 3 แล้ว มันก็ส่งค่า #NUM! ออกมา

หวังใจว่าการอธิบายนี้จะช่วยให้เข้าใจที่มาของสูตรได้มากขึ้น

สูตรนี้จะวางไว้บนสมมติฐานว่า เลขเป็นเลขเรียงลำดับและไม่มีเลขซ้ำ ยังไม่ได้ตรวจสอบว่า ถ้าเป็นเลขซ้ำ จะเป็นอย่างไรหรือไม่ ปกติงานที่ทำจะใช้เลขเรียงลำดับโดยไม่ซ้ำ นะจ๊ะ

Alternative Way

จากสูตรนี้

=SMALL(IF(COUNTIF($A$1:$A$496,ROW($1:$496))=0,ROW($1:$496),””),ROW(A1))

เราเปลี่ยนเป็น

= SMALL(IF(ISNA(MATCH(ROW(A$1:A$496),A$1:A$496,0)),ROW(A$1:A$496)),ROW(A1))

ที่เขียนอธิบายไปยืดยาว เราสามารถปรับเปลี่ยนสูตรไปได้เหมือนกัน โดยยังคงแนวคิดเดิมอยู่ คือ ใช้ SMALL IF

แต่แทนที่จะใช้ COUNTIF เราเปลี่ยนมาเป็น MATCH เพื่อจับกับตัวเลขที่สร้างขึ้น แล้วเราหาตัวที่หายไปด้วย ISNA

MATCH

ฟังก์ชันนี้เคยอธิบายไปแล้ว รบกวนกลับไปอ่านนิดนึง

เราจะ MATCH กับตำแหน่งลำดับที่สร้างขึ้นจาก ROW(A$1:A$496) ซึ่งตัวที่ไม่สามารถ MATCH กันได้ มันจะขึ้น #N/A เรานับตำแหน่งของค่าที่ขึ้น #N/A แล้วเอาไปแทนตรง COUNTIF ได้เลย

ISNA

ฟังก์ชันนี้ จะส่งค่าที่เป็น #N/A กลับมา รูปแบบสูตร คือ

ISNA(Value)

ดูฟังก์ชัน IS ต่าง ๆ ได้ที่ เว็บของไมโครซอฟต์

ถ้าเราใช้ ISNA + MATCH ก็จะมีค่าไม่ต่างกับ COUNTIF

ฝากไว้ให้เห็นว่า วิธีการหาสูตรเพื่อตอบโจทย์มันมีมากกว่า 1 วิธี นะจ๊ะ

ความคิดเห็นของคุณ :)

%d bloggers like this: