PDA

View Full Version : การทำ DataValidation List ไม่ให้ข้อมูลซ้ำ



ie36022
22 Jun 2007, 21:31
ผมสร้าง List มาใน ไฟล์งานตัวอย่าง แต่มีวันที่บางวันซ้ำกันจึงอยากทราบวิธีการเลือกแต่ข้อมูลที่ไม่ซ้ำกันลงใน List เนื่องจากต้องมีการเพิ่มข้อมูลทุกวันซึ่งทุกวันก็จะมีข้อมูลซ้ำกันมากกว่า 1 รายการ วัตถุประสงค์เพื่อที่ผมจะนำไปทำการหาผมรวมของจำนวนยอดผลิตที่ผลิตได้ในแต่ละผลิตภัณฑ์ของแต่ะละช่วงวัน เช่นต้องการหาผลรวมของ Part A ตั้งแต่วันที่ 1 ถึง15 โดยวันที่เริ่มต้นและวันสุดท้าย จะสร้างรายการให้เลือกโดยใช้ List ครับ

วานิชย์
22 Jun 2007, 23:56
ตามไฟล์แนบครับ

โดยขั้นแรกใช้
=COUNTIF($C$2:C2,C2)
เพื่อหาวันที่ที่ไม่ซ้ำ

จากนั้นใช้
=SMALL(IF($D$2:$D$39=1,$C$2:$C$39,999999),ROW()-1)
เพื่อแสดงวันที่ที่ไม่ซ้ำ

สุดท้ายใช้ Range Name
=OFFSET(Ans!$E$2,,,COUNTIF(Ans!$E$2:$E$39,"<>999999"),1)
เพื่อนำเฉพาะค่าที่ไม่ซ้ำไปแสดงใน List ครับ
:)

ie36022
23 Jun 2007, 20:15
ขอบคุณครับ คุณวานิชย์ แต่ไม่ทราบว่ายังพอจะมีวิธีอื่นอีกบ้างไหมครับซึ่งจะสามารถเลือกรายการวันที่เริ่มคีย์ข้อมูลจนถึงวันล่าสุดที่เราผลิต ซึ่งไม่ต้องใช้วิธีการดึงข้อมูลออกมากรองใหม่ ไม่ทราบว่า VBA จะช่วยได้ไหมครับ ขอบคุณครับ

สมเกียรติ
24 Jun 2007, 08:53
ต้องอาศัยสูตร Dynamic Range : Offset ช่วยปรับขนาดตาราง แล้วจึงนำตารางไปหา Unique ต่อครับ ดูคำอธิบายที่ http://www.excelexperttraining.com/coolsecret/roffset.html

ตัวอย่างแนบนี้ผมเปรียบเทียบวิธีหา Unique ที่ใช้สูตร กับ VBA Function

ie36022
25 Jun 2007, 21:02
ขอบคุณครับ

Khachonyot
25 Jun 2007, 22:15
ขอบคุณครับ
ผมลองทำเป็นตัวเลข ทำไม่ผลออกมาเป็น 99999 ครับ

สมเกียรติ
25 Jun 2007, 22:45
สูตร Array Step2 ต้องสร้างพร้อมกันทุกเซลล์ครับ และปรับสูตรเป็น
=SMALL(IF( D2 : D39 =1, C2 : C39), ROW(C2 : C7)-1)

Khachonyot
26 Jun 2007, 08:13
อาจารย์ครับ อาจารย์ช่วยเสริมคำอธิบายเพิ่มเกี่ยวกับสูตรว่าเหตุจึงต้องเปลี่ยนสูตร SMALL(IF($D$2:$D$39=1,$C$2:$C$39,999999),ROW()-1) เป็น
SMALL(IF(D2:D39=1,C2:C39),ROW(C2:C7)-1) สักเล็กน้อยเพื่อให้ผมและผู้ต้องความรู้เห็นช่องทางของสูตรนั้นๆมากยี่งขึ้น /ขอบพระคุณอาจารย์มากครับ

สมเกียรติ
26 Jun 2007, 09:27
ก่อนอื่นสูตรนี้เริ่มต้นจากคุณวานิชย์เป็นผู้ตอบในกระทู้นี้ ผมคงจะตอบในแบบของผมนะครับ

=SMALL(IF( D2 : D39 =1, C2 : C39), ROW(C2 : C7)-1)

ส่วนแรก IF( D2 : D39 =1, C2 : C39) ทำหน้าที่ตรวจสอบแต่ละเซลล์ในช่วง D2 : D39 ว่าตำแหน่งใดมีค่าเท่ากับ 1 ซึ่งถ้าใช่ให้คืนค่าเป็นค่าจาก C2 : C39 แต่ถ้าไม่ใช่ก็ให้ปล่อยตำแหน่งที่ไม่ใช่เป็น False ไปเลยโดยไม่จำเป็นต้องใส่เลข 9999 แทนก็ได้

ส่วนต่อไป SMALL(ค่าที่ได้จากIF, ROW(C2 : C7)-1) ทำหน้าที่เรียงลำดับตัวเลขจากน้อยไปมาก ตามเลขลำดับ 1, 2, 3, 4, 5, 6 ที่คำนวณได้จากสูตร ROW(C2 : C7)-1

การที่ใช้สูตร ROW(C2 : C7)-1 มีข้อจำกัดว่าจะต้องใช้สูตรนี้เริ่มจาก Row 2 เท่านั้น ถ้าจะให้ดีขึ้นสามารถย้ายสูตรไปใช้ที่เซลล์อื่นได้ ควรแก้เป็น ROW(C2 : C7) -ROW(C2) +1

ถ้าสร้างสูตรตามแบบของผม ให้ดูที่นี่ครับ
http://www.excelexperttraining.com/forum/viewtopic.php?t=259

สมเกียรติ
26 Jun 2007, 09:40
ขอแก้เลข 39 เป็น 7 ทุกตัวครับ เป็น
=SMALL(IF( D2 : D7 =1, C2 : C7), ROW(C2 : C7)-1)
หรือ
=SMALL(IF( D2 : D7 =1, C2 : C7), ROW(C2 : C7)-ROW(C2)+1)