กฏกติกาของฟอรัม : แจ้งชื่อและนามสกุลจริงในการสมัครสมาชิก--ตั้งชื่อกระทู้ให้ตรงกับปัญหาที่ถาม--เขียนอธิบายคำถามทั้งในตัวกระทู้และในแฟ้มแนบให้ละเอียด--ห้ามใช้คำว่า อ่ะ คับ หรือคำผวน หรือคำที่ไม่มีในพจนานุกรมไทย--โปรดตั้งชื่อแฟ้มให้สื่อถึงปัญหาที่ถาม--อย่าระบุชื่อให้คนใดคนหนึ่งเป็นผู้ตอบ--งดให้ความร่วมมือหรือช่วยตอบคำถาม กระทู้ที่ละเมิดกฏกติกาของฟอรัม
Results 1 to 3 of 3

Thread: การคำนวณอายุ

  1. #1
    wat
    Guest

    Default การคำนวณอายุ

    ผมอยากขอเรียนถามอาจารย์ว่า คือเวลาทำงานผมจะต้องคำนวนอายุโดยดูจากปีเกิดว่าปัจจุบันอายุเท่าไหร่ อยากทราบว่าจะทำอย่างไรเมื่อเรา กรอกปีเกิดลงใน cell a1 แล้วให้ปรากฏอายุปี ทำไม่เป็นครับ

  2. #2
    Excel Expert Volunteer เอก's Avatar
    Join Date
    May 2007
    Location
    ลาดกระบัง กรุงเทพฯ
    Job
    ธุรกิจส่วนตัว อาจารย์พิเศษ วิทยากร ที่ปรึกษาองค์กร นักเขียน "ขออนุญาตไม่ทำไฟล์ตัวอย่าง สำหรับคำถามที่ไม่แนบไฟล์ตัวอย่าง"
    Version
    Excel 2003/2007/2010/2013/OpenOffice/LibreOffice and Windows XP/Windows 7
    Posts
    1,590

    Default

    ณ ตำแหน่งที่ต้องการแสดงอายุ พิมพ์สูตรดังนี้
    =DATEDIF(A1,TODAY(),"Y")&" ปี "&DATEDIF(A1,TODAY(),"YM")&" เดือน "&DATEDIF(A1,TODAY(),"MD")+1&" วัน"

    หมายเหตุ วันที่ที่พิมพ์ใน A1 จะต้องเป็นรูปแบบปี ค.ศ.
    นอกจากนี้ให้ตรวจสอบรูปแบบวันที่ปกติในเครื่องของคุณว่าเป็นแบบใด โดยการพิมพ์ =TODAY() ณ เซลล์ใดๆ ก็ได้ เพื่อดูว่าวันที่ในเครื่องของคุณเป็นรูปแบบใด เช่น dd/mm/yyyy หรือ mm/dd/yyyy และเมื่อทราบรูปแบบแล้ว ให้ใส่วันที่ใน A1 ให้ตรงกับรูปแบบดังกล่าวด้วย เพื่อจะได้ไม่เกิดความผิดพลาดในการคำนวณ

  3. #3
    Forum Admin สมเกียรติ's Avatar
    Join Date
    May 2007
    Location
    Excel Expert Training
    Job
    MS Excel Instructor
    Version
    Excel 2010/Windows 7
    Posts
    6,915
    Blog Entries
    5

    Default

    DateDif เป็นสูตรที่ Microsoft หลบๆซ่อนๆมานาน เดิมทีไม่ยอมเปิดเผยใน help แล้วต่อมาก็มีใน help และถ้าจำไม่ผิดตอนหลังๆนี้ถูกตัดจาก help ไปอีกแล้วครับ

    สูตรนี้ต้องใช้อย่างระวัง เพราะอาจคำนวณหาระยะเวลาผิดพลาดได้ เช่นถ้าหาระยะเวลาระหว่าง 30/1/2008 - 1/3/2008 จะพบว่ามีระยะเวลา 0 ปี 1 เดือน 0 วัน ซึ่งคำตอบที่ถูกต้องควรตอบว่าระยะเวลา 0 ปี 1 เดือน 2 วันต่างหาก

    หากจะใช้สูตรนี้ควรใช้วันที่ 1 ต้นเดือนในการคำนวณแทนวันอื่นๆ จากนั้นให้ปรับจำนวนวันที่ขาดเกินเองทีหลัง

    หรือหันไปใช้ DataDiff.xla จาก www.j-walk.com/ss จะได้คำตอบถูกต้องตามที่เราต้องการครับ ดูตัวอย่างการใช้สูตรนี้ได้จากเมนู Downloads > Extreme > งานวางแผนกำหนดการ

    VBA คำนวณอายุ ยังไม่ได้ทดสอบว่าคำนวณถูกต้องหรือไม่นะครับ
    http://www.vbaexpress.com/kb/getarticle.php?kb_id=866

    Code:
    Option Explicit 
     
    Function YearsMonthsDays(Date1 As Date, Date2 As Date, Optional ShowAll As _ 
        Boolean = False, Optional Grammar As Boolean = True) 
     
         ' This function returns a string "X years, Y months, Z days" showing the time
         ' between two dates.  This function may be used in any VBA or VB project
     
         ' Date1 and Date2 must either be dates, or strings that can be implicitly
         ' converted to dates.  If these arguments have time portions, the time portions
         ' are ignored. If Date1 > Date2 (after ignoring time portions), the function
         ' returns an empty string
     
         ' ShowAll indicates whether all portions of the string "X years, Y months, Z days"
         ' are included in the output.  If ShowAll = True, all portions of the string are
         ' always included.  If ShowAll = False, then if the year portion is zero the year
         ' part of the string is omitted, and if the year portion and month portion are both
         ' zero, than both year and month portions are omitted.  The day portion is always
         ' included, and if at least one year has passed then the month portion is always
         ' included
     
         ' Grammar indicates whether to test years/months/days for singular or plural
     
         ' By definition, a "full month" means that the day number in Date2 is >= the day
         ' number in Date1, or Date1 and Date2 occur on the last days of their respective
         ' months. A "full year" means that 12 "full months" have passed.
     
         ' In Excel, this function is an alternative to the little-known DATEDIF.  DATEDIF
         ' usually works well, but can create strange results when a date is at month end.
         ' Thus, this formula:
     
         '       =DATEDIF(A1,B1,"y") & " years, " & DATEDIF(A1,B1,"ym") & " months, " &
         '       DATEDIF(A1,B1,"md") & " days"
     
         ' will return "0 years, 1 months, -2 days" for 31-Jan-2006 and 1-Mar-2006.
         ' This function will return "0 years, 1 month, 1 day"
     
         ' Chip Pearson gives a VBA equivalent in his Age() function at
         ' http://www.cpearson.com/excel/datedif.htm
         ' Unfortunately, it gives the same result in the test case above
     
        Dim TestYear As Long, TestMonth As Long, TestDay As Long 
        Dim TargetDate As Date, Last1 As Date, Last2 As Date 
     
         ' Strip time portions
        Date1 = Int(Date1) 
        Date2 = Int(Date2) 
     
         ' Test for invalid dates
        If Date1 > Date2 Then 
            YearsMonthsDays = "" 
            Exit Function 
        End If 
     
         ' Test for whether the calendar year is the same
        If Year(Date2) > Year(Date1) Then 
     
             ' Different calendar year.
     
             ' Test to see if calendar month is the same.  If it is, we have to look at the
             ' day to see if a full year has passed
            If Month(Date2) = Month(Date1) Then 
                If Day(Date2) >= Day(Date1) Then 
                    TestYear = DateDiff("yyyy", Date1, Date2) 
                Else 
                    TestYear = DateDiff("yyyy", Date1, Date2) - 1 
                End If 
     
                 ' In this case, a full year has definitely passed
            ElseIf Month(Date2) > Month(Date1) Then TestYear = DateDiff("yyyy", Date1, Date2) ' A full year has not passed
            Else 
                TestYear = DateDiff("yyyy", Date1, Date2) - 1 
            End If 
     
             ' Calendar year is the same, so a full year has not passed
        Else 
            TestYear = 0 
        End If 
     
         ' Test to see how many full months have passed, in excess of the number of full
         ' years
        TestMonth = (DateDiff("m", DateSerial(Year(Date1), Month(Date1), 1), _ 
        DateSerial(Year(Date2), Month(Date2), 1)) + IIf(Day(Date2) >= _ 
        Day(Date1), 0, -1)) Mod 12 
     
         ' See how many days have passed, in excess of the number of full months.  If the day
         ' number for Date2 is >= that for Date1, it's simple
        If Day(Date2) >= Day(Date1) Then 
            TestDay = Day(Date2) - Day(Date1) 
     
             ' If not, we have to test for end of the month
        Else 
            Last1 = DateSerial(Year(Date2), Month(Date2), 0) 
            Last2 = DateSerial(Year(Date2), Month(Date2) + 1, 0) 
            TargetDate = DateSerial(Year(Date2), Month(Date2) - 1, Day(Date1)) 
            If Last2 = Date2 Then 
                If TestMonth = 11 Then 
                    TestMonth = 0 
                    TestYear = TestYear + 1 
                Else 
                    TestMonth = TestMonth + 1 
                End If 
            Else 
                TestDay = DateDiff("d", IIf(TargetDate > Last1, Last1, TargetDate), Date2) 
            End If 
        End If 
     
        If ShowAll Or TestYear >= 1 Then 
            YearsMonthsDays = TestYear & IIf(TestYear = 1 And Grammar, " year, ", _ 
            " years, ") & TestMonth & IIf(TestMonth = 1 And Grammar, " month, ", _ 
            " months, ") & TestDay & IIf(TestDay = 1 And Grammar, " day", " days") 
        Else 
            If TestMonth >= 1 Then 
                YearsMonthsDays = TestMonth & IIf(TestMonth = 1 And Grammar, " month, ", _ 
                " months, ") & TestDay & IIf(TestDay = 1 And Grammar, " day", " days") 
            Else 
                YearsMonthsDays = TestDay & IIf(TestDay = 1 And Grammar, " day", " days") 
            End If 
        End If 
     
    End Function
    Last edited by สมเกียรติ; 29 Jul 2008 at 17:29.

Tags for this Thread

Posting Permissions

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