DateDiff

ในการคำนวณหาระยะเวลาเป็นกี่ปี กี่เดือน กี่วัน นั้น หากใช้สูตร DateDif ในโปรแกรม Excel จะพบว่าระยะเวลาบางช่วงที่หาคำตอบนั้น จำนวนจะติดลบบ้าง จำนวนวันไม่ตรงกับที่เราคิดบ้าง ซึ่งจะเพี้ยนในช่วงวันที่ตั้งแต่วันที่ 28-31 เสมอ

John Walkenbach ได้แจกสูตร DateDiff ซึ่งผมได้เก็บไว้นานแล้ว เพิ่งค้นหาเจอจึงนำมาแจกให้พวกเราได้นำไปใช้กันครับ สูตรนี้หาระยะเวลาใกล้เคียงแบบที่คนเข้าใจกันมากกว่าสูตรของ Microsoft โดยเฉพาะในการนับวันสิ้นเดือนชนสิ้นเดือน

ปัจจุบันเว็บของ John Walkenbach ปิดตัวไปแล้ว ในช่วงที่ยังเปิดเว็บอยู่นั้น ระยะหลังก็ไม่พบว่ามีสูตร DateDiff นี้แจกเช่นเดิม ไม่ทราบว่าด้วยเหตุใดเหมือนกัน จึงขอให้ใช้สูตรนี้อย่างระมัดระวังไว้สักหน่อย

สูตรนี้ต่างจากสูตรเดิมตรงที่ลงท้ายด้วย f 2 ตัว มีโครงสร้างสูตร =DateDiff(FromDate,ToDate)

โดยตอนที่สร้างให้สร้างลงไปในเซลล์ 3 เซลล์พร้อมกันแล้วกดปุ่ม Ctrl+Shift+Enter จะได้คำตอบเป็นกี่ปี กี่เดือน กี่วัน ให้ในแต่ละเซลล์ ซึ่งผมได้ดัดแปลงรหัสเป็นสูตรใหม่ ไม่ต้องสร้างแบบ array ก็ได้ครับ

=YearDiff(FromDate,ToDate)
=MonthDiff(FromDate,ToDate)
=DayDiff(FromDate,ToDate)

Download แฟ้มตัวอย่างตามภาพนี้ได้จาก

https://drive.google.com/open?id=1jwPnCv6RTjoDgWj7T9_PA3w6MfOVYykQ

ผมได้สร้างเป็น Add-in ไว้ด้วยครับ Download ได้จาก

https://drive.google.com/open?id=1wrRnrS1EzaiW6HXLy1z_goWnirvMysvV

==========================================

รหัส VBA ของ John Walkenbach

'Source from www.j-walk.com

Option Explicit

Function DATEDIFF(d1, d2) As Variant
Dim YEARDIFF As Integer
Dim MONTHDIFF As Integer
Dim DAYDIFF As Integer
Dim temp As Date

temp = Time
' Swap arguments, if necessary
If d1 > d2 Then
temp = d1
d1 = d2
d2 = temp
End If
' Do the year part
YEARDIFF = Year(d2) - Year(d1)
If DateSerial(Year(d2), Month(d1), Day(d1)) > d2 _
Then YEARDIFF = YEARDIFF - 1

' Do the month part
If Month(d2) > Month(d1) Then
If Day(d2) >= Day(d1) Then
MONTHDIFF = Month(d2) - Month(d1)
Else
MONTHDIFF = Month(d2) - Month(d1) - 1
End If
Else
If Day(d2) >= Day(d1) Then
MONTHDIFF = Month(d2) - Month(d1) + 12
If MONTHDIFF = 12 Then MONTHDIFF = 0
Else
MONTHDIFF = Month(d2) - Month(d1) + 11
End If
End If
' Do the day part
If Day(d2) >= Day(d1) Then
DAYDIFF = Day(d2) - Day(d1)
Else
DAYDIFF = Day(DateSerial(Year(d1), _
Month(d1) + 1, 1) - 1) - Day(d1) + Day(d2)
End If
' Revised by Somkiat Foongkiat
' in case date1 > date2 and date2 is end of month
If Day(d1) > Day(d2) Then
If Day(d2) = Day(DateSerial(Year(d2), Month(d2) + 1, 0)) Then
DAYDIFF = 0
MONTHDIFF = MONTHDIFF + 1
End If
End If

If Day(d1) = Day(DateSerial(Year(d1), Month(d1) + 1, 0)) Then
If Day(d2) = Day(DateSerial(Year(d2), Month(d2) + 1, 0)) Then
DAYDIFF = 0
End If
End If

' Create the variant array to be returned
DATEDIFF = Array(YEARDIFF, MONTHDIFF, DAYDIFF)
End Function

======================================

'Further developed by Somkiat Foongkiat
Function YEARDIFF(d1, d2) As Integer
YEARDIFF = Application.Index(DATEDIFF(d1, d2), 1, 1)
End Function

Function MONTHDIFF(d1, d2) As Integer
MONTHDIFF = Application.Index(DATEDIFF(d1, d2), 1, 2)
End Function

Function DAYDIFF(d1, d2) As Integer
DAYDIFF = Application.Index(DATEDIFF(d1, d2), 1, 3)
End Function

E-Learning

Go to top