Page 1 of 2

นับวันสายแบบมีเงื่อนไข

Posted: Fri Jan 27, 2023 10:50 am
by yangkodza
นับสาย.PNG
จากภาพประกอบ อยากนับวันสาย โดยระบุเวลาดังนี้
คนที่ไม่อยู่่เวร มาทำงาน 7.15 น. ขึ้นไป สาย
ส่วนคนที่เวร มาทำงาน 7.00 น. ขึ้นไป สาย
โดยอ้างอิงกับ แผ่นงาน วันเวร
และให้แสดงผลการนับว่า สายกี่ครั้ง ที่เซลล์ AJ8 ใน แผ่นงานรายงานการมาทำงาน



นับวันสาย.xlsx

Re: นับวันสายแบบมีเงื่อนไข

Posted: Sat Jan 28, 2023 5:42 am
by snasui
:D ตัวอย่างสูตรที่เซลล์ AJ8 ครับ

=LET(day,LEFT($E$7:$AI$7,FIND(".",$E$7:$AI$7)),tran,IF(ISNUMBER(LEFT($E8:$AI8)+0),LEFT($E8:$AI8,5)),dth,INDEX(day,{2,3,4,5,6}),fdty,INDEX(วันเวร!$C$2:$G$113,MATCH("*"&$C8,TRIM(วันเวร!$B$2:$B$113),0),0),daydty,ISNUMBER(MATCH(day,IF(ISTEXT(fdty),dth),0)),rsc,SUM(IFERROR(daydty/(tran+0>="7:00"+0),0)),nrsc,SUM(IFERROR((1-daydty)/(tran+0>="7:15"+0),0)),rsc+nrsc)

Enter > Copy ลงด้านล่าง

Re: นับวันสายแบบมีเงื่อนไข

Posted: Sat Jan 28, 2023 11:29 am
by yangkodza
snasui wrote: Sat Jan 28, 2023 5:42 am :D ตัวอย่างสูตรที่เซลล์ AJ8 ครับ

=LET(day,LEFT($E$7:$AI$7,FIND(".",$E$7:$AI$7)),tran,IF(ISNUMBER(LEFT($E8:$AI8)+0),LEFT($E8:$AI8,5)),dth,INDEX(day,{2,3,4,5,6}),fdty,INDEX(วันเวร!$C$2:$G$113,MATCH("*"&$C8,TRIM(วันเวร!$B$2:$B$113),0),0),daydty,ISNUMBER(MATCH(day,IF(ISTEXT(fdty),dth),0)),rsc,SUM(IFERROR(daydty/(tran+0>="7:00"+0),0)),nrsc,SUM(IFERROR((1-daydty)/(tran+0>="7:15"+0),0)),rsc+nrsc)

Enter > Copy ลงด้านล่าง
ขอบคุณมากครับ ตรงตามที่ต้องการเลย
แต่แอบแปลกใจถึงที่มาที่ไป แต่เกรงใจไม่กล้าถามครับ :D

Re: นับวันสายแบบมีเงื่อนไข

Posted: Sat Jan 28, 2023 11:56 am
by snasui
:D เนื่องจากข้อมูลจัดเก็บในลักษณะที่เป็นอุปสรรคต่อการหาคำตอบ ยกตัวอย่างเช่น
  • ชื่อพนักงานทั้งสองชีตเขียนไว้ไม่เหมือนกัน
  • หัวตารางที่แสดงชื่อวันของทั้งสองชีตไม่เหมือนกัน
  • เก็บข้อมูล 2 บรรทัดในเซลล์เดียว
ข้างบนนี้ต้องมีการจัดการด้วยสูตรเช้าไปช่วย ยิ่งสร้างอุปสรรคไว้มากก็จะต้องใช้สูตรที่ยุ่งยากมากขึ้น

งานนี้ใช้ฟังก์ชัน Let ซึ่งเก็บค่าของสูตรไว้ในตัวแปรตามชื่อที่กำหนดได้ จากนั้นค่อยนำตัวแปรมากระทำกันในภายหลัง

ไวยากรณ์ของ Let คือ

=let(name1,name_value1,calculation_or_name2,name_value2,...)

name1 คือชื่อของสูตร
name_value1 คือสูตรของ name1

จะใช้เป็นชุด ๆ ไปเช่นนี้จนครบทุกชุดที่ต้องการ โดยชุดหลังสุดคือคำตอบที่ต้องการแสดงในเซลล์

จากสูตร

=LET(day,LEFT($E$7:$AI$7,FIND(".",$E$7:$AI$7)),tran,IF(ISNUMBER(LEFT($E8:$AI8)+0),LEFT($E8:$AI8,5)),dth,INDEX(day,{2,3,4,5,6}),fdty,INDEX(วันเวร!$C$2:$G$113,MATCH("*"&$C8,TRIM(วันเวร!$B$2:$B$113),0),0),daydty,ISNUMBER(MATCH(day,IF(ISTEXT(fdty),dth),0)),rsc,SUM(IFERROR(daydty/(tran+0>="7:00"+0),0)),nrsc,SUM(IFERROR((1-daydty)/(tran+0>="7:15"+0),0)),rsc+nrsc)

ชุดที่ 1 คือ day,LEFT($E$7:$AI$7,FIND(".",$E$7:$AI$7)) เป็นการตัดชื่อวันมาแสดง สามารถทดสอบโดยการเปลี่ยนชุดสุดท้ายในสูตรด้านบนคือ rsc+nrsc เป็น day แล้วสังเกตดูผล

ชุดที่ 2 คือ tran,IF(ISNUMBER(LEFT($E8:$AI8)+0),LEFT($E8:$AI8,5)) เป็นการตัดเอาเวลาเข้างานในแต่ละบรรทัดมาแสดง สามารถทดสอบโดยการเปลี่ยนชุดสุดท้ายในสูตรด้านบนคือ rsc+nrsc เป็น tran แล้วสังเกตดูผล

ชุดที่ 3 คือ dth,INDEX(day,{2,3,4,5,6}) เป็นการสร้างหัวคอลัมน์ให้รองรับข้อมูลของชีต วันเวร สามารถทดสอบโดยการเปลี่ยนชุดสุดท้ายในสูตรด้านบนคือ rsc+nrsc เป็น dth แล้วสังเกตดูผล

ชุดที่ 4 คือ fdty,INDEX(วันเวร!$C$2:$G$113,MATCH("*"&$C8,TRIM(วันเวร!$B$2:$B$113),0),0) เป็นการหาว่ารายชื่อพนักงานในบรรทัดนั้น ๆ หยุดในวันใดบ้าง สามารถทดสอบโดยการเปลี่ยนชุดสุดท้ายในสูตรด้านบนคือ rsc+nrsc เป็น fdty แล้วสังเกตดูผล

ชุดที่ 5 คือ daydty,ISNUMBER(MATCH(day,IF(ISTEXT(fdty),dth),0)) เป็นการหาว่าพนักงานในบรรทัดนั้น ๆ หยุดวันไหนบ้าง สามารถทดสอบโดยการเปลี่ยนชุดสุดท้ายในสูตรด้านบนคือ rsc+nrsc เป็น daydty แล้วสังเกตดูผล

ชุดที่ 6 คือ rsc,SUM(IFERROR(daydty/(tran+0>="7:00"+0),0)) เป็นการหาว่าพนักงานในบรรทัดนั้น ๆ ที่มีวันเวรเข้าสายกี่วัน สามารถทดสอบโดยการเปลี่ยนชุดสุดท้ายในสูตรด้านบนคือ rsc+nrsc เป็น rsc แล้วสังเกตดูผล

ชุดที่ 7 คือ nrsc,SUM(IFERROR((1-daydty)/(tran+0>="7:15"+0),0)) เป็นการหาว่าพนักงานในบรรทัดนั้น ๆ ที่ไม่มีวันเวรเข้าสายกี่วัน สามารถทดสอบโดยการเปลี่ยนชุดสุดท้ายในสูตรด้านบนคือ rsc+nrsc เป็น nrsc แล้วสังเกตดูผล

ตัวสุดท้ายคือ rsc+nrsc เป็นผลลัพธ์ เป็นการนำผลลัพธ์ของ rsc และ nrsc มารวมกันครับ

Re: นับวันสายแบบมีเงื่อนไข

Posted: Sat Jan 28, 2023 10:53 pm
by yangkodza
snasui wrote: Sat Jan 28, 2023 11:56 am :D เนื่องจากข้อมูลจัดเก็บในลักษณะที่เป็นอุปสรรคต่อการหาคำตอบ ยกตัวอย่างเช่น
  • ชื่อพนักงานทั้งสองชีตเขียนไว้ไม่เหมือนกัน
  • หัวตารางที่แสดงชื่อวันของทั้งสองชีตไม่เหมือนกัน
  • เก็บข้อมูล 2 บรรทัดในเซลล์เดียว
ข้างบนนี้ต้องมีการจัดการด้วยสูตรเช้าไปช่วย ยิ่งสร้างอุปสรรคไว้มากก็จะต้องใช้สูตรที่ยุ่งยากมากขึ้น

งานนี้ใช้ฟังก์ชัน Let ซึ่งเก็บค่าของสูตรไว้ในตัวแปรตามชื่อที่กำหนดได้ จากนั้นค่อยนำตัวแปรมากระทำกันในภายหลัง

ไวยากรณ์ของ Let คือ

=let(name1,name_value1,calculation_or_name2,name_value2,...)

name1 คือชื่อของสูตร
name_value1 คือสูตรของ name1

จะใช้เป็นชุด ๆ ไปเช่นนี้จนครบทุกชุดที่ต้องการ โดยชุดหลังสุดคือคำตอบที่ต้องการแสดงในเซลล์

จากสูตร

=LET(day,LEFT($E$7:$AI$7,FIND(".",$E$7:$AI$7)),tran,IF(ISNUMBER(LEFT($E8:$AI8)+0),LEFT($E8:$AI8,5)),dth,INDEX(day,{2,3,4,5,6}),fdty,INDEX(วันเวร!$C$2:$G$113,MATCH("*"&$C8,TRIM(วันเวร!$B$2:$B$113),0),0),daydty,ISNUMBER(MATCH(day,IF(ISTEXT(fdty),dth),0)),rsc,SUM(IFERROR(daydty/(tran+0>="7:00"+0),0)),nrsc,SUM(IFERROR((1-daydty)/(tran+0>="7:15"+0),0)),rsc+nrsc)

ชุดที่ 1 คือ day,LEFT($E$7:$AI$7,FIND(".",$E$7:$AI$7)) เป็นการตัดชื่อวันมาแสดง สามารถทดสอบโดยการเปลี่ยนชุดสุดท้ายในสูตรด้านบนคือ rsc+nrsc เป็น day แล้วสังเกตดูผล

ชุดที่ 2 คือ tran,IF(ISNUMBER(LEFT($E8:$AI8)+0),LEFT($E8:$AI8,5)) เป็นการตัดเอาเวลาเข้างานในแต่ละบรรทัดมาแสดง สามารถทดสอบโดยการเปลี่ยนชุดสุดท้ายในสูตรด้านบนคือ rsc+nrsc เป็น tran แล้วสังเกตดูผล

ชุดที่ 3 คือ dth,INDEX(day,{2,3,4,5,6}) เป็นการสร้างหัวคอลัมน์ให้รองรับข้อมูลของชีต วันเวร สามารถทดสอบโดยการเปลี่ยนชุดสุดท้ายในสูตรด้านบนคือ rsc+nrsc เป็น dth แล้วสังเกตดูผล

ชุดที่ 4 คือ fdty,INDEX(วันเวร!$C$2:$G$113,MATCH("*"&$C8,TRIM(วันเวร!$B$2:$B$113),0),0) เป็นการหาว่ารายชื่อพนักงานในบรรทัดนั้น ๆ หยุดในวันใดบ้าง สามารถทดสอบโดยการเปลี่ยนชุดสุดท้ายในสูตรด้านบนคือ rsc+nrsc เป็น fdty แล้วสังเกตดูผล

ชุดที่ 5 คือ daydty,ISNUMBER(MATCH(day,IF(ISTEXT(fdty),dth),0)) เป็นการหาว่าพนักงานในบรรทัดนั้น ๆ หยุดวันไหนบ้าง สามารถทดสอบโดยการเปลี่ยนชุดสุดท้ายในสูตรด้านบนคือ rsc+nrsc เป็น daydty แล้วสังเกตดูผล

ชุดที่ 6 คือ rsc,SUM(IFERROR(daydty/(tran+0>="7:00"+0),0)) เป็นการหาว่าพนักงานในบรรทัดนั้น ๆ ที่มีวันเวรเข้าสายกี่วัน สามารถทดสอบโดยการเปลี่ยนชุดสุดท้ายในสูตรด้านบนคือ rsc+nrsc เป็น rsc แล้วสังเกตดูผล

ชุดที่ 7 คือ nrsc,SUM(IFERROR((1-daydty)/(tran+0>="7:15"+0),0)) เป็นการหาว่าพนักงานในบรรทัดนั้น ๆ ที่ไม่มีวันเวรเข้าสายกี่วัน สามารถทดสอบโดยการเปลี่ยนชุดสุดท้ายในสูตรด้านบนคือ rsc+nrsc เป็น nrsc แล้วสังเกตดูผล

ตัวสุดท้ายคือ rsc+nrsc เป็นผลลัพธ์ เป็นการนำผลลัพธ์ของ rsc และ nrsc มารวมกันครับ
โอ้โห อาจารย์พิมพ์อธิบายมาประกอบแบบนี้ สุดยอดมากเลยครับ ผมอ่านวน 2 รอบ พยายามทำความเข้าใจกับสูตร
ผมว่าเอกเซลนี้เป็นโปรแกรมที่สุดยอดจริงๆ ขอแค่ถ้าเราวิเคราะห์หาสูตรมาจับลงไปได้ งานเราราบรื่นเลยครับ
กราบของพระคุณเป็นอย่างสูงครับ :thup:

Re: นับวันสายแบบมีเงื่อนไข

Posted: Mon Jan 30, 2023 12:28 pm
by yangkodza
อาจารย์ครับ กรณีที่เราจะหาผลของเดือนอื่นๆ ต้องปรับค่าตรงไหนครับ
ผมลองผิดลองถูกแล้ว ยังหาไม่เจอครับ
หรือว่ามีวิธีใดที่ใช้อ้างอิง cell E5 ซึ่งเป็นชื่อเดือนเลยไหมครับ

Re: นับวันสายแบบมีเงื่อนไข

Posted: Tue Jan 31, 2023 5:38 am
by snasui
:D หาผลของเดือนใด ๆ ข้อมูลก็ต้องเป็นของเดือนนั้น ๆ ไม่ทราบว่ามีประเด็นตรงไหน อย่างไร ข่วยอธิบายพร้อมแนบตัวอย่างที่ชี้ให้เห็นว่าต้องการข้อมูลที่เซลล์ไหนเป็นค่าเท่าใด ด้วยเงื่อนไขใดจะได้เข้าใจตรงกันครับ

Re: นับวันสายแบบมีเงื่อนไข

Posted: Tue Jan 31, 2023 5:57 am
by yangkodza
อยากนับวันสาย โดยระบุเวลาดังนี้ ข้อมูลเป็นเดือนธันวาคมครับ
คนที่ไม่อยู่่เวร มาทำงาน 7.15 น. ขึ้นไป สาย
ส่วนคนที่เวร มาทำงาน 7.00 น. ขึ้นไป สาย
โดยอ้างอิงกับ แผ่นงาน วันเวร
และให้แสดงผลการนับว่า สายกี่ครั้ง ที่เซลล์ AJ8 ใน แผ่นงานรายงานการมาทำงาน

สรุปธค65.xlsx

Re: นับวันสายแบบมีเงื่อนไข

Posted: Tue Jan 31, 2023 6:00 am
by snasui
:D ในไฟล์นั้นไม่มีสูตรที่เคยตอบไป กรุณาแนบไฟล์พร้อมสูตรมาใหม่พร้อมชี้ให้เห็นว่าผิดพลาดที่เซลล์ไหน อย่างไร กรณีไม่มีเงื่อนไขใดเพิ่มเติม สูตรเดิมที่เคยให้ไปควรจะต้องให้คำตอบได้ครับ

Re: นับวันสายแบบมีเงื่อนไข

Posted: Tue Jan 31, 2023 6:58 am
by yangkodza
นับสาย1.PNG
จากภาพประกอบคอลัมสาย คือสูตรต้นฉบับครับ
ส่วนข้อมูลที่ถูกต้องคือผมลองเช็คด้วยมือเอาครับ
ส่วนข้อมูลสีเขียว ถ้าคำตอบ 2 คนนี้ถูก น่าจะถูกหมดครับ ครูดีเด่นครับ ไม่สาย ไม่ขาด

รบกวนอาจารย์ช่วยตรวจสอบด้วยครับผม


ฐานข้อมูลธคพร้อมสูตร.xlsx

Re: นับวันสายแบบมีเงื่อนไข

Posted: Tue Jan 31, 2023 7:03 pm
by snasui
:D เนื่องจากชื่อของวันที่เริ่มของแต่ละเดือนไม่เหมือนกันจึงทำให้ผลการคำนวณคลาดเคลื่อน สามารถปรับสูตรที่ AJ8 เป็นด้านล่างครับ

=LET(day,LEFT($E$7:$AI$7,FIND(".",$E$7:$AI$7)),tran,IF(ISNUMBER(LEFT($E8:$AI8)+0),LEFT($E8:$AI8,5)),dth,{"จ.","อ.","พ.","พฤ.","ศ."},fdty,INDEX(วันเวร!$C$2:$G$113,MATCH("*"&$C8,TRIM(วันเวร!$B$2:$B$113),0),0),daydty,ISNUMBER(MATCH(day,IF(ISTEXT(fdty),dth),0)),rsc,SUM(IFERROR(daydty/(tran+0>="7:00"+0),0)),nrsc,SUM(IFERROR((1-daydty)/(tran+0>="7:15"+0),0)),rsc+nrsc)

Re: นับวันสายแบบมีเงื่อนไข

Posted: Wed Feb 01, 2023 7:01 am
by yangkodza
snasui wrote: Tue Jan 31, 2023 7:03 pm :D เนื่องจากชื่อของวันที่เริ่มของแต่ละเดือนไม่เหมือนกันจึงทำให้ผลการคำนวณคลาดเคลื่อน สามารถปรับสูตรที่ AJ8 เป็นด้านล่างครับ

=LET(day,LEFT($E$7:$AI$7,FIND(".",$E$7:$AI$7)),tran,IF(ISNUMBER(LEFT($E8:$AI8)+0),LEFT($E8:$AI8,5)),dth,{"จ.","อ.","พ.","พฤ.","ศ."},fdty,INDEX(วันเวร!$C$2:$G$113,MATCH("*"&$C8,TRIM(วันเวร!$B$2:$B$113),0),0),daydty,ISNUMBER(MATCH(day,IF(ISTEXT(fdty),dth),0)),rsc,SUM(IFERROR(daydty/(tran+0>="7:00"+0),0)),nrsc,SUM(IFERROR((1-daydty)/(tran+0>="7:15"+0),0)),rsc+nrsc)
ใช้งานได้ตามที่ต้องการเลยครับผม ขอบคุณมากครับอาจารย์ :thup:

Re: นับวันสายแบบมีเงื่อนไข

Posted: Wed Feb 01, 2023 4:50 pm
by yangkodza
อาจารย์ครับ อยากประยุกต์ตัวหนังสื่อเวลาสายของคนที่อยู่เวร ให้เป็นสีส้มครับ
จะได้สะดวกต่อการตรวจสอบข้อมูล
สีส้ม.PNG
จากภาพ ตัวโปรแกรมสามามารถทำได้แต่สายเกิน 07:15 ถึงจะเป็นสีส้ม
แต่ถ้าคนที่อยู่เวรและมาสายเกิน 07:00 เป็นสีดำทำให้ยากต่อการเช็คครับ
รบกวนอาจารย์ชี้แนะให้หน่อยครับ
ประยุกต์เวลาสายสีส้ม.xlsx

Re: นับวันสายแบบมีเงื่อนไข

Posted: Wed Feb 01, 2023 8:04 pm
by snasui
:D เริ่มคลุมจากเซลล์ E8 จากนั้นกำหนด Conditional Formatting ด้วยสูตรตามด้านล่างครับ

=IFERROR(AND(INDEX(วันเวร!$C$2:$G$113,MATCH("*"&$C8,TRIM(วันเวร!$B$2:$B$113),0),MATCH(LEFT(E$7,FIND(".",E$7)),TRIM(LEFT(SUBSTITUTE(OFFSET($E$7,0,MATCH("จ.*",$E$7:$AI$7,0)-1,1,5),CHAR(10),REPT(" ",5)),5)),0))="เวร",LEFT(E8,5)+0>=7/24),FALSE)

Re: นับวันสายแบบมีเงื่อนไข

Posted: Wed Feb 01, 2023 9:12 pm
by yangkodza
snasui wrote: Wed Feb 01, 2023 8:04 pm :D เริ่มคลุมจากเซลล์ E8 จากนั้นกำหนด Conditional Formatting ด้วยสูตรตามด้านล่างครับ

=IFERROR(AND(INDEX(วันเวร!$C$2:$G$113,MATCH("*"&$C8,TRIM(วันเวร!$B$2:$B$113),0),MATCH(LEFT(E$7,FIND(".",E$7)),TRIM(LEFT(SUBSTITUTE(OFFSET($E$7,0,MATCH("จ.*",$E$7:$AI$7,0)-1,1,5),CHAR(10),REPT(" ",5)),5)),0))="เวร",LEFT(E8,5)+0>=7/24),FALSE)
อาจารย์ครับ ผมคลุมพื้นที่ทั้งหมดโดยเริ่มตั้งแต่ E8
แล้วใส่ Conditional Formatting ด้วยสูตร แต่ไม่แสดงอะไรออกมาครับ

Re: นับวันสายแบบมีเงื่อนไข

Posted: Wed Feb 01, 2023 9:15 pm
by snasui
:D กรุณาแนบไฟล์ล่าสุดมาด้วยพร้อมอธิบายว่าได้กำหนดให้แสดงแบบใดจะได้เข้าถึงปัญหาโดยไวครับ

Re: นับวันสายแบบมีเงื่อนไข

Posted: Wed Feb 01, 2023 9:23 pm
by yangkodza
snasui wrote: Wed Feb 01, 2023 9:15 pm :D กรุณาแนบไฟล์ล่าสุดมาด้วยพร้อมอธิบายว่าได้กำหนดให้แสดงแบบใดจะได้เข้าถึงปัญหาโดยไวครับ
จากไฟล์งาน แถว A17 เวรวันพุธและพฤหัส ผมได้ทำแถบสีเขียวไว้คือวันที่สมาชิกท่านนี้มาสายครับ
อยากให้แสดงว่าถ้ามาสายให้ตัวข้อความเวลาเป็นสีส้มครับ
ประยุกต์เวลาสายสีส้ม 1.xlsx

Re: นับวันสายแบบมีเงื่อนไข

Posted: Wed Feb 01, 2023 10:45 pm
by snasui
:D ดูตัวอย่างจากไฟล์แนบ ผมระบายเป็นสีทึบไว้ให้ ลองไปเปลี่ยนเป็นสีหรือรูปแบบอื่นใดดูตามต้องการครับ

Re: นับวันสายแบบมีเงื่อนไข

Posted: Wed Feb 01, 2023 11:30 pm
by yangkodza
snasui wrote: Wed Feb 01, 2023 10:45 pm :D ดูตัวอย่างจากไฟล์แนบ ผมระบายเป็นสีทึบไว้ให้ ลองไปเปลี่ยนเป็นสีหรือรูปแบบอื่นใดดูตามต้องการครับ
สุดยอดมากครับอาจารย์
ผมขอปรับในส่วนของ วันสายปกติที่ไม่เวร ให้เป็นสีเหมือนกับวันสายเวรได้ไหมครับ
จะได้ไปในทิศทางเดียวกันเลย :D

Re: นับวันสายแบบมีเงื่อนไข

Posted: Thu Feb 02, 2023 6:08 am
by snasui
:D ตัวอย่างการปรับสูตรครับ

=LET(a,INDEX(วันเวร!$C$2:$G$113,MATCH("*"&$C8,TRIM(วันเวร!$B$2:$B$113),0),MATCH(LEFT(E$7,FIND(".",E$7)),TRIM(LEFT(SUBSTITUTE(OFFSET($E$7,0,MATCH("จ.*",$E$7:$AI$7,0)-1,1,5),CHAR(10),REPT(" ",5)),5)),0)),OR(AND(a=0,LEFT(E8,5)+0>="7:15"+0),AND(a="เวร",LEFT(E8,5)+0>=7/24)))