co-create
บทความนี้คือส่วนหนึ่งของโครงการ ร่วมสร้าง “หนังสือคู่มือ Excel ที่เจ๋งที่สุด” ใครที่มี comment เพื่อแนะนำ ปรับปรุงหนังสือได้ คุณจะได้เครดิตในฐานะผู้ร่วมเขียน ลงในหนังสือที่จะพิมพ์จริงๆ ด้วย! อ่านรายละเอียด และดูสารบัญหนังสือ คลิ๊กที่นี่


 

นอกจากที่เราจะต้องจัดการข้อมูลประเภท Text ในหัวข้อที่ผ่านมาแล้ว บางทีเราต้องจัดการข้อมูลเกี่ยวกับเรื่องของเวลาด้วย เช่น ข้อมูลตั้งต้นอาจเป็น Text หรือเป็นวันที่ แต่เราต้องการข้อมูลที่เป็นเดือน หรือ ปี เป็นต้น

การแยกข้อมูลวันที่และเวลาออกจากกัน

ก่อนอื่นเราต้องรู้ว่า วันที่คือจำนวนเต็ม เวลา คือเลขทศนิยม ซึ่งตรงนี้ได้เคยเกริ่นไว้ในบทแรกๆ แล้ว เราจะนำความรู้นี้มาใช้ต่อครับ

timeline

ดังนั้น ถ้าเรามีข้อมูลในช่อง A1 ว่า 21/10/2014 16:00:00 ซึ่งค่าที่แท้จริง คือ 41933+16/24 เพราะ 1 วันมี 24 ชั่วโมง หรือ จะได้ว่า 41933.66667 นั่นเอง (เลข 6 ซ้ำไปเรื่อยๆ)

เราก็สามารถแบ่งมันออกเป็นสองส่วนได้ นั่นคือ ส่วนของวันที่ และ ส่วนของเวลา

date-time

ส่วนของวันที่

วันที่คือ จำนวนเต็ม ดังนั้น เราจะใช้ฟังก์ชั่น =INT(number) มาช่วย (ให้ค่ากลับมาเป็นจำนวนเต็ม) จะได้ว่า =INT(A1) จะได้ออกมาเป็นเลข 41933 นั่นเอง ซึ่งถ้าเราเปลี่ยน Format ให้เป็นวันที่จะได้เป็น 21/10/2014 ตามต้องการ

ส่วนของเวลา

เวลาคือ ทศนิยม ดังนั้นเราจะแยกส่วนของทศนิยมออกมาได้ เราต้องใช้ความรู้เรื่องของการหารเศษส่วน นั่นคือ อะไรก็ตาม หารด้วย 1 ถ้าเหลือเศษ มันคือ ทศนิยมนั่นเอง ดังนั้นเราจะหาเศษเหลือของการหารได้ด้วยฟังก์ชั่น =MOD(number,divisor) มาช่วยครับ

ซึ่งกรอกได้ดังนี้ =MOD(A1,1) จะได้ค่าออกมาเป็น 0/1/1900 16:00 หรือ 0.66667 นั่นเอง ซึ่ง พอเราเปลี่ยน Format ให้เหลือแต่เวลาแล้ว ก็จะได้ว่า 16:00 ซึ่งเป็นเวลาที่เราต้องการครับ

การคำนวณค่าออกมาเป็นวันที่ จากการมีข้อมูลเป็นข้อความ

เราสามารถใช้ฟังก์ชั่น =DATEVALUE(date_text) เพื่อแปลงข้อมูลที่อยู่ในรูปแบบ Text ให้กลายเป็นข้อมูล Number ที่เป็นวันที่ได้ทันที ซึ่งปกติแล้ว date_text ที่สามารถใช้ได้ก็คือตัวเดียวกับที่เราระบุใน Cell แล้ว Excel แปลงเป็นวันที่ให้เอง ซึ่งมีรูปแบบตามนี้

  • “dd/mm/yyyy” เช่น “21/10/2014”
  • “yyyy/mm/dd” เช่น “2014/10/21”
  • “dd-mmm-yyyy” เช่น “21-Oct-2014”
  • “yyyy-mm-dd” เช่น “2014-10-23”

วิธีการใช้งาน เช่น =DATEVALUE(“21-Oct-2014”) จะแสดงออกมาเป็นเลข 41933 ซึ่งคือวันที่ 21/10/2014 นั่นเอง จุดสำคัญคือ date_text จะต้องมี format เป็น Text เท่านั้น

ประโยชน์ที่แท้จริงของ DATEVALUE ก็คือการแปลงวันที่จากรูปแบบเขียนตัวเลขเรียงกัน เช่น 20141021 ให้กลายเป็น 21/10/2014 นี่แหละครับ แต่เราต้องใช้ฟังก์ชั่น TEXT มาช่วยในการเปลี่ยน Format ก่อนดังนี้

  • สมมติในช่อง A1 มี Number หรือ Text คำว่า 20141021 อยู่
  • เราต้องแปลง 20141021 ให้กลายเป็นรูปแบบที่ date_text รู้จักก่อน ซึ่งรูปแบบที่ง่ายสุด คือ yyyy-mm-dd โดยใช้สูตรว่า =TEXT(A1,“0000-00-00”) ซึ่งเดี๋ยวจะได้เรียนต่อภายหลัง
  • จะได้ออกมาเป็นค่า 2014-10-21 ในรูปแบบ Text แล้ว
  • จากนั้นก็ใช้ DATEVALUE มาครอบต่อ จะได้ =DATEVALUE(TEXT(A1,“0000-00-00”))
  • จะได้ออกมาเป็น 21/10/2014 ตามต้องการ

Tips : เอาเข้าจริงๆ หากเราใช้แค่ TEXT(A1,“0000-00-00”) แล้วคูณ 1 ก็ได้ผลเหมือนกัน

ข้อควรระวังเกี่ยวกับ Format วันที่:

รูปแบบวันที่ ในประเทศทั่วๆ ไปจะเรียงแบบ dd/mm/yyyy แต่ถ้าไปเปิดในคอมพิวเตอร์ที่ตั้งค่าวันที่และเวลาเป็นของ English (United State) ในโปรแกรม Windows เอง (ใน Control Panel -> Region and Language -> Format) จะเป็น mm/dd/yyyy ซึ่งเราต้องระวังจุดนี้ให้ดี

เช่น ถ้าเขียนใน Cell ว่า 02/03/2014 ประเทศที่ไม่ใช่ US จะเป็นวันที่ 2 มีนาคม ค.ศ. 2014 จะทำให้ Excel มองว่าเป็นวันที่ 3 กุมภาพันธ์ ค.ศ. 2014 แทน ซึ่งอาจเกิดความโกลาหลได้เลยล่ะ แต่ถ้าคุณคิดว่าคงไม่ได้ทำงานข้ามโลกขนาดนั้นก็ไม่น่าจะเป็นอะไรครับ

การคำนวณค่าออกมาเป็นวันที่ จากการมีข้อมูลตัวเลข วัน เดือน และ ปี

date

เราจะใช้ฟังก์ชั่น =DATE(year,month,day) มาช่วย โดยต้องแทนเลข ปี เดือน วัน ลงไปในแต่ละ Argument แต่สิ่งที่ต้องระวังก็คือ เราจะต้องแทนปีด้วยเลข คศ. นะครับ วันที่จึงจะออกมาถูกต้อง เช่น ถ้าวันที่ต้องการ คือ 13 ธันวาคม พศ. 2557 เราจะต้องใส่ว่า =DATE(2557-543,12,13) หรือ =DATE(2014,12,13) นะครับ จะได้ออกมาเป็น 13/12/2014 ซึ่งเป็นสิ่งที่ถูกต้อง ซึ่งหากจะเปลี่ยน ค.ศ. ให้แสดงเป็น พ.ศ. เราควรใช้วิธีการเปลี่ยน Number Format เอาครับ ไม่ควรใส่เลข 2557 ตรงๆ

การคำนวณค่าหาวันสุดท้ายของเดือน

การจะหาวันสุดท้ายของเดือน ถ้าคุณไม่รู้จะทำยังไง วิธีที่น่ะลองใช้ที่สุดก็คือ เอาวันที่ 1 ของเดือนถัดไป ไปลบออก 1 วันจริงมั๊ยครับ เพราะเรารู้มาก่อนหน้านี้แล้วว่า Excel จะเรียงวันที่แต่ละวันต่อๆ กันไปเรื่อยๆ แต่ผมมีอีกวิธีอื่นมานำเสนอครับ มี 2 วิธี คือ

วิธีที่1 ใช้ฟังก์ชั่น =EOMONTH(start_date,

[months]) โดยใส่วันที่ที่ต้องการลงไปในช่อง start_date แต่ถ้าขี้เกียจจำฟังก์ชั่นเยอะแยะ จริงๆ เราใช้อีกวิธีก็ได้ครับ นั่นคือ

วิธีที่ 2 ใส่ day ในฟังก์ชั่น =DATE(year,month,day) เป็นเลข 0 โดยใส่ month เป็นเดือนถัดไป เช่น ผมใส่เป็น =DATE(2014,3,0) มันจะได้ว่า 28/2/2014 ครับ ซึ่งจะเป็นวันสุดท้ายของเดือนก่อนหน้านั่นเอง เราสามารถเอาตรงนี้มาประยุกต์ใช้หาวันสุดท้ายของแต่ละเดือนได้ครับ

การหาวันที่ใน xx เดือน ก่อนหน้า/ถัดไป

ในหลายๆ สถานการณ์ คุณอาจจำเป็นต้องคำนวณหาว่า อีก 6 เดือนข้างหน้า นับจากวันปัจจุบันจะกลายเป็นวันที่เท่าไหร่ ซึ่งเราสามารถทำได้หลายวิธีมากครับ ผมจะขอยกตัวอย่าง 2 วิธี คือ

1. ใช้ฟังก์ชั่น DATEเหมือนเดิม

ถ้าเราใช้ DATE เราสามารถหาวันที่ ใน 6 เดือนข้างหน้าได้โดยการบวกเลข 6 ลงไปในช่อง month ได้เลยครับ เช่น ผมปรับจากตัวอย่างที่แล้ว เป็น =DATE(2014,12+6,13) = 13/6/2015

2. ใช้ EDATE มาช่วย

ถ้าเราใช้ EDATE จะมีวิธีกรอกดังนี้ครับ =EDATE(start_date,months) คือให้เราใส่วันที่ลงไปใน start_date และใส่จำนวนเดือนที่ต้องการให้เลื่อนเวลาไปในช่อง months เช่น ถ้าผมเลื่อนจาก 13 ธันวาแบบข้างบน สมมติผมใส่วันที่ 13/12/2014 ไว้ในช่อง A1 ผมจะต้องเขียนเพื่อคำนวณหาวันในอีก 6 เดือนถัดไปว่า =EDATE(A1,6) = 13/6/2015 เช่นกัน

ที่นี้มาลองดูกันครับว่าถ้าเราเริ่มที่ 31 ธันวาคม 2557 บวกไปอีก 2เดือนเพื่อให้เป็นกุมภาพันธ์ที่มีแค่ 28 วันมันจะเป็นยังไง?

ถ้าเราใช้ DATE ใส่ว่า =DATE(2014,12+2,31) จะได้ออกมาเป็น 3/3/2015 นั่นคือ 3 มีนาคม 2558 เพราะว่าวันที่ 31 มันเลยวันที่ 28 ไปอีก 3 วัน นั่นเอง

แต่ถ้าเราเปลี่ยนมาใช้ EDATE แทน (ผมใส่ 31/12/2014 ไว้ในช่อง A1) จะได้ว่า =EDATE(A1,2)= 28/2/2015 ซึ่งได้ 28 ธันวาคม โดยไม่เลื่อนวันให้เหมือนการใช้ DATE

ตรงนี้ไม่ได้บอกว่าฟังก์ชั่นไหนทำงานถูกหรือผิด เพราะมันแล้วแต่สถานการณ์ครับว่าเราต้องการผลลัพธ์แบบไหน อันนี้ต้องนำไปเลือกใช้ให้ถูกเองครับ

การคำนวณเกี่ยวกับวันทำงาน (Working Day)

อันนี้เป็นการทำงานยอดฮิต ที่หลายคนต้องใช้บ่อยๆ ซึ่งปัญหาหลักๆ ที่พบเจอมี 2 กรณีดังนี้

กรณี 1 : รู้วันเริ่มและวันสิ้นสุด อยากรู้จำนวนวันทำงานระหว่างสองวันนั้น –> ใช้ NETWORKDAYS

กรณี 2 : รู้วันเริ่ม (หรือวันสิ้นสุด) แล้วรู้จำนวนวันที่ต้องใช้ แต่อยากรู้วันที่ปลายทาง –> WORKDAY

ซึ่งจะตอบโจทย์ทั้งสองกรณีข้างล่างนี้ได้ เราจะต้องเตรียมข้อมูลวันหยุดพิเศษเสียก่อน Excel จึงจะรู้ว่าวันไหนเป็นวันทำงานบ้าง โดยมันจะดูว่า ถ้าเป็นวันเสาร์, อาทิตย์, หรือวันหยุดพิเศษ จะถือว่าไม่ใช่วันทำงานนั่นเอง และเพื่อเป็นการอำนวยความสะดวกให้ทุกท่าน ผมได้เตรียมตารางข้อมูลวันหยุดพิเศษในแต่ละปีให้แล้ว ไปดาวน์โหลดได้ที่ http://www.inwexcel.com/thailand-holidays/ ได้เลย ฟรีๆ ครับ

วิธีทำ กรณีที่ 1

ใช้สูตร =NETWORKDAYS(start_date,end_date,holidays) มาช่วยครับ โดยที่สูตร NETWORKDAYS จะนับทั้งวันเริ่มและวันจบด้วย แต่จะไม่นับวันเสาร์-อาทิตย์ และวันที่ระบุใน Holidays  ซึ่งเราต้องใส่ข้อมูลวันหยุดพิเศษลงไปใน argument ที่ชื่อว่า holidays นี่แหละครับ

ตัวอย่าง

  • วันเริ่ม = 2 มีนาคม พ.ศ. 2558 ซึ่งผมพิมพ์ไว้ในช่อง A1 ว่า 2/3/2015
  • วันสิ้นสุด = 9 มีนาคม พ.ศ. 2558 ซึ่งผมพิมพ์ไว้ในช่อง A2 ว่า 9/3/2015
  • สมมติว่าผมเตรียมข้อมูลวันหยุดพิเศษไว้แล้ว ในช่อง H1:H100 ซึ่งในระหว่าง 2 วันข้างต้น มีวันที่ 4/3/2015 เป็นวันหยุดพิเศษเนื่องจากเป็นวันมาฆบูชาครับ

หาจำนวนวันทำงานในช่อง A4 =NETWORKDAYS(A1,A2, H1:H100) จะได้ว่า = 5 วัน เพราะว่า

ปฏิทิน วันทำงาน (ที่นับ) วันที่ไม่นับ
 networkdays
  • 2/3/2015 (นับวันเริ่ม)
  • 3/3/2015
  • 5/3/2015
  • 6/3/2015
  • 9/3/2015 (นับวันจบ)
  • 4/3/2015 เพราะอยู่ใน Holidays
  • 7/3/2015 เพราะเป็นวันเสาร์
  • 8/3/2015 เพราะเป็นวันอาทิตย์

 

วิธีทำ กรณีที่ 2

ในทางกลับกัน หากผมเริ่มที่ 2 มีนาคม พ.ศ. 2558  ซึ่งผมพิมพ์ไว้ในช่อง A1 ว่า 2/3/2015

แล้วผมมีวันทำงานเป็น 5 วัน ผมก็จะหาวันสิ้นสุดได้จาก =WORKDAY(start_date,days,holidays)
=WORKDAY(A1,A4,H1:H100) = 10/3/2015 ซึ่งไม่ตรงกับตัวอย่างข้างบนซะงั้น!! สาเหตุเป็นเพราะว่าสูตร WORKDAY มันไม่นับจุดเริ่มต้นนั่นเอง (ต่างจาก NETWORKDAYS) ตรงนี้เป็นจุดที่ต้องสังเกตดีๆ ครับ

 

การใช้ DATEDIF เพื่อหาระยะห่างระหว่างวันแบบขั้นสูง

DATEDIF เป็นฟังก์ชั่นเกี่ยวกับวันที่ ใช้หาว่าวันสองวันที่กำหนดได้ ซึ่งความสามารถของมันมีมากกว่าแค่เอาวันที่มาลบกันหาจำนวนวันแน่นอน เพราะมันสามารถให้เราเลือกได้ว่า จะคำนวณระยะห่างเป็น วัน เดือน หรือ ปี ซึ่งฟังก์ชั่นนี้ช่วยให้การคำนวณสะดวกขึ้นมาก แต่ใน Excel กลับไม่มี Help ให้นะครับ แต่ไม่ต้องห่วง ผมจะแนะนำการใช้งานให้เอง

วิธีการใช้ฟังก์ชั่น

DATEDIF( start_date, end_date, interval )
DATEDIF( วันเริ่ม, วันจบ, รูปแบบการวัดช่วงเวลา ) โดย interval (รูปแบบการวัดช่วงเวลา) คือ

  • Y = ปี (แบบครบปี), M = เดือน (แบบครบเดือน), D = วัน
  • MD = วัน (ไม่สนใจ เดือน ปี), YM = เดือน (ไม่สนใจวัน ปี), YD = วัน (ไม่สนใจปี)

เช่น =DATEDIF(A1,A2,”M”) เป็นการหาว่า วันที่ใน A1 และ A2 ห่างกันกี่เดือนแบบครบเดือน

ค่าที่ได้จาก DATEDIF กรณีใช้โหมด Interval ต่างกัน

datedif

ตัวอย่างการตีความ Start 1/1/2015 – End 31/12/2015

  • ถือว่ายังไม่ครบเต็มปี เวลา Interval เป็น “Y” จึงได้ค่า 0
  • และยังไม่เต็ม 12 เดือน (ได้ 11 เดือน ตาม “M”) เพราะยังขาดไปอีกวันหนึ่งจึงครบปีจริงๆ
  • หากดูจากคอลัมน์ 1/1/2015 – 1/1/2016 จะเห็นว่าครบปีจริงๆ จะเป็นอย่างไร