Option Explicit
Private Sub cmdCalDiffTime_Click()
Dim ResultTime As String
' เรียกไปยังฟังค์ชั่น CalTime เพื่อส่งค่าเวลาเริ่มต้น และ สิ้นสุดไป
' และ ส่งค่ากลับ (Return) มาเป็นแบบ String ... คุณจะเอามาเป็นเวลาก็ได้
ResultTime = CalTime(dtpStartTime, dtpEndTime)
' การส่งค่าว่างเปล่ากลับมา ... แสดงว่าการคำนวณล้มเหลว ไม่ต้องทำการแสดงผล
If ResultTime <> "" Then MsgBox "จำนวนเวลาที่ต่างกัน : " & _
ResultTime, vbOKOnly + vbInformation, "รายงานผล"
End Sub
Private Sub Form_Load()
' ตั้งฟอร์มให้อยู่กึ่งกลางจอภาพ ... เครื่องหมาย \ คือ การหารตัดเศษ
' การคำนวณแบบนี้จะเร็วกว่าการหารเอาเศษ / ... น่ะครับพี่น้อง (ติ๊บเล็กๆ)
Me.Move (Screen.Width - Width) \ 2, (Screen.Height - Height) \ 2
' กำหนดค่าเวลาในการทดสอบดู
dtpStartTime.Value = "8:30:23"
dtpEndTime.Value = "12:46:53"
End Sub
Public Function CalTime(StartTime As Date, EndTime As Date) As String
On Error GoTo ErrHandler
Dim cHH As Long
Dim cMM As Long
Dim cSS As Long
' ทดสอบค่าก่อนว่าเวลาเริ่มต้นต้องน้อยกว่าเวลาที่สิ้นสุด
If StartTime = EndTime Then
' ค่าเท่ากันก็ไม่ต้องคำนวณอะไรอีกแล้ว ... เสียเวลาเปล่า 55555+
CalTime = "0:00:00"
Exit Function
' เวลาเริ่มต้นมากกว่า ก็แจ้ง Error ให้ทราบ
ElseIf StartTime > EndTime Then
MsgBox "เวลาเริ่มต้นจะมากกว่าได้ไงล่ะพี่น้อง ... มั่วหรือเปล่า.", _
vbOKOnly + vbInformation, "รายงานความผิดพลาด"
' คืนค่าว่างเปล่ากลับ ... หรืออื่นๆก็ได้ ที่เราต้องการแจ้งกลับไปว่าทำงานล้มเหลว ...
' และจบโปรแกรมย่อย (Function)
CalTime = ""
Exit Function
End If
' ===============================================================================
' หลักการของการหาค่าความแตกต่างของเวลา
' ใช้การหาค่าความแตกต่างในระดับจำนวนของวินาทีทั้งหมดออกมาก่อน
' แล้วค่อยคิดตัดออกจากจำนวนชั่วโมง นาที และ วินาที ที่ต่างกัน
' 1 ชั่วโมง เท่ากับ 3600 วินาที
' 1 นาที เท่ากับ 60 วินาที
Dim SecInMinute As Integer
Dim SecInHour As Integer
SecInMinute = 60 ' จำนวน 1 นาทีเท่ากับ 60 วินาที
SecInHour = 3600 ' มาจากจำนวน 60 นาทีใน 1 ชั่วโมง คูณเข้ากับ 60 วินาทีในแต่ละนาที ดังนั้น 1 ชั่วโมง = 3600 วินาที
' ===============================================================================
' หาจำนวนชั่วโมง (Hour) ... หารตัดเศษ ( \ ) ทิ้งไปเลย ... ทำงานได้เร็วกว่าการหารเอาเศษ ( / )
' การกำหนดชนิดตัวแปรแบบเลขจำนวนเต็ม (Integer หรือ Long) มันไม่มีเลขทศนิยมอยู่แล้วครับ
' หาความแตกต่างของจำนวนชั่วโมง โดยนับเป็นวินาที จากนั้นให้หารตัดเศษด้วย (จำนวนนาที x จำนวนวินาที)
' นั่นคือ ค่าที่ได้ \ (60 นาที x 60 วินาที) ... 1 ชั่วโมงก็จะเท่ากับ 3600 วินาที
cHH = DateDiff("s", StartTime, EndTime) \ SecInHour
' หาจำนวนนาที (Minute) ... ไล่เครื่องหมายวงเล็บให้ถูกด้วยน่ะครับ
' การใส่วงเล็บ จะมีความสำคัญที่สูงกว่าเครื่องหมาย + - * / ... อย่าลืมเด็ดขาด
' ความแตกต่างของจำนวนนาที ค่าที่ได้ให้ลบออกจากจำนวนวินาที
' จำนวนวินาทีที่ได้ ให้ลบออกจากเวลาจำนวนชั่วโมงที่ต่างกันก่อน (ชั่วโมง x วินาที)
' แล้วค่อยหารตัดเศษด้วย 60 ... เพราะ 1 นาที = 60 วินาที
cMM = (DateDiff("s", StartTime, EndTime) - (cHH * SecInHour)) \ SecInMinute
' ที่เหลือก็เป็นวินาที (Second)
' จำนวนวินาทีที่ต่างกันทั้งหมด - จำนวนชั่วโมงที่ต่างกัน - จำนวนนาทีที่ต่างกัน
' จำนวนชั่วโมงที่ต่างกัน กับ จำนวนนาทีที่ต่างกัน เราคิดระดับเป็นวินาทีน่ะครับ ... พี่น้อง
cSS = DateDiff("s", StartTime, EndTime) - (cHH * SecInHour) - (cMM * SecInMinute)
' คืนค่ากลับให้ฟังค์ชั่น (Return ค่ากลับเป็น String)
CalTime = cHH & ":" & cMM & ":" & cSS
ExitProc:
Exit Function
ErrHandler:
MsgBox Err.Number & vbCrLf & Err.Description, vbOKOnly + vbInformation, "รายงานความผิดพลาด"
Resume Next
End Function
|