Tính thời gian làm việc thực tế

Liên hệ QC
Sai sót do lỗi anh Bill mà ta không lường được.

BeginDate = 04/12/2010 12:30:00

BeginTime = (BeginDate - Int(BeginDate)) * 24

Lẽ ra phải bằng 12.5, thế mà nó ra là 12.5000000000582, 1 sai số vô cùng nhỏ. Từ đó tính ra số giờ làm việc còn lại trong ngày đó là
TimeAtDate = 3,99999999994179

WorkTime = 4.0 tròn, mà giờ còn lại trong ngày thì không đủ 4, nên còn 0.0000000000582 giờ phải chuyển sang ngày hôm sau, hôm sau là chủ nhật, nên thứ 2 phải làm tiếp 0.0000000000582 giờ nữa mới hoàn thành.

Hic, anh Bill ơi là anh Bill!

Nên phải thay câu:

PHP:
BeginTime = (BeginDate - Int(BeginDate)) * 24
bằng câu:

PHP:
BeginTime = Hour(BeginDate) + Minute(BeginDate) / 60 + Second(BeginDate) / 3600

Bạn có thể kiểm chứng trên file. Ngoài ra, với ngày giờ bắt đầu là 04/12/2010 12:30:00, thời gian cần làm công việc là 4 giờ, kết quả là thứ bảy 04/12/2010 16:30:00. Chỉ cần bạn thêm 1 giây vào thời gian làm việc thành 4:00:01, giờ hoàn thành sẽ là thứ hai 06/12/2010 07:30:01
 

File đính kèm

  • Tinh TG PtmNew2.rar
    17.2 KB · Đọc: 38
Lần chỉnh sửa cuối:
Sai sót do lỗi anh Bill mà ta không lường được.

BeginDate = 04/12/2010 12:30:00

BeginTime = (BeginDate - Int(BeginDate)) * 24

Lẽ ra phải bằng 12.5, thế mà nó ra là 12.5000000000582, 1 sai số vô cùng nhỏ. Từ đó tính ra số giờ làm việc còn lại trong ngày đó là
TimeAtDate = 3,99999999994179

WorkTime = 4.0 tròn, mà giờ còn lại trong ngày thì không đủ 4, nên còn 0.0000000000582 giờ phải chuyển sang ngày hôm sau, hôm sau là chủ nhật, nên thứ 2 phải làm tiếp 0.0000000000582 giờ nữa mới hoàn thành.

Hic, anh Bill ơi là anh Bill!

Nên phải thay câu:

PHP:
BeginTime = (BeginDate - Int(BeginDate)) * 24
bằng câu:

PHP:
BeginTime = Hour(BeginDate) + Minute(BeginDate) / 60 + Second(BeginDate) / 3600

Bạn có thể kiểm chứng trên file. Ngoài ra, với ngày giờ bắt đầu là 04/12/2010 12:30:00, thời gian cần làm công việc là 4 giờ, kết quả là thứ bảy 04/12/2010 16:30:00. Chỉ cần bạn thêm 1 giây vào thời gian làm việc thành 4:00:01, giờ hoàn thành sẽ là thứ hai 06/12/2010 07:30:01
Dạ cám ơn Thầy nhiều.Em chỉ cần kết quả đến phút là đạt lắm rồi.Thầy làm đến cả giây thì thật là wá chính xác (rất cám ơn nhiệt tình của Thầy )
Công việc rất thuận lợi khi có file này. Xin gửi lời cám ơn đến tất cả Thầy cô cùng các AC và các bạn .
 
Cải tiến không dùng vòng lặp:
- Tính số tuần chẵn
- Tính số ngày chẵn sau khi trừ số tuần, số này nhỏ hơn 7 (phần này không dùng Do loop như trước)
- Nếu số ngày chẵn này cộng thêm thứ của ngày bắt đầu có bước qua chủ nhật, cộng thêm 1.
- Tính thời gian còn lại sau khi trừ tuần chẵn & ngày chẵn.
- Một số tính toán và tính toán có điều kiện khác

Mã:
[COLOR=#000000][COLOR=#007700]Function [/COLOR][COLOR=#0000bb]GetEndPoint[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000bb]BeginDate[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000bb]WorkTime[/COLOR][COLOR=#007700])
[/COLOR][COLOR=#0000bb]Dim EsDate [/COLOR][COLOR=#007700]As [/COLOR][COLOR=#0000bb]Long[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000bb]WdBegDate [/COLOR][COLOR=#007700]As [/COLOR][COLOR=#0000bb]Long[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000bb]RestTime [/COLOR][COLOR=#007700]As [/COLOR][COLOR=#0000bb]Single
Dim TimeAtDate[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000bb]AddDays[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000bb]BeginTime[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000bb]AddWeeks[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000bb]TotalDaysAdded
[/COLOR][COLOR=#007700]Const [/COLOR][COLOR=#0000bb]BeginMor [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000bb]7.5[/COLOR][COLOR=#007700]: Const [/COLOR][COLOR=#0000bb]EndMor [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000bb]11.5
[/COLOR][COLOR=#007700]Const [/COLOR][COLOR=#0000bb]BeginAft [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000bb]12.5[/COLOR][COLOR=#007700]: Const [/COLOR][COLOR=#0000bb]EndAft [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000bb]16.5
[/COLOR][COLOR=#007700]Const Break = [/COLOR][COLOR=#0000bb]1[/COLOR][COLOR=#007700]: Const [/COLOR][COLOR=#0000bb]DayWTime [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000bb]8[/COLOR][COLOR=#007700]: Const [/COLOR][COLOR=#0000bb]WeekWTime [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000bb]48
WdBegDate [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000bb]Weekday[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000bb]BeginDate[/COLOR][COLOR=#007700])
[/COLOR][COLOR=#0000bb]BeginTime [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000bb]Hour[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000bb]BeginDate[/COLOR][COLOR=#007700]) + [/COLOR][COLOR=#0000bb]Minute[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000bb]BeginDate[/COLOR][COLOR=#007700]) / [/COLOR][COLOR=#0000bb]60 [/COLOR][COLOR=#007700]+ [/COLOR][COLOR=#0000bb]Second[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000bb]BeginDate[/COLOR][COLOR=#007700]) / [/COLOR][COLOR=#0000bb]3600
TimeAtDate [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000bb]IIf[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000bb]BeginTime [/COLOR][COLOR=#007700]<= [/COLOR][COLOR=#0000bb]EndMor[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000bb]EndAft [/COLOR][COLOR=#007700]- Break, [/COLOR][COLOR=#0000bb]EndAft[/COLOR][COLOR=#007700]) - [/COLOR][COLOR=#0000bb]BeginTime
[/COLOR][COLOR=#007700]If [/COLOR][COLOR=#0000bb]TimeAtDate [/COLOR][COLOR=#007700]>= [/COLOR][COLOR=#0000bb]WorkTime Then
    GetEndPoint [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000bb]BeginDate [/COLOR][COLOR=#007700]+ [/COLOR][COLOR=#0000bb]WorkTime [/COLOR][COLOR=#007700]/ [/COLOR][COLOR=#0000bb]24 [/COLOR][COLOR=#007700]+ [/COLOR][COLOR=#0000bb]_
    IIf[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000bb]BeginTime [/COLOR][COLOR=#007700]<= [/COLOR][COLOR=#0000bb]EndMor [/COLOR][COLOR=#007700]And [/COLOR][COLOR=#0000bb]BeginTime [/COLOR][COLOR=#007700]+ [/COLOR][COLOR=#0000bb]WorkTime [/COLOR][COLOR=#007700]> [/COLOR][COLOR=#0000bb]EndMor[/COLOR][COLOR=#007700], Break / [/COLOR][COLOR=#0000bb]24[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000bb]0[/COLOR][COLOR=#007700])
    Exit Function
Else
    [/COLOR][COLOR=#0000bb]RestTime [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000bb]WorkTime [/COLOR][COLOR=#007700]- [/COLOR][COLOR=#0000bb]TimeAtDate
    AddWeeks [/COLOR][COLOR=#007700]= ([/COLOR][COLOR=#0000bb]RestTime \ WeekWTime[/COLOR][COLOR=#007700])
    [/COLOR][COLOR=#0000bb]TotalDaysAdded [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000bb]7 [/COLOR][COLOR=#007700]* [/COLOR][COLOR=#0000bb]AddWeeks
    RestTime [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000bb]RestTime [/COLOR][COLOR=#007700]- [/COLOR][COLOR=#0000bb]WeekWTime [/COLOR][COLOR=#007700]* [/COLOR][COLOR=#0000bb]AddWeeks
        AddDays [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000bb]RestTime \ DayWTime [/COLOR][/COLOR]
[COLOR=#000000][COLOR=#0000bb]        RestTime [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000bb]RestTime [/COLOR][COLOR=#007700]- [/COLOR][COLOR=#0000bb]AddDays [/COLOR][COLOR=#007700]* [/COLOR][COLOR=#0000bb]DayWTime[/COLOR][/COLOR][COLOR=#000000][COLOR=#0000bb]                 
            TotalDaysAdded [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000bb]TotalDaysAdded [/COLOR][COLOR=#007700]+ [/COLOR][COLOR=#0000bb]AddDays[/COLOR][/COLOR] [COLOR=#000000][COLOR=#007700] + [/COLOR][COLOR=#0000bb]IIf[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000bb]WdBegDate +[/COLOR][/COLOR][COLOR=#000000][COLOR=#0000bb]AddDays [/COLOR][COLOR=#007700]> [/COLOR][COLOR=#0000bb]7[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000bb]1[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000bb]0[/COLOR][COLOR=#007700])[/COLOR][/COLOR]
[COLOR=#000000][COLOR=#0000bb]            TotalDaysAdded [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000bb]TotalDaysAdded [/COLOR][COLOR=#007700]+ [/COLOR][COLOR=#0000bb]IIf[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000bb]RestTime [/COLOR][COLOR=#007700]<> [/COLOR][COLOR=#0000bb]0[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000bb]1[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000bb]0[/COLOR][COLOR=#007700])[/COLOR][COLOR=#007700]
    If [/COLOR][COLOR=#0000bb]RestTime [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000bb]0 Then
        GetEndPoint [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000bb]Int[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000bb]BeginDate[/COLOR][COLOR=#007700]) + [/COLOR][COLOR=#0000bb]EndAft [/COLOR][COLOR=#007700]/ [/COLOR][COLOR=#0000bb]24 [/COLOR][COLOR=#007700]+ [/COLOR][COLOR=#0000bb]_
        TotalDaysAdded [/COLOR][COLOR=#007700]+ [/COLOR][COLOR=#0000bb]IIf[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000bb]Weekday[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000bb]BeginDate [/COLOR][COLOR=#007700]+ [/COLOR][COLOR=#0000bb]TotalDaysAdded[/COLOR][COLOR=#007700]) = [/COLOR][COLOR=#0000bb]1[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000bb]1[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000bb]0[/COLOR][COLOR=#007700])
        Exit Function
    [/COLOR][COLOR=#0000bb]End [/COLOR][COLOR=#007700]If
[/COLOR][COLOR=#0000bb]End [/COLOR][COLOR=#007700]If
[/COLOR][COLOR=#0000bb]GetEndPoint [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000bb]Int[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000bb]BeginDate[/COLOR][COLOR=#007700]) + [/COLOR][COLOR=#0000bb]TotalDaysAdded [/COLOR][COLOR=#007700]+ [/COLOR][COLOR=#0000bb]BeginMor [/COLOR][COLOR=#007700]/ [/COLOR][COLOR=#0000bb]24
[/COLOR][COLOR=#007700]If [/COLOR][COLOR=#0000bb]Weekday[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000bb]GetEndPoint[/COLOR][COLOR=#007700]) = [/COLOR][COLOR=#0000bb]1 Then GetEndPoint [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000bb]GetEndPoint [/COLOR][COLOR=#007700]+ [/COLOR][COLOR=#0000bb]1
GetEndPoint [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000bb]GetEndPoint [/COLOR][COLOR=#007700]+ [/COLOR][COLOR=#0000bb]RestTime [/COLOR][COLOR=#007700]/ [/COLOR][COLOR=#0000bb]24 [/COLOR][COLOR=#007700]+ [/COLOR][COLOR=#0000bb]IIf[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000bb]RestTime [/COLOR][COLOR=#007700]+ [/COLOR][COLOR=#0000bb]BeginMor [/COLOR][COLOR=#007700]> [/COLOR][COLOR=#0000bb]EndMor[/COLOR][COLOR=#007700], Break / [/COLOR][COLOR=#0000bb]24[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000bb]0[/COLOR][COLOR=#007700])
[/COLOR][COLOR=#0000bb]End [/COLOR][COLOR=#007700]Function  [/COLOR][/COLOR]
 
Lần chỉnh sửa cuối:
Caùc baùc giuùp tính truong hôïp: taêng ca thöù 2,4,6 vaø thöù 7 + CN (taêng ca toái 17h30-20h30, T7 vaø CN laùm töø 7h30-16h )
 
Xin gửi lên bài giải của em. Hoàn toàn bằng công thức.
Nhưng đơn vị thời gian nhỏ nhất là mỗi 30 phút. Em không thể làm với thời gian nhỏ hơn...
Nhờ các bác kiểm tra dùm xem có sai ở đâu nữa không.
bạn có thể giúp mình liên quan đến tiến độ sản xuất được ko. Vui lòng liên hệ 0903.477.477, hoặc bạn cjho minh sdt của bạn
 
Web KT

Bài viết mới nhất

Back
Top Bottom