ก่อนหน้านี้ผมได้เคยเขียนอธิบายวิธีทำ Dropdown List 2 ชั้น และ 3 ชั้นขึ้นไปแล้ว… หลายๆ คนก็นำไปใช้ประโยชน์ได้เป็นอย่างดี แต่ปัญหาอยู่ที่ บางคนทำตามแล้วมัน Error!!

เอ๊ะ แล้วทำไมบางคนทำตามแล้วไม่ Error แต่บางคนทำแล้ว Error ล่ะ? เรามาไขคำตอบกันในบทความนี้ครับ ยาวหน่อย แต่ได้ความรู้มากมาย รับรองเลย!!

ใครไม่เคยอ่านบทความ 2 อันก่อนหน้ามาก่อน สามารถอ่านแค่บทความนี้อันเดียวก็เข้าใจได้ครับ ไม่ต้องย้อนกลับไปอ่านให้เสียเวลา ^^

หลักการทำ Dropdown

Dropdown List เกิดจากการใช้

[Data] –>Data Tools –> Data Validation แล้วเลือก List จากนั้น ให้เลือก Range ที่ต้องการให้เป็น item ย่อยๆ เวลาที่กดปุ่มสามเหลี่ยมเพื่อเลือกใช้ Dropdown แค่นี้ก็จะได้ Dropdown แล้วล่ะ เช่น ผมมีรายชื่อภาพยนต์อยู่ 4 เรื่อง ผมก็แค่ลาก A2:A5 ดังนี้ได้เลย

dropdown0

ทีนี้ก็จะได้ Dropdown มาใช้แบบง่ายๆ แล้ว ไม่มีอะไรยากเลยใช่มั้ยครับ ^^

dropdown3

ทำ Dropdown โดยใช้ Define Name ดีกว่า

วิธีที่ดีกว่าการเลือก Range ก็คือการใช้ Define Name มาแทน ผมสามารถตั้งชื่อ List 4 เรื่องนั้นใน Define Name ชื่อ Movies ได้ ซึ่งมี 2 วิธี คือ

  1. ตั้งชื่อใน Name Box : ลากคลุม 4 เรื่อง (4 ช่อง)แล้วใส่ชื่อใน Name Box
  2. ใช้ Create Names from Selection : ลากคลุมถึง Heading (5 ช่อง) แล้วกด Ctrl+Shift+F3 เพื่อตั้งชื่อจากช่องบนสุด (หากติ๊ก Top Row อย่างเดียวอยู่แล้วก็กด Ok ได้เลย)ซึ่งในทีนี้ผมขอทำวิธีที่ 2 เพราะความชอบส่วนตัวล้วนๆ
    dropdown1

จากนั้นให้ไปที่ Cell ที่ต้องการจะทำ Dropdown แล้วเลือก [Data] –> Data Validation แล้วเลือก List แล้วใส่ชื่อที่ตั้งไว้ลงไป (กด F3 เพื่อช่วยในการเลือกชื่อที่ตั้งไว้แล้วได้)

dropdown2

ทีนี้ก็จะได้ Dropdown มาใช้เช่นเดียวกับวิธีแรกเลย แต่แบบนี้เจ๋งกว่าตรงที่แก้ไขตอนหลังง่าย และเขียนสูตรง่ายกว่าเยอะ ซึ่งเดี๋ยวเราจะทำกันในบทความนี้

dropdown3

ความยุ่งอยู่ที่ Dropdown ขั้นที่สอง

Concept การทำ Dropdown ของเรายังเหมือนเดิม ไม่ว่ามันจะมีกี่ชั้นก็ตาม นั่นคือ ใช้ Define Name มาเป็น item ของ Dropdown นั้น แปลว่า ถ้าเป็น Dropdown ชั้นที่ 2 ก็ต้องใช้ Define Name ที่แทน item ที่จะเป็นตัวเลือกของชั้นที่สอง

ความพิเศษอยู่ที่ว่า Dropdown ตัวที่สองเนี่ย มันสามารถเปลี่ยน item List ไปได้ โดยขึ้นอยู่กับการเลือก Dropdown ตัวแรก ซึ่งวิธีที่ง่ายที่สุดที่จะทำแบบนี้ได้ ก็คือใช้การเขียนสูตรมาช่วยนั่นเอง

แปลว่าเราจะต้องสร้าง Define Name ของ List ชั้นที่ 2 ให้ครบทั้ง 4 List ซะก่อน

สร้าง Define Name ของ List ชั้นที่ 2

หากผมลองสร้าง List ที่จะเป็น item ของ Dropdown ชั้นที่สอง โดยใช้ชื่อของ List แทนชื่อหนัง โดยลองคลุมทั้งหมดแล้วกด Ctrl+Shift+F3 แล้วเลือกแค่ Top Row อันเดียว (เพราะใช้ Top Row ในการตั้งเป็นชื่อ)

dropdown4

จะได้ผลลัพธ์ออกมาดังนี้

  • คอลัมน์ D ได้ชื่อ บ้านผีปอป คือ D2:E12 ซึ่งอันนี้ออกมาปกติ เราใช้ทำงานได้
  • คอลัมน์ E ได้ชื่อ Star_Wars  คือ E2:E12 อันนี้ ชื่อดันมีเครื่องหมาย _ โผล่มาแทนช่องว่างซะงั้น
  • คอลัมน์ F ได้ชื่อ _13_เกมสยอง คือ F2:F12 อันนี้ ชื่อดันมีเครื่องหมาย _ โผล่มาหน้าสุด และมี _ แทนช่องว่างด้วย
  • คอลัมน์ F อันนี้หนักสุดเลย! ไม่มีชื่อ 300 ถูกตั้งขึ้นมาด้วยซ้ำ

ลองทำ Dropdown ชั้นที่สองดู

สมมติว่าผมยังไม่สนใจชื่อแปลกๆ ที่โผล่มา… หากผมต้องการทำให้ Dropdown ชั้นที่สองเป็น List ของบ้านผีปอบ ผมก็สามารถใช้ Data Validation แล้วใส่ชื่อโดยกด F3 เลือกได้ดังนี้

dropdown5

ทีนี้เนื่องจากชื่อมันต้องเปลี่ยนไปหากผมเปลี่ยนการเลือกของ Dropdown ครั้งแรก แปลว่าผมไม่สามารถใส่ชื่อลงไปตรงๆ ได้ แต่ผมต้องใส่ให้มัน Link กับ Dropdown ชั้นแรก โดยการใส่ว่า =A9 แทน

แต่ถ้าเราไปเขียนเป็น =A9 ตรงๆ มันจะได้ผลลัพธ์เป็นคำว่า “บ้านผีปอบ” (ที่เป็น Text ไม่ใช่ Define Name )กลับไปแทน

ดังนั้นเราต้องใช้ฟังก์ชั่น INDIRECT มาช่วยแปลง Text ให้เป็น Cell Reference จริงๆ อีกที นั่นคือ =INDIRECT(A9) จึงจะออกมาเป็น Define Name ที่ชื่อว่า บ้านผีปอบ จึงจะทำงานได้ (สังเกตว่าผมต้องเลือก Dropdown ชั้นแรกให้มีค่าก่อน ไม่งั้นมันจะขึ้นเตือนว่า Dropdown ชั้นที่2 จะมีปัญหา)

dropdown6

ลองเลือกบ้านผีปอบ แล้วเลือก Dropdown ขั้น 2 ซึ่งออกมาใช้งานได้!

dropdown7

ปัญหาเริ่มเกิด

แต่ปัญหาที่เกิดขึ้นคือ หากเราเปลี่ยน Dropdown ชั้นแรกเป็น Star Wars แทน คราวนี้ Excel กลับไม่สามารถใช้งาน Dropdown ชั้นที่สองได้แล้ว!! (นี่คือปัญหาที่หลายๆ คนอาจจะเจอตอนทำตามที่ผมสอนในบทความเดิมก่อนหน้านี้)

dropdown8

สาเหตุเป็นเพราว่า Excel ไม่สามารถหาชื่อที่เขียนว่า Star Wars ได้นั่นเอง (เพราะในไฟล์เรามีแต่ชื่อ Star_Wars) นี่แหละคือสาเหตุที่ทำให้หลายคนทำตามผมในตัวอย่างที่แล้ว แต่ทำตามไม่ได้ เกิดปัญหา เพราะว่าชื่อที่ตั้งขึ้นมามันไม่เหมือน Item ที่เลือกในชั้นแรกนั่นเอง

สาเหตุที่ชื่อที่ถูกตั้งขึ้นจริง (จากการกด Ctrl+Shift+F3) ไม่เหมือนกับสิ่งที่เราตั้งใจไว้เกิดจากข้อจำกัดของการตั้งชื่อครับ

ชื่อที่กำลังจะตั้งขึ้นมาใหม่นั้นมีข้อจำกัดดังนี้

  • หากมีช่องว่าง จะถูกแทนที่ด้วย _
    • เช่น Star Wars  จะกลายเป็น Stars_Wars ให้
  • หากขึ้นต้นด้วยตัวเลข (แต่มี Text ต่อ) จะถูกใส่ _ นำหน้าชื่อให้โดยอัตโนมัติ
    • เช่น 13 เกมสยอง กลายเป็น _13_เกมสยอง
  • หากมีแต่ตัวเลข ไม่สามารถตั้งชื่อได้เลย
    • เช่น 300 ไม่สามารถตั้งชื่อได้เลย

ทางแก้ไขทำไง?

ทางแก้มีอยู่ 2 วิธีใหญ่ๆ

  1. เขียนสูตรแก้ไข : ตอนที่จะทำ Data Validation ให้เขียนสูตรแปลง item ให้เหมือนกับชื่อที่จะเกิดขึ้นมา เช่น เติมพวก _ ให้โดยอัตโนมัติ
    • เช่น แทนที่เราจะ INDIRECT(A8) ตรงๆ เราก็ INDIRECT(SUBSTITUTE(A8,” “,”_”)) แทนสิ ก็จะแก้ปัญหาเรื่องการมีช่องว่างได้แล้ว…
    • แต่ถ้ามีขึ้นต้นด้วยตัวเลข ก็ต้องมาเขียนดักอีก เช่นให้เริ่มด้วย _ หากใช้ Left เช็คตัวแรกแล้วเป็นตัวเลข ซึ่งจะเห็นว่าเริ่มยุ่งยากแล้ว
    • ยังไงชื่อ 300 ก็มีปัญหาตั้งชื่อไม่ได้อยู่ดี…
    • ดังนั้นผมจึงอยากแนะนำวิธีที่ 2 ดีกว่า เพราะครอบคลุมแก้ไขได้ทุกกรณี
  2. ตั้งชื่อ Dropdown เป็นคำที่ไม่ติดปัญหา แล้วใช้ VLOOKUP เอา : แทนที่เราจะตั้งชื่อ Dropdown ชั้นที่ 2 ด้วยชื่อหนัง ซึ่งอาจเปิดปัญหา เราก็ตั้งชื่อกลางๆ ไปเลย เช่น Movie1,Movie2,Movie3… ก็ได้
    • ก่อนอื่นลบ Define Name เดิมของ Dropdown ชั้น 2 ทิ้งให้หมดก่อน ด้วย [Formula] –> Name Manager
      dropdown9
    • ตั้งชื่อด้วย Movie1, Movie2, Movie3, Movie4 แทน
      dropdown10
    • สร้างความสัมพันธ์กับ Dropdown ชั้นแรก เพื่อจะใช้ VLOOKUP ได้ภายหลัง
      dropdown11
    • จากนั้นใน Data Validation ของ Dropdown ชั้นที่ 2 เราจะใช้ VLOOKUP มาช่วย Map ข้อมูลว่า item ของ Dropdown ชั้นแรก จะ Link กับ Define Name ของ Dropdown ชั้นที่ 2 ยังไง?
      dropdown12
    • เพียงเท่านี้ Dropdown ชั้นที่ 2 ก็ทำงานได้แล้วทุกกรณีdropdown14
    • แม่แต่ 300 ก็ไม่กลัว!
      dropdown13

ช่องว่าง…ของแถมที่ไม่อยากได้

จะเห็นว่าวิธีตามบทความนี้ยังมีจุดอ่อนอยู่เล็กน้อย คือ ถ้ากรณี List ของ Dropdown ชั้นที่ 2 มีข้อมูลไม่เท่ากัน ถ้าอยากจะตั้งชื่อทีเดียวด้วย Ctrl+Shift+F3 จะต้องลากคลุมตามตัวที่มี item เยอะสุด ซึ่งจะทำให้ได้ช่องว่างแถมมาในชื่อที่มี item น้อยกว่าด้วย

เดี๋ยวเราจะมาดูวิธีแก้ไขเรื่องนี้ในบทความหน้ากันครับ ด้วยการทำ Dynamic Range ใครอยากรู้ห้ามพลาดเด็ดขาด!!