Excel มักใช้ Dropdown (รายการเลือก) เพื่อมาตรฐาน/ลดความผิดพลาดในการกรอกข้อมูล สร้างด้วย Data Validation > List
วิธีพื้นฐาน: เลือกเซลล์ > Data Validation (แท็บ Data) > List > ใส่รายการคั่นด้วยคอมม่าใน Source
ข้อจำกัด: ต้องแก้ Data Validation ทุกครั้งที่เปลี่ยนรายการ ยากสำหรับผู้ใช้ใหม่ หรือรายการยาว
วิธี Named Range: วางรายการใน Named Range แล้วอ้างอิงชื่อใน Source (ขึ้นต้นด้วย =) แก้ไขรายการง่ายขึ้น
แต่เพิ่ม/ลบรายการยังมีปัญหา: Named Range อ้างอิงช่วงเซลล์คงที่ (เช่น $H$3:$H$10) เพิ่มข้อมูลใน H11 ไม่แสดงใน Dropdown ลบข้อมูล จะเหลือช่องว่างใน Dropdown
โซลูชัน: ใช้ Dynamic Range Name ที่ขยาย/หดตัวตามข้อมูลจริง โดยใช้ สูตร (Formula) แทนช่วงเซลล์คงที่
วิธีสร้าง Dynamic Range ใน Excel
Named Range ธรรมดา (Static) อ้างอิงช่วงคงที่ ($H$3:$H$10)
Dynamic Range ใช้สูตร เช่น:
=OFFSET(FruitsHeading,1,0,IFERROR(MATCH(TRUE,INDEX(ISBLANK(OFFSET(FruitsHeading,1,0,20,1)),0,0),0)-1,20),1)
FruitsHeading = ชื่อช่องหัวตาราง (อยู่เหนือรายการ 1 แถว) ตัวเลข 20 = ขนาดสูงสุดของรายการ (แถว) ปรับได้
ในตัวอย่างมีข้อมูล 8 แถว แต่บล็อกเตรียมไว้ 20 แถว สูตรจะนับเฉพาะแถวที่มีข้อมูลจริง
แยกวิเคราะห์สูตร (ทีละส่วน):
- OFFSET(FruitsHeading,1,0,20,1) – อ้างอิงบล็อก 20 แถวใต้หัวตาราง (เริ่ม 1 แถวล่าง 0 คอลัมน์ สูง 20 แถว กว้าง 1 คอลัมน์)
- ISBLANK(...) – ตรวจสอบแต่ละเซลล์ในบล็อก 20 แถว สร้างชุด TRUE/FALSE 20 ค่า (FALSE = มีข้อมูล, TRUE = ว่าง) 8 ค่าแรก FALSE, 12 ค่าท้าย TRUE
- INDEX(...,0,0) – คืนค่า Array ทั้งชุด 20 TRUE/FALSE (row=0, col=0 = ทั้งบล็อก)
- MATCH(TRUE,...,0) – หาตำแหน่ง TRUE แรก ใน Array (แถวที่ 9 = ว่างแรก) คืนค่า 9
- MATCH(...)-1 – ลบ 1 ได้ 8 = จำนวนรายการจริง (แถวสุดท้ายที่มีข้อมูล)
- IFERROR(...,20) – ถ้าบล็อกเต็ม 20 แถว (ไม่มี TRUE) MATCH จะ Error IFERROR คืนค่า 20 แทน
- OFFSET(FruitsHeading,1,0,ผลลัพธ์ข้างต้น,1) – ส่งคืนช่วงที่ต้องการ: เริ่มใต้หัวตาราง สูง = จำนวนรายการจริง กว้าง 1 คอลัมน์
ใช้สูตรนี้เป็น Source ของ Dropdown: เพิ่ม/ลบรายการได้อิสระ (ต้องต่อเนื่องจากบนสุด) Dropdown จะอัปเดทอัตโนมัติ
วิธีทางเลือก: ตั้งชื่อบล็อกรายการเป็น Named Range (เช่น NameBlock) ใช้สูตรปรับเปลี่ยน:
=OFFSET(NamesHeading,1,0,IFERROR(MATCH(TRUE,INDEX(ISBLANK(NameBlock),0,0),0)-1,ROWS(NameBlock)),1)
NameBlock แทน OFFSET(...) และ ROWS(NameBlock) แทนตัวเลข 20
สรุป: Dropdown ที่แก้ไขง่าย ให้ผู้ใช้อื่นทำได้ ใช้ Dynamic Range Names! ไม่ได้ใช้แค่ Dropdown ใช้ได้ทุกที่ที่ต้องอ้างอิงช่วงข้อมูลที่เปลี่ยนขนาดได้