“อยากรู้ว่าวันที่ 1 กรกฎา ถึง 31 ธันวา มีวันทำงานกี่วัน ต้องเขียนสูตรยังไงคะ?” ลูกศิษย์คนหนึ่งถาม

“ใช้ฟังก์ชัน NETWORKDAYS ได้เลยครับ” ผมตอบ

“แล้วถ้าไม่ต้องการนับวันหยุด เช่น วันแม่ วันพ่อ วันสิ้นปี ต้องเขียนสูตรยังไงคะ?” ลูกศิษย์ถามต่อ

“ใช้ฟังก์ชัน NETWORKDAYS ได้เช่นกันครับ แต่ต้องสร้างลิตส์ของวันหยุดขึ้นมา”

“แล้วถ้าบริษัททำงานวันเสาร์ด้วยล่ะคะ เขียนสูตรยังไงดี?” 

“ถ้าทำงานวันเสาร์ด้วย ใช้ฟังก์ชัน NETWORKDAYS.INTL ดีกว่าครับ ตอบโจทย์แบบเป๊ะๆเลย” ผมตอบ

“คือหนูไม่เคยใช้ฟังก์ชัน NETWORKDAYS หรือ NETWORKDAYS.INTL เลยน่ะค่ะ ช่วยสอนได้ไหมคะ” 

ได้เลยครับ เพียงอ่านบทความนี้จบ รับรองว่าเข้าใจแบบแจ่มแจ้งแดงแจ๋แน่นอน ^__^

มาเริ่มกันเลย!

สมมติวันเริ่มต้นคือวันที่ 1 กรกฎาคม 2018 และวันสิ้นสุดคือวันที่ 31 ธันวาคม 2018

พิมพ์วันเริ่มต้นและวันสิ้นสุดไว้ที่เซลล์ใดๆ หรือไว้ที่เซลล์ C3, C4 แบบนี้

Start_End_1.png

ก่อนจะคุยกันเรื่องฟังก์ชัน NETWORKDAYS.INTL มีคำถามมาลับสมองนิดนึงครับ ^^

“ตั้งแต่วันที่ 1 กรกฎาคม 2018 ถึง 31 ธันวาคม 2018 มีวันทั้งหมดกี่วัน?”

ติ๊กต่อก

ติ๊กต่อก…

คำตอบก็คือ 184 วัน หรือเขียนสูตรได้เป็น

=C4-C3+1

1_All.png

ไม่ยากใช่ไหมครับ ^__^

184 วัน คือจำนวนวันทั้งหมด

แต่ถ้าต้องการนับเฉพาะวันจันทร์-ศุกร์ (ไม่รวมเสาร์-อาทิตย์) ต้องใช้ฟังก์ชันชื่อ NETWORKDAYS หรือเขียนสูตรเป็น

=NETWORKDAYS(C3,C4)

คำตอบที่ได้คือ 131

2_Networkdays.png

โครงสร้างของฟังก์ชัน NETWOKRDAYS คือ

=NETWORKDAYS( start_date, end_date, [holidays] )

NETWORKDAYS_Argument.png

start_date คือวันเริ่มต้น เช่น เคสนี้คือ 1 กรกฎาคม 2018 (C3)

end_date คือวันสิ้นสุด เช่น เคสนี้คือ 31 ธันวาคม 2018 (C4)

[holidays] คือวันหยุด (ที่ไม่ใช่วันเสาร์-อาทิตย์) ถ้าไม่ระบุค่าใด ถือว่านับรวมวันหยุดด้วย เช่นเคสนี้ไม่นับเฉพาะวันเสาร์-อาทิตย์ แต่นับวันหยุด ก็ไม่ต้องระบุค่าใด

อาร์กิวเมนต์ [holiday] มีวงเล็บก้ามปูครอบ ( [ ] ) ในเชิงเอ็กเซลแล้วมีความหมายว่าใส่หรือไม่ใส่ก็ได้ ถ้าไม่ใส่ เอ็กเซลจะคำนวณให้ตามค่าดีฟอลต์ ซึ่งค่าดีฟอลต์ของฟังก์ชันนี้เสมือนว่าไม่มีวันหยุดนั่นเอง ^__^

แต่ถ้าไม่ต้องการนับรวมวันหยุด ต้องระบุวันหยุด [holidays] ลงไปในสูตร

หรืออาจสร้างลิสต์วันหยุดขึ้นมาในเซลล์ F4:F11 แบบนี้

HolidayList.png

แล้วเขียนสูตรเป็น

=NETWORKDAYS(C3,C4,F4:F11)

ซึ่งก็คือใส่ F4:F11 ลงในส่วนของ [holidays] นั่นเอง

(G4:G11 ไม่มีผลต่อการคำนวณ แต่สร้างไว้เพื่อบอกรายละเอียดว่าวันหยุดนั้นคือวันอะไร)

(สูตรนี้ต้องการหาว่าวันที่ 1 กรกฎาคม 2018 ถึง 31 ธันวาคม 2018 มีวันทำงานทั้งหมดกี่วัน ไม่รวมเสาร์-อาทิตย์ และไม่รวมวันหยุดที่ระบุในเซลล์ F4:F11)

คำตอบที่ได้คือ 123 วัน

3_Networkdays.png

ฮัดช่า!!

หรืออาจประยุกต์สูตรเป็นการคำนวณหาวันทำงานของแต่ละงาน (Task, Job) แบบนี้

Applied.png

เจ๋งใช่ไหมล่ะ ^__^

“แล้วถ้าทำงานวันเสาร์ด้วยล่ะคะ ต้องเขียนสูตรยังไง?”

ข้อเสียของฟังก์ชัน NETWORKDAYS คือ คิดว่าวันทำงานคือวันจันทร์-ศุกร์ หรือคิดว่าวันหยุดสุดสัปดาห์ (Weekend) คือวันเสาร์-อาทิตย์ เท่านั้น

ปัญหาคือ ถ้าวันหยุดสุดสัปดาห์ (Weekend) คือวันอาทิตย์เพียงวันเดียว (วันเสาร์เป็นวันทำงาน) จะใช้ฟังก์ชันนี้ไม่ได้!

ถ้าต้องการเซ็ตให้วันหยุดสุดสัปดาห์คือวันอาทิตย์ (ไม่รวมวันเสาร์) เดิมทีต้องใช้หลายฟังก์ชันผสมผสานกัน และเขียนสูตรยาก ไมโครซอฟต์จึงแก้ปัญหานี้โดยการสร้างฟังก์ชันขึ้นมาใหม่ นั่นคือฟังก์ชันที่ชื่อว่า

NETWORKDAYS.INTL

(ใช้ได้ตั้งแต่ Excel 2010 เป็นต้นไป)

(Excel 2003/ 2007 ใช้ไม่ได้)

โครงสร้างฟังก์ชันคือ

=NETWORKDAYS.INTL( start_date, end_date, [weekend], [holidays] )

NETWORKDAYS.INTL_Argument.png

จะเห็นได้ว่าโครงสร้างคล้ายฟังก์ชัน NETWORKDAYS มาก เพียงแต่เพิ่มออปชั่นให้เลือกได้ว่าวันหยุดสุดสัปดาห์ [weekend] คือวันใด

ความหมายของออปชั่น [weekend] ก็คือ

Weekend1.png

นั่นคือ ถ้ากำหนดให้วันหยุดสุดสัปดาห์คือวันอาทิตย์เพียงวันเดียว (วันเสาร์เป็นวันทำงาน) ก็เพียงแต่ระบุ [weekend] เป็น 11 หรือเขียนสูตรเป็น

=NETWORKDAYS.INTL(C3,C4,11,F4:F11)

คำตอบที่ได้คือ 149 วัน

4_Weekend_Sunday.png

ง่ายกว่าที่คิดใช่ไหมล่ะ ^__^

ฟังก์ชัน NETWORKDAYS.INTL มีความสามารถที่หลากหลายกว่า NETWORKDAYS จากเดิมที่เขียนสูตรด้วย =NETWORKDAYS(C3,C4,F4:F11) ก็อาจเขียนด้วย NETWORKDAYS.INTL เป็น

=NETWORKDAYS.INTL(C3,C4,1,F4:F11)

ระบุ [weekend] เป็น 1 เพราะ 1 (หรือไม่ใส่) คือการกำหนดว่าวันหยุดสุดสัปดาห์คือวันเสาร์-อาทิตย์นั่นเอง

5_NETWOKRDAYS.INTL.png

(จากภาพจะเห็นได้ว่า ผลลัพธ์ของ NETWORKDAYS(C3,C4,F4:F11) และ NETWORKDAYS.INTL(C3,C4,1,F4:F11) มีค่าเท่ากันคือ 123)

หรือถ้าไม่ต้องการนับเฉพาะวันอาทิตย์เพียงอย่างเดียว (วันเสาร์เป็นวันทำงาน) แต่ให้นับวันหยุดด้วย ก็เพียงแค่ตัดส่วนที่เป็น [holiday] ทิ้งไป หรือเขียนสูตรเป็น

=NETWORKDAYS.INTL(C3,C4,11)

คำตอบที่ได้คือ 157

6_IncludeHoliday.png

หรือถ้าหยุดเฉพาะวันเสาร์ (วันอาทิตย์เป็นวันทำงาน) และไม่ต้องการนับวันหยุด เพียงระบุ [weekend] เป็น 17 ก็เป็นอันเรียบร้อย

=NETWORKDAYS.INTL(C3,C4,17,F4:F11)

คำตอบที่ได้คือ 150

7_Last.png

“งั้นไม่ต้องใช้ฟังก์ชัน NETWORKDAY แล้ว ใช้ NETWORKDAYS.INTL แทนได้ 100% เลยใช่ไหม?”

สำหรับคำถามนี้ ถ้าจะตอบว่า ใช่ ต้องเพิ่มบริบทว่า ‘ตั้งแต่ Excel 2010 ขึ้นไป’ เพราะฟังก์ชัน NETWORKDAYS.INTL เกิดขึ้นตั้งแต่เวอร์ชัน 2010 ดังนั้นถ้าใช้ฟังก์ชันนี้กับ Excel 2007 หรือใช้กับไฟล์นามสกุล .xls จะพบว่าใช้ไม่ได้ (ไฟล์นามสกุล .xls มีความสามารถเทียบเท่า Excel 2003)

อย่างไรก็ตาม เคสส่วนใหญ่มักกำหนดวันหยุดสุดสัปดาห์เป็นวันเสาร์-อาทิตย์ การใช้ฟังก์ชัน NETWORKDAYS น่าจะสะดวกกว่า แถมฟังก์ชันนี้มีมาตั้งแต่เวอร์ชันดึกดำบรรพ์ การส่งต่องานน่าจะง่ายขึ้น

แต่ถ้าเคสของเราไม่ได้เป็นแบบเคสส่วนใหญ่ และไฟล์นี้ใช้กับ Excel 2010 จะใช้ NETWORKDAYS.INTL ก็ไม่ว่ากัน

ขอเพียงเขียนสูตรให้ถูกก็พอ ^^

แต่ถ้าคุณอ่านบทความถึงบรรทัดนี้ ไม่มีทางเขียนสูตรผิดแน่นอนครับ ^__^

..

สำหรับใครที่สนใจไฟล์ตัวอย่างของบทความนี้ สามารถดาวน์โหลดเพื่อศึกษาได้เลยครับ

Networkdays_180630

.

หากคุณชอบบทความแนวนี้ สามารถอัพเดตบทความใหม่ๆโดยคลิก Like เฟสบุ๊คแฟนเพจ วิศวกรรีพอร์ต หรือคลิก ที่นี่

อย่าลืมแชร์ให้เพื่อนอ่านเพื่อเป็นกำลังใจให้คนเขียนด้วยนะครับ ^__^

.

อ้างอิงข้อมูลจาก

https://support.office.com/en-us/article/networkdays-intl-function-a9b26239-4f20-46a1-9ab8-4e925bfd5e28?NS=EXCEL&Version=16&SysLcid=1033&UiLcid=1033&AppVer=ZXL160&HelpId=xlmain11.chm60568&ui=en-US&rs=en-US&ad=US

https://exceljet.net/excel-functions/excel-networkdays-function

https://exceljet.net/excel-functions/excel-networkdays.intl-function