ในการ Report ผลการทดสอบ จะมีเกณฑ์ และเงื่อนไขต่างกัน ซึ่งปัญหาที่เจอคือ การใช้เงื่อนไข IF, AND, OR ซับซ้อนหลายขั้น แต่เท่าที่ทราบจะมีแค่ Trueกับ False (2ทางเลือก แต่ต้องการข้อมูลมากกว่า 2 ทางเลือก มีตัวอย่างตาม File แนบ
| กฏกติกาของฟอรัม - Favorite - ยาใจ - จับหลักสมาธิภาวนา - อบรม Excel - XLSiam Signature - YouTube - บทความ Excel - xlClub - hrBlog - Downloads - รับข่าวสาร |
ในการ Report ผลการทดสอบ จะมีเกณฑ์ และเงื่อนไขต่างกัน ซึ่งปัญหาที่เจอคือ การใช้เงื่อนไข IF, AND, OR ซับซ้อนหลายขั้น แต่เท่าที่ทราบจะมีแค่ Trueกับ False (2ทางเลือก แต่ต้องการข้อมูลมากกว่า 2 ทางเลือก มีตัวอย่างตาม File แนบ
ให้นำเงื่อนไขมาใส่เป็นตารางแล้วใช้สูตร
=IF(ISNA(VLOOKUP(O8,$T$8:$U$13,2,0)),"ผ่าน",VLOOKUP(O8,$T$8:$U$13,2,0))
แนะนำให้แนบแฟ้ม xls รุ่นเก่าดีกว่าครับ เพราะส่วนใหญ่ยังไม่ใช้ 2007 กัน เว้นแต่ว่าคำถามเกี่ยวข้องกับของใหม่ๆใน 2007 ก็จำเป็น
เรียนอาจารย์ สมเกียรติคะ
จากตัวอย่างที่อาจารย์เเนะนำให้นั้น หนูคิดว่ายังไม่ตรงตามที่ต้องการ แต่จะนำไปประยุกต์ใช้ในเรื่องอื่นแทน หนูจึงได้ส่งรายละเอียดมาให้อาจารย์ และสมาชิกทุกท่าน ช่วยแนะนำอีกครั้งคะ
จากข้อมูล ให้ A2 = "SM/ASM" โดยที่ B2 = "มากว่า หรือเท่ากับ 90" และต้องการให้ C2 = "ผ่าน"
โดยมีเงื่อนไข ดังนี้ ถ้า Column A เป็น "SM/ASM" แล้วคะแนนใน Column B เท่ากับ "90 - 100" ให้ Column C เป็น "ผ่าน" หรือ Column B เท่ากับ "85 - 89.9" ให้ Column C เป็น "ซ่อม" หรือ Column B เท่ากับ "น้อยกว่าหรือเท่ากับ 84.9" ให้ Column C เป็น "เรียนใหม่" หรือ ถ้า Column A เป็น "Staff" แล้วคะแนนใน Column B เท่ากับ "85 - 100" ให้ Column C เป็น "ผ่าน" หรือ Column B เท่ากับ "80 – 84.9" ให้ Column C เป็น "ซ่อม" หรือ Column B เท่ากับ "น้อยกว่าหรือเท่ากับ 80" ให้ Column C เป็น "เรียนใหม่" หรือ ถ้า Column A เป็น "Trainee" แล้วคะแนนใน Column B เท่ากับ "85 - 100" ให้ Column C เป็น "ผ่าน" หรือ Column B เท่ากับ "80 – 84.9" ให้ Column C เป็น "ซ่อม" หรือ Column B เท่ากับ "น้อยกว่าหรือเท่ากับ 80" ให้ Column C เป็น "ไม่จบโครงการ" :bang: :bang: :bang:
{=INDEX($L$7:$L$15,MATCH(A2&B2,$J$7:$J$15&$K$7:$K$15))}
เป็นสูตร Array ต้องกด Shift+Ctrl+Enter แทน Enter ธรรมดานะครับ
ลองดู File แนบนะครับ
ขอบคุณครับ
ขอขอบคุณ zv735 มากมายนะค่ะ ดูแล้วง่ายจัง แต่ทำไมเราถึงได้ทำให้มันดูยากและซับซ้อนก็ไม่รู้ บังเอิญไม่ค่อยเก่ง Excel ด้วย แต่ชอบที่จะค้นหา, ลองผิดลองถูกไปเลย โชคดีมากเลยที่เรามาเจอ Web ดีๆ แบบนี้
จากตัวอย่างที่ zv735 ให้มามันเวิร์ค มากๆ คะ แต่ติดปัญหาอยู่นิดหนึ่ง คือ หาก Column B = 100.00 เมื่อใด การแสดงผลของ Column C จะผิดทันที แต่ไม่เป็นไรคะ เราจะลองแก้ไขหรือประยุกต์ใช้ไปเรื่อยๆ คะ
Thank, : )
janhom_amp
ใช่จริงๆด้วยครับ ผมเองก็ไม่รู้จะแก้ยังไงครับ ลองดูผู้รู้ท่านอื่นนะครับ
ผมแก้ปัญหาเฉพาะหน้าให้ก่อนโดยใช้ If ดัก Error ครับ
=IF(B2=100,"ผ่าน",INDEX($L$7:$L$15,MATCH(A2&B2,$J$7:$J$15&$K$7:$K$15)))
ลองดู File แนบนะครับ
ขอบคุณครับ
มันใช้ได้ดีทีเดียวคะ
"ขอบคุณมากมายอีกครั้งนะค่ะ"
เดี๋ยวครั้งหน้าจะนำปัญหาอื่นมาถามอีกคะ
ขออนุญาตคุณ ZV735 นะครับ
ขอแก้ไขสูตรของคุณ ZV735 เพิ่มเป็น
=INDEX($L$7:$L$15,MATCH(A2&TEXT(B2,"000"),$J$7:$J$15&TEXT($K$7:$K$15,"000")))
ตามไฟล์แนบครับ
ขอบคุณครับ*:-)
ผมใช้วิธีสร้างตารางเงื่อนไขขึ้นมา แล้วใช้ VLOOKUP เพื่อแสดงข้อมูล ดังนี้
=VLOOKUP(B2,J7:M11,MATCH(A2,J7:M7,0)) หรือ
=IF(ISBLANK(B2),"",VLOOKUP(B2,J7:M11,MATCH(A2,J7:M7,0)))
ลองดูในไฟล์แนบนะครับ
ได้ความรู้เพิ่มอีกแล้ว ดีใจจังเลย
ขอบคุณ คุณchansit กับ คุณเอก มากครับผม
ขออนุญาตคุณ ZV735 และ chansit ที่นำสูตรไปปรับปรุงใหม่ครับ
โดยส่วนตัวแล้วพยายามที่จะเลี่ยงการใช้ Match กับ Index ด้วยเหตุเพราะว่า
ต้องใช้เวลาในการประมวลผลช้า จึงหันมาใช้ Offset กับ Match แทน ซึ่งส่วนตัว
เห็นว่าเร็วกว่าและได้ผลลัพธ์เท่ากัน จึงแนะนำเพิ่มอีกช่องทางครับ
{=OFFSET($L$6,MATCH(A2&TEXT(B2,"000"),$J$7:$J$15&TEXT($K$7:$K$15,"000")),0)}
ปล.อย่าลืมกด Shift+Ctrl+Enter แทน Enter นะครับ
ขอบคุณครับคุณworachai_p
ผมจะได้นำไปป็นความรู้ด้วยครับ:great:
Offset เป็นสูตรกลุ่ม Volatile ที่จะคำนวณใหม่เองเสมอเมื่อเซลล์อื่นแม้ไม่เกี่ยวข้องกันมีการเปลี่ยนแปลง และถ้าใช้ link ข้ามแฟ้มจะต้องเปิดแฟ้มต้นทางด้วยเสมอครับ
ผมชอบใช้ Offset เพราะไม่จำเป็นต้องกำหนดขอบเขตพื้นที่ตารางไว้ในสูตร ต่างจาก Index ที่ต้องระบุขอบเขตไว้เสมอ
Index จะทำงานได้เร็วขึ้น ถ้าใช้สูตรแบบแนวเดียว เช่น
=Index(A1:A100, ตัวที่)
หรือ
=Index(A1:Z1, ตัวที่)
เพื่อทราบครับ
ได้ความรู้เพิ่มอีกแล้ว
จะลองแก้ปัญหาโดยใช้ Offset มากขึ้นเพื่อเปรียบเทียบดูครับ
ขอบคุณมากครับผม![]()
ขอบคุณ อ.สมเกียรติ ที่ช่วยขยายความเข้าใจมากครับ
เพราะเดิมใช้ด้วยความคุ้นเคยแต่ยังไม่ได้หาเหตุผลที่เป็นทางการได้
ลองนำไฟล์ไปทำดูค่ะ อาจารย์ ดิฉันชอบแบบง่าย ๆ ค่ะ ยังไงก็เจ้าของกระทู้ลองไปดูนะคะ แปลงเป็น 2003 แล้วค่ะ ยังไงก็ช่วยแนะนำด้วยค่ะ
โดยความเห็นส่วนตัวคิดว่า คอลัมน์ Index ไม่จำเป็นต้องมีก็ได้, มีการตั้งชื่อย่อ เพื่อเอามาใช้บอกสาขา ก็ไม่น่าจำเป็น, ตารางใน condition ก็ไม่จำเป็นต้องมี 79.99 เพราะเราใช้ vlookup แบบไม่เจาะจงอยู่แล้ว
ผมจึงทำการปรับปรุงชื่อข้อมูลบางชื่อเสียใหม่, แก้ไขสูตรในคอลัมน์สุดท้ายในตารางนิดหน่อย, และสำหรับคนที่สอบผ่านในรอบแรกแล้ว ก็ไม่จำเป็นต้องสอบใหม่ ผมก็เลยระบายช่องคะแนนสอบครั้งที่สอง สำหรับคนที่สอบผ่านซะเลย ลองดูในไฟล์แนบครับ
สำหรับสูตรในคอลัมน์ที่อยู่นอกตาราง ไม่ทราบว่ามีไว้เพื่ออะไร แกะดูก็ไม่ค่อยเข้าใจ จะลองปรับปรุงให้ใหม่ แต่ก็ไม่รู้ว่าต้องการอะไร และที่สำคัญผมคิดว่า สูตรนี้ยาวเกินไป แต่ถ้าจะทำให้สูตรสั้นลง ก็ลองแก้ตามสีที่ผมแยกไว้
=IF(OR(AND(I8="1",I8="2"),VALUE(N8)>90,),"OK",)&(IF(OR(AND(I8="1",I8="2"),VALUE(N8)<=89.9,),"Again")&IF(OR(AND(I8="1",I8="2"),IF(N8>90,"OK","No")<=85,),"Fail"))
ส่วนที่สามารถแก้ไขให้สั้นลงได้ มีดังนี้
AND(I8="1",I8="2") แก้เป็น I8<=2
VALUE(N8)>90, แก้เป็น N8>=90
VALUE(N8)<=89.9, แก้เป็น N8<90
ในเบื้องต้น สูตรก็จะสั้นลง เป็นแบบนี้
=IF(OR(I8<=2,N8>=90),"OK",)&(IF(OR(I8<=2,N8<90),"Again")&IF(OR(I8<=2,IF(N8>90,"OK","No")<=85,),"Fail"))
แต่ท่อนสุดท้ายนี้ ไม่เข้าใจจริงๆ ครับ และรู้สึกว่าผลลัพธ์ที่ได้ก็ทะแม่งๆ อยู่
ยินดีที่ได้แลกเปลี่ยนความคิดเห็นกันครับ
เห็นว่ามีผู้ตอบหลายท่านแวะเข้ามาดู
เป็นประเด็นที่น่าสนใจทีเดียวครับ
ลองทำตามที่เข้าใจ แล้วดูเหมือนว่าจะคล้ายๆกับหลายท่าน
สูตรที่ใช้คือ
=OFFSET(ref,MATCH(TRUE,LogicCalc,0),1)
และ
=AND(H2=Postn,Score>=I2)
ได้แนบไฟล์มาด้วยดรับ
Bookmarks