เพื่อมุ่งให้เกิดคุณภาพจากการอบรมสูงสุด Excel Expert Training ให้การอบรม Excel กลุ่มเล็กๆ ไม่เกิน 6 คนทุกคนสามารถเรียนรู้ Excel อย่างใกล้ชิด จะมาคนเดียวหรือมาเป็นกลุ่มแล้วนัดวันอบรมแบบส่วนตัวก็ได้ ผู้เข้าอบรมทุกคนสามารถติดตามเนื้อหาที่อบรมได้อย่างชัดเจนจากจอภาพด้านหน้าของตัวเอง
Results 1 to 10 of 10

Thread: สอบถามเรื่องการแปลงข้อมูลจากวันเป็นปี

  1. #1
    seal_true
    Guest

    สอบถามเรื่องการแปลงข้อมูลจากวันเป็นปี

    ขอสอบถามเรื่องการแปลงข้อมูลจากวันเป็นปีครับ เช๋น 1096 วัน เป็นกี่ปี โดยมีเงื่อนไขตรงตามปีจริงๆ เพราะปีนี้มี 366 วัน แต่ทั่วไปมี 365 วัน / ขอบคุณครับ

  2. #2
    เอก
    Guest
    ถ้าจะให้มีเงื่อนไขตรงตามปีจริงๆ คุณก็ต้องมีวันที่จริงๆ เข้ามาเกี่ยวข้องด้วย เช่น 1096 วันของคุณน่ะ มันเริ่มนับจากวัน-เดือน-ปีไหน หรือนับถึงวัน-เดือน-ปีไหน ถ้ารู้วันที่ ก็สามารถหาได้ครับ ใช้ฟังก์ชัน DATEDIF ก็ได้

  3. #3
    สมเกียรติ
    Guest
    Quote Originally Posted by seal_true View Post
    ขอสอบถามเรื่องการแปลงข้อมูลจากวันเป็นปีครับ เช๋น 1096 วัน เป็นกี่ปี โดยมีเงื่อนไขตรงตามปีจริงๆ เพราะปีนี้มี 366 วัน แต่ทั่วไปมี 365 วัน / ขอบคุณครับ
    ถ้านับจากวันนี้ไปอีก 1096 วัน นับได้ 1 ปี 0 เดือน กับ 1 วันครับ

    ผมได้แนบแฟ้มเทียบสูตร Datedif ของ Excel กับ Datdiff (Function VBA) ของ www.j-walk.com/ss มาให้ดูด้วยว่าผลต่างกัน

  4. #4
    seal_true
    Guest
    ผมขอขอบคุณ คุณเอก , อาจารย์สมเกียรติด้วยครับ จากเรื่องยากกลายเป็นเรื่องง่ายเลยครับ

  5. #5
    seal_true
    Guest
    ตอนนี้ผมสร้างข้อมูลแล้ว แต่พบว่าเกิดปัญหาคือ ถ้าผมทำสัญญากับลูกค้ารายหนึ่ง ให้มีวันเริ่มต้นทำสัญญา คือ 31-12-2007 แล้ว ให้สิ้นสุด 30-06-2008 ปรากฎว่า คำนวณได้ 5 เดือนกับ 30 วัน (ไม่ใช่ 6เดือนตามที่คิด)และลองทดสอบเปลี่ยนเป็นสิ้นสุด 31-07-2008 ผลลัพท์คือ 7 เดือน ซึ่งถูกต้อง
    ลองทดสอบไปหลายรอบแล้ว พบว่า จะเพี้ยนเฉพาะเดือน มิ.ย. เท่านั้นครับ ผมไม่ทราบสาเหตุ รบกวนช่วยอธิบายด้วยครับ

  6. #6
    สมเกียรติ
    Guest

    DateDiffer

    ปัญหานี้เกิดขึ้นเพราะหลักคำนวณที่ใช้ครับ คงต้องระวังหากจะใช้สูตร DateDiff/DateDif

    ผมลองค้นหา DateDiff ใน VBA พบว่ามี function นี้อยู่แล้ว จึงลองสร้างสูตรใหม่ชื่อ DateDiffer มาให้ลองใช้กันครับ เท่าที่ดูจะหาคำตอบได้ 6 เดือนตรงตามที่ต้องการ แถมสูตรนี้ยังใช้หาช่วงระยะเวลาได้หลากหลายแบบ แต่จะคำนวณได้แค่ระยะเวลาสะสม ไม่สามารถนับปีชนปีแล้วนับเดือนที่เหลือได้แบบ DateDif

    =DateDiffer(Date1,Date2,Interval)

  7. #7
    seal_true
    Guest
    ขอบคุณครับอาจารย์สมเกียรติ

  8. #8
    สมเกียรติ
    Guest
    น่าสังเกตว่า Microsoft ได้ตัดรายละเอียดของสูตร DateDif ออกไป จาก help ใน Excel ตั้งแต่รุ่น 2002 ทิ้งไปแล้ว และเว็บของ John Walkenbach ได้ตัด DateDiff add-in ออกไปด้วย จึงทำให้คิดว่าสูตรทั้งสองนี้ต้องมีอะไรที่ไม่ควรใช้อยู่เป็นแน่ หรืออาจเป็นเพราะใน VBA มีสูตร DateDiff อยู่แล้วจึงไม่จำเป็นต้องใช้สูตรนี้อีกใน Excel ก็เป็นได้ครับ

    จึงขอตั้งข้อสังเกตไว้ให้พวกเราใช้กันอย่างระมัดระวัง

    ดูรายละเอียดเพิ่มเติมที่
    http://www.j-walk.com/ss/excel/odd/odd03.htm
    http://www.cpearson.com/excel/datedif.aspx

  9. #9
    สมเกียรติ
    Guest
    ผมปรับสูตร DateDiff ของ John Walkenbach ในกรณีที่ชนสิ้นเดือนจะนับเพิ่มเดือนแทนเพิ่มวัน เช่น วันเริ่มต้นทำสัญญา คือ 31-12-2007 แล้ว ให้สิ้นสุด 30-06-2008 จะคำนวณได้ 6 เดือน

    ฝากช่วยตรวจสอบครับด้วยว่ายังคำนวณไม่ตรงตามที่เราคิดตรงไหนอีกบ้าง

    Code:
     
    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

  10. #10
    seal_true
    Guest
    ขอบคุณอีกครั้งครับอาจารย์สมเกียรติ

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •