PDA

View Full Version : datedif นับจำนวนวันไม่ถูกต้อง



pongsakpee
24 Apr 2009, 11:43
เรียน ทุกท่านที่

ผมทดสอบการใช้ datedif(เริ่ม,สุดท้ายที่พ้นสภาพ,"md")

เริ่ม 07/05/20080 วันสุดท้ายที่พ้นสภาพ 1/05/2009 ได้เศษวันคือ = 24 จากสูตร Excel
คือวันสุดท้ายที่พ้นสภาพไม่ได้มาทำงานหรือไม่ต้องมานับตามสูตร
จนมีเด็กอายุ 11 ขวบคนหนึ่งถามผมด้วยคำถามว่าเขาคิดแบบนี้ได้ 25 วัน ถามว่าเขาคิดผิด หรือ excel คิดผิด

หากให้คิดว่า excel ไม่ผิดนะครับ แล้วทำไมสิ่งที่เด็กคนนี้คิด และนับจนได้ 25 ละผมทำตามเขาก็ได้ 25 จริงๆ ผมสงสัยคือ จะเอาเหตุผลอะไรไปบอกว่าสิ่งที่เขาคำนวนมันผิดตรงไหน
ปล.
ขอเน้นย้ำว่าผมอยากให้ช่วยหาจุดที่เขาคิดผิดนะครับ ไม่ใช่ไปบอกให้เขาคิดวิธีอื่นที่ไม่ใช่วิธีที่เขานำเสนอนะครับ
วิธีการคิดของเด็กๆ
เขาแบ่งเป็นเดือนๆ เช่น 30 , 31 บ้าง 28 เพราะปี 2009 มีกุมภาพันธ์คือ 29 วัน
เขานั่งนับด้วยมือว่ามีกี่เดือนจาก 06 - 05 ได้ 11 เดือน ดังนั้นเขามาคิดเศษวัน โดยบอกว่า เดือนพฤษภาคม คือ 05 มี 31 วัน เขามาทำงานตั้งแต่วันที่ 7 ดังนั้น จำนวนที่ทำงานทั้งหมด คือ 31 -7 +1 = 25 วัน

เอก
24 Apr 2009, 12:41
ถูกทั้งคู่ และผิดทั้งคู่ครับ

กรณีที่ว่า "ถูกทั้งคู่"
กล่าวคือ ถูกเพราะคิดตามหลักของตนเอง หมายความว่า "คนก็คิดแบบคน เครื่องก็คิดแบบเครื่อง" เช่น ไปอบรมตั้งแต่วันที่ 22-24 ถามว่า ไปอบรมกี่วัน ถ้าคิดแบบคนก็ต้องตอบว่า 3 วัน แต่ถ้าคิดแบบเครื่องจะตอบว่า 2 วัน เพราะเครื่องจะคิดแบบคณิตศาสตร์ (24-22=2)

คิดแบบคณิตศาสตร์ หมายถึง ไม่นับค่าเริ่มต้น เช่น 3+5=8 จะไม่เริ่มนับจาก 3 แต่จะเริ่มนับหนึ่งจาก 4 นับไปอีกห้าจำนวน คือ 4, 5, 6, 7 และ 8 ผลลัพธ์จึงได้ 8

แต่ถ้าเรามองในแง่หาอายุงาน ถ้าเข้างานวันที่ 3 แล้วอีก 5 วัน เขาจะมีอายุงานเท่าไร เราก็จะนับวันที่เข้างานด้วย ดังนั้น อีก 5 วันก็จะตรงกับวันที่ 8 แต่อายุงานจะเท่ากับ 6 วัน

กรณีที่ว่า "ผิดทั้งคู่"
หมายถึง คนไม่คิดแบบคณิตศาสตร์ และเครื่องก็ไม่คิดแบบความเป็นจริง ผลลัพธ์ก็เลยเป็น double standard (อ้าว...โยงมาการเมืองซะงั้น)

ดังนั้น กรณีถ้าใช้ DATEDIF ผมมักจะเขียนสูตรแบบนี้ครับ
=DATEDIF(start_date, end_date+1, type)


ไม่รู้ว่าอธิบายแล้วเข้าใจยิ่งขึ้น หรืองงยิ่งขึ้น :p

pongsakpee
24 Apr 2009, 13:54
ดังนั้น กรณีถ้าใช้ DATEDIF ผมมักจะเขียนสูตรแบบนี้ครับ
=DATEDIF(start_date, end_date+1, type)

ขอบคุณครับ คุณ เอก ผมก็ใช้หลักแบบนั้นเหมือนกัน เพราะผมมองว่า end_date+1 คือค่าขอบที่มันไม่ได้ถูกนับรวมไปด้วย
อย่างไรก็ตาม ผมพอแกะ ดูนะครับ พบว่า สูตรนี้มันผิดแล้วละ ดูเหมือนว่าเด็กจะนับถูก
กล่าวคือ datediff มันนับครบ 30 เด้งเป็น 1 เดือนเลยทันที่ หากเป็นคนนับจะครบเดือนต้องดูว่าลงท้ายด้วย ยน หรือเปล่า ถึงเด้งเป็น 1 เดือน

สมเกียรติ
25 Apr 2009, 10:40
สูตร DateDif เป็นสูตรที่ Microsoft แอบซ่อนไว้แต่นำสูตรมาใช้ได้ โดย Excel บางรุ่น เช่น Excel 2003/2007 ไม่ได้แสดงตัวสูตรนี้อธิบายไว้ใน Help

ที่แปลกกว่านั้นคือใน Excel 2007 สูตรนี้จะให้คำตอบต่างไปจาก Excel 2003 อีกด้วย เช่น ระหว่างวันที่ 30/1/2009 - 2/3/2009

Excel 2003 ตอบ 1 เดือน
Excel 2007 ตอบ 1 เดือน 3 วัน

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

ผมแนะนำให้ใช้สูตร DateDiff ซึ่งเป็น add-in ของ John Walkenbach และผมนำมาดัดแปลงแก้ไขต่ออีกขั้นหนึ่ง ลองดูแฟ้มแนบครับว่าให้คำตอบต่างกันอย่างไร ถ้าไม่ตรงกับที่ต้องการขอให้แจ้งผมด้วยจะได้หาทางแก้ไขรหัส VBA กันต่อไป

ดูกระทู้เรื่องนี้ที่ http://www.excelexperttraining.com/forums/showthread.php?p=7062

pongsakpee
6 May 2009, 21:15
ขอบคุณ อาจารย์ครับ
coding ที่อาจารย์ให้มานั้น สามารถตอบโจษท์ผมได้แล้วครับ :great: พบว่าเป็น 25 วันจริงๆ ดังนั้น datedif ของ excel ถือว่าคำนวนผิด :hurray:
ผมอยากทราบวิธีการนำ macro ของที่อาจารย์ทำไปใส่ใน Excel Sheet อื่นๆ หรือ มีวิธีแปลง macro เป็น add-in ครับ

ปล.
ผมใช้วิธีลูกทุ่งคือ copy code แล้วไปใส่ใน F11 ครับ แต่ว่าผมไม่เข้าใจสูตรนับเศษปี เศษวัน ทำไมใช้ชื่อ function เดียวกันครับ ทำแล้วมันฟ้อง Error หากไม่ใช่ Sheet ของ อาจารย์ครับ

สมเกียรติ
7 May 2009, 08:36
ผมสร้าง DateDiff.xla (http://www.excelexperttraining.com/extreme/files/timeplan/datediff.xla) ให้ download กันได้นานแล้วที่นี่ครับ
http://www.excelexperttraining.com/blogs/archives/z600-Downloads000590.php

วิธีติดตั้ง Add-in ให้ดูที่ http://www.excelexperttraining.com/blogs/archives/z300-ExcelCore000627.php

กรณีที่นำรหัสไปใส่ไว้ในแฟ้มแล้วสูตร DateDiff เกิด error ขึ้น อาจเกิดจากสะกดชื่อสูตรผิด เช่น สูตรนี้มี f 2 ตัว ให้ลองสร้างสูตรใหม่ทับลงไปหรือเลือกเซลล์สูตรเก่า 3 เซลล์พร้อมกันแล้วกด F2 แล้วกดปุ่ม Ctrl+Shift+Enter เพื่อกระตุ้นให้สูตรทำงานครับ ถ้ายังไม่ได้อีก ควรแนบแฟ้มนั้นมาดูกัน

สูตร DateDiff นี้ ผมปรับปรุงต่อจาก John Walkenbach ในกรณีที่วันต้นกับวันปลายเป็นปลายเดือนทั้งคู่ ให้นับเป็นจำนวนเดือนเต็มเดือนไปเลย ถ้าไม่อยากใช้แบบนี้ให้ตัดรหัสส่วนนี้ออกครับ



' 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

pongsakpee
10 May 2009, 14:21
ขอบคุณครับอาจารย์ ผมจะไปทดสอบให้มากกว่านี้ หากพบว่ามีอะไรน่าสนใจจะมา post ให้ข้อมูลต่อครับ