EXCEL TOOLS
Excel Add-ins ที่พัฒนาโดยคุณสันติพงศ์ ณสุย (MVP Excel 2010-2020) ด้วยภาษา C# เพื่อแก้ไขปัญหาไฟล์ใหญ่ คำนวณนาน ทำงานช้า จัดการข้อมูลต่าง ๆ ที่ทำงานประจำวันได้อย่างสะดวกรวดเร็ว สนใจคลิกไปดูได้ที่นี่ครับ => Excel Tools
Excel Add-ins ที่พัฒนาโดยคุณสันติพงศ์ ณสุย (MVP Excel 2010-2020) ด้วยภาษา C# เพื่อแก้ไขปัญหาไฟล์ใหญ่ คำนวณนาน ทำงานช้า จัดการข้อมูลต่าง ๆ ที่ทำงานประจำวันได้อย่างสะดวกรวดเร็ว สนใจคลิกไปดูได้ที่นี่ครับ => Excel Tools
[code]
และปิดด้วย [/code]
ตัวอย่างเช่น [code]dim r as range[/code]
เพื่อให้แตกต่างจากข้อความทั่วไป สะดวกในการอ่านและทดสอบ (คลิกเพื่อดูตัวอย่าง)หมายถึงหาตัวเลขสุดท้ายในช่วงข้อมูล B$7:B7 ซึ่งจะเห็นว่า B7 ตัวหลังไม่ได้มีการ Lock หมายเลขบรรทัด หาก Copy ไปด้านล่างตัวเลขจะ Run ไปเรื่อย ๆ นั่นหมายถึงเพิ่มช่วงข้อมูลไปเรื่อย ๆ และเรากำลังหาตัวเลขสุดท้ายจากช่วงข้อมูลนั้นครับjoo wrote:อาจารย์ครับ...ช่วยอธิบาย 3 สูตรนี้ให้หน่อยครับมันทำงานยังไงครับจะได้นำไปประยุกต์ใช้ต่อได้ถูก
1. =LOOKUP(9.99999999999999E+307,B$7:B7)
หมายถึงหาค่าที่น้อยกว่าหรือเท่ากับ 2 จากช่วง 1/(($B6=Report!$I$7:$I$36)*($C6=Report!$C$7:$C$36)) แล้วนำค่าที่ตรงกันในช่วง Report!$F$7:$F$36 มาแสดง2. =IF(C6="","",LOOKUP(2,1/(($B6=Report!$I$7:$I$36)*($C6=Report!$C$7:$C$36)),Report!$F$7:$F$36))
สูตรนี้เป็นสูตร Array ความหมายคือจากช่วง Report1!$D$6:$D$30 ให้นำตำแหน่งที่ได้จากผลลัพธ์ของ MATCH(1,IF(Report1!$C$6:$C$30=C23,IF(Report1!$B$6:$B$30=B23,1)),0) มาแสดง3.=INDEX(Report1!$D$6:$D$30,MATCH(1,IF(Report1!$C$6:$C$30=C23,IF(Report1!$B$6:$B$30=B23,1)),0))
การใช้สูตรแบบ Array โดยทั่วไปย่อมประมวลผลช้ากว่าสูตรแบบไม่เป็น Array แต่ตัวอย่างสูตร Lookup ที่ผมใช้แม้จะไม่ได้กดแป้นให้รับสูตรด้วย Ctrl+Shift+Enter แต่ Lookup เองมีสภาพเป็นสูตร Array โดยธรรมชาติ การใช้ตามที่ผมให้เป็นตัวอย่างไปนั้นก็ไม่ได้คำนวณเร็วในแบบสูตรทั่ว ๆ ไปครับแล้วการใช้สูตรที่ดึงข้อมูลได้หลายเงื่อนไข เช่น Index, Match ซึ่งใช้แบบ Array หรือ Lookup มันแตกต่างกันอย่างไรตัวไหนทำงานได้เร็วและประหยัดทรัพยากรกว่ากันเมื่อข้อมูลมีปริมาณเพิ่มมากขึ้น
ขอบคุณครับ
joo wrote:ขอบคุณครับ พอเข้าใจนิดหน่อยครับมีข้อสงสัย 1 ข้อและคำถามเพิ่ม 1 ข้อครับ
1.จากสูตรข้างล่างนี้ที่อธิบายไว้ ผมสงสัยเลข 2 ตัวนี้ครับกำหนดมาจากไหนผมลองเปลี่ยนเป็นเลขอื่นตั้งแต่1-10 ค่าที่ลิงค์มาก็แสดงเหมือนกับที่เป็นเลข2
=IF(C6="","",LOOKUP(2,1/(($B6=Report!$I$7:$I$36)*($C6=Report!$C$7:$C$36)),Report!$F$7:$F$36))
snasui wrote:หมายถึงหาตัวเลขสุดท้ายในช่วงข้อมูล B$7:B7 ซึ่งจะเป็นว่า B7 ตัวหลังไม่ได้มีการ Lock หมายเลขบรรทัด หาก Copy ไปด้านล่างตัวเลขจะ Run ไปเรื่อย ๆ นั่นหมายถึงเพิ่มช่วงข้อมูลไปเรื่อย ๆ และเรากำลังหาตัวเลขสุดท้ายจากช่วงข้อมูลนั้นครับjoo wrote:อาจารย์ครับ...ช่วยอธิบาย 3 สูตรนี้ให้หน่อยครับมันทำงานยังไงครับจะได้นำไปประยุกต์ใช้ต่อได้ถูก
1. =LOOKUP(9.99999999999999E+307,B$7:B7)หมายถึงหาค่าที่น้อยกว่าหรือเท่ากับ 2 จากช่วง 1/(($B6=Report!$I$7:$I$36)*($C6=Report!$C$7:$C$36)) แล้วนำค่าที่ตรงกันในช่วง Report!$F$7:$F$36 มาแสดง2. =IF(C6="","",LOOKUP(2,1/(($B6=Report!$I$7:$I$36)*($C6=Report!$C$7:$C$36)),Report!$F$7:$F$36))
จาก (($B6=Report!$I$7:$I$36)*($C6=Report!$C$7:$C$36)) จะให้ผลลัพธ์เพียง 2 ค่าครับ คือ True หรือ False และเมื่อใช้หนึ่งเป็นตัวตั้งเป็น
1/(($B6=Report!$I$7:$I$36)*($C6=Report!$C$7:$C$36)) ผลลัพธ์จะได้ 1 หรือ #Div/0!
ดังนั้นการหาค่าที่น้อยกว่าหรือเท่ากับ 2 จากช่วง 1/(($B6=Report!$I$7:$I$36)*($C6=Report!$C$7:$C$36)) จึงเท่ากับว่าเป็นการหาค่าเลข 1 ที่ปรากฎเป็นตัวสุดท้ายอยู่ที่ใด ให้นำค่าที่ตรงกันใน Report!$F$7:$F$36 มาแสดง
ดูจากที่ผมอธิบายไว้ตรงนี้ครับ ชัดเจนแล้วครับjoo wrote:ขอบคุณครับ พอเข้าใจนิดหน่อยครับมีข้อสงสัย 1 ข้อและคำถามเพิ่ม 1 ข้อครับ
1.จากสูตรข้างล่างนี้ที่อธิบายไว้ ผมสงสัยเลข 2 ตัวนี้ครับกำหนดมาจากไหนผมลองเปลี่ยนเป็นเลขอื่นตั้งแต่1-10 ค่าที่ลิงค์มาก็แสดงเหมือนกับที่เป็นเลข2
=IF(C6="","",LOOKUP(2,1/(($B6=Report!$I$7:$I$36)*($C6=Report!$C$7:$C$36)),Report!$F$7:$F$36))
เป็นการหาค่าที่น้อยกว่าหรือเท่ากับค่าที่ต้องการ ตราบใดเงื่อนไขที่ต้องการทดสอบมีค่ามากกว่าหรือเท่ากับ 1/(($B6=Report!$I$7:$I$36)*($C6=Report!$C$7:$C$36)) ก็จะได้คำตอบเสมอ ที่ไม่ใส่เลขอื่นเพราะต้องการให้ง่ายและเป็นตัวเร่งให้หาเร็วขึ้น เพราะเป็นเลขที่มากกว่าค่าของ 1/(($B6=Report!$I$7:$I$36)*($C6=Report!$C$7:$C$36)) ครับหมายถึงหาค่าที่น้อยกว่าหรือเท่ากับ 2 จากช่วง 1/(($B6=Report!$I$7:$I$36)*($C6=Report!$C$7:$C$36)) แล้วนำค่าที่ตรงกันในช่วง Report!$F$7:$F$36 มาแสดง
จะต้องมีเซลล์ที่เป็นเงื่อนไขมาบอกครับว่าต้องการยกเลิก แล้วค่อยใช้ If มาตรวจสอบว่าถ้าเซลล์เงื่อนไขมีค่ายกเลิกก็ให้แสดงเครื่องหมายตรงกันข้าม2. จากซีท Main สูตรที่ D14 =IF(D12="","",IF(D13="","",IF(D15="ครึ่ง
วัน",0.5,SUMPRODUCT(--(WEEKDAY(ROW(INDIRECT(D12&":"&D13)),2)<6)))))
เมื่อมีการยกเลิกวันลาอยากให้จำนวนวันที่แสดงมีค่าติดลบต้องทำยังไงครับ เช่น เดิมทีลาไว้วันที่ 25/01/2011 ถึงวันที่ 27/01/2011 ทีนี้ต้องการยกเลิกวันลาวันที่27/01/2011 ก็จะคีย์วันที่ 27/01/2011 ลงในเซลล์ D12,D13 แล้วต้องการให้ค่าที่แสดงในเซลล์ D14 มีค่าติดลบตามจำนวนวันที่ยกเลิก เช่น -1