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

Liên hệ QC
Chậm chân một chút!
Có 1 thuật toán đơn giản, tôi nghĩ ra từ 3 ngày nay, nhưng chưa làm được. Bây giờ mới xong, nhờ các bạn kiểm tra hộ:

1. tính thời gian còn lại (A) của ngày bắt đầu: thí dụ bắt đầu 10:00, số giờ còn lại là 1,5 giờ cho ngày thứ bảy và 5 giờ cho ngày thường.

2. So sánh giờ định mức với A:
a. nếu nhỏ hơn thì tính ngay
b. Nếu lớn hơn:​
b.1- số ngày cộng thêm = 0, Dùng 1 vòng lặp Do:

b.2- cho số ngày cộng thêm tăng thêm 1
b.3- nếu ngày bắt đầu cộng với số ngày cộng thêm là chủ nhật, tăng số ngày ôộng thêm lên 1 nữa
b.4- tính số giờ còn lại sau khi cộng thêm 1 ngày
b.4.1- Nếu số giờ còn lại đó lớn hơn 4 giờ (thứ bảy), hoặc 7,5 giờ (ngày thường), loop (quay lại b.2)
b.4.2- Nếu số giờ còn lại nhỏ hơn 4 giờ (thứ bảy), hoặc 7,5 giờ (ngày thường), thoát Do​
3. Ngày kết thúc = ngày bắt đầu (quy về 7:30 sáng) + số ngày cộng thêm

4. Giờ kết thúc = 7:30 + số giờ còn lại (ở cuối phần Do loop) + thêm 2 giờ nếu ngày thường và sau 11:30

Có thể tính chính xác đến 1 phút.

Nhờ mọi người kiểm tra hộ. Có 3 cái scrollbar để tiện cho việc kiểm tra: 1 cái tăng định mức thêm 1 giờ, 1 cái tăng thêm 5 phút, 1 cái tăng thêm 1 phút.
Xin cám ơn.
Em mới thử trường hợp này thấy chưa đúng.
- Bắt đầu từ 15h ngày 12/01/2009, định mức là 1. Kết quả ra 8h30 ngày 13/01/2009(sai) đúng phải là 16h ngày 12/01/2009.
 
Cám ơn Rollover, đúng là chỗ mà mình phân vân, nghĩ rằng sẽ sai, mà không biết lý do vì sao mà phân vân. Bây giờ thì biết rồi, xin vui lòng tải lại file bài này.
 

File đính kèm

  • TimePtm2.xls
    43.5 KB · Đọc: 26
Lần chỉnh sửa cuối:
Cám ơn Rollover, đúng là chỗ mà mình phân vân, nghĩ rằng sẽ sai, mà không biết lý do. Bây giờ thì biết rồi, xin vui lòng tải lại file bài này.
Nếu này đầu là
12/01/2009 11:30:00 AM
Và thời gian cộng thêm là 1 phút thì đáp số phải là 12/01/2009 1:31:00 PM
Nhưng Bác ra là.
12/01/2009 11:32:00 AM
 
Nếu này đầu là
12/01/2009 11:30:00 AM
Và thời gian cộng thêm là 1 phút thì đáp số phải là 12/01/2009 1:31:00 PM
Nhưng Bác ra là.
12/01/2009 11:32:00 AM
Tính 1 phút thì có vẻ chi li quá, 1h thì kết quả vẫn bị sai vì cho ra kết quả là 12/01/2009 12:30, lẽ ra kết quả phải cho ra 12/01/2009 14:30.
- Cách này là bác lặp theo từng ngày, như vậy nhanh hơn cách của bác ThuNghi đáng kể, nhưng vẫn bị chậm khi số ngày quá lớn. Em thử lấy ví dụ để so sánh tốc độ với code của em 1 chút thôi nhé, không có ý nghĩa thực tế. Nếu định mức là 2.158.000(2158000=1000*52*41.5) tức là vào khoảng 1000 năm thì code của bác chạy sẽ tương đối lâu.
 
Thiếu 1 dấu bằng (=) chỗ dưới đây:
Mã:
If TThisDay >= WorkTime Then

BeginTime = Hour(BeginDate) + Minute(BeginDate) / 60
GetEndPoint = BeginDate + WorkTime / 24 + _
IIf(BeginTime <[COLOR="Red"][B]=[/B][/COLOR] 11.5 And BeginTime + WorkTime > 11.5, 2 / 24, 0)
Exit Function

Mình giả định rằng với dự án lớn (trên 1 tháng), người ta tính bằng ngày, không tính bằng giờ với phút.

Nếu thực sự cần, thì thêm 1 điều kiện trước Do:
Mã:
If RestTime >= 41.5 then AddDays = 7 * (RestTime \ 41.5)
RestTime = RestTime Mod 41.5

Hoặc gán thẳng cho AddDays: (trước Do)
Mã:
AddDays = 7 * (RestTime \ 41.5)
RestTime = RestTime Mod 41.5


Sau đó tăng AddDays dần từng ngày (tối đa 6 vòng)
 
Lần chỉnh sửa cuối:
Sau đây là file đã chỉnh sửa theo gợi ý của RollOver: tính thêm số tuần nguyên x 7 để giảm số lần lặp.

Thêm nữa, chỉ cần định dạng lại ô kết quả, muốn tính tới 1 giây thì chơi lun! khỏi sửa code!

Nhân tiện, xin cảnh báo với mọi người là Hàm Mod của VBA trả về số nguyên.
Thí dụ:

46.50667 Mod 41.5 = 5 chứ không phải 5.00667
46.55667 Mod 41.5 = 5 !!!!

Muốn ra 5.00667 phải làm dài hơn:
= 46.50667 - 41.5 * (46.50667 \ 41.5)

To BNTT: vẫn còn nhảy sớm ngày trong trường hợp ngày giờ kết thúc là 11:30 thứ bảy, sẽ nhảy qua 7:30 thứ hai, dù rằng giữa 2 thời điểm này không có phút làm việc nào.
Trong file có sử dụng cả function của RollOver và công thức của BNTT để kiểm tra chéo.
 

File đính kèm

  • Tinh TG Ptm-BNTT-RollOver.rar
    22.3 KB · Đọc: 35
Lần chỉnh sửa cuối:
To BNTT: vẫn còn nhảy sớm ngày trong trường hợp ngày giờ kết thúc là 11:30 thứ bảy, sẽ nhảy qua 7:30 thứ hai, dù rằng giữa 2 thời điểm này không có phút làm việc nào.
Làm gì có chuyện đó bác ơi! Nếu kết quả là 11:30 thứ Bảy thì nó vẫn là 11:30 thứ Bảy.
Chứng minh bằng vài hình nhé:
002-23.jpg


001-41.jpg


000-169.jpg
 
Ừ , thử trên file gốc của BNTT thì không bị, nhưng copy 2 module, và vài ô số vào, thì lại bị. Không tìm được nguyên nhân.
 
Em đã đọc hết bài này và có tải về xem ,có chỉnh lại thời gian theo yêu cầu riêng là bắt đầu 7'30-11'30 chiều từ 12'30-16'30 thứ bày từ 7'30-11'30 chiều từ 12'30-16'30 CN nghỉ (CTY em làm 48 giờ 1 tuần).
Làm mãi mà không ra kết quả như ý .Kính mong các anh chị giúp em hoàn thành file.
Kính nhờ MOD xóa bài này
http://www.giaiphapexcel.com/forum/showthread.php?43216-xác-định-mốc-thời-gian-hoàn-thành-công-việc
do e không biết đã có đề tài rồi.
Em xin cảm ơn.
 
Các anh chị đâu rồi.Giúp em sửa code lại theo lịch thời gian của Cty em là đựơc .Em không thạo lắm về VB nên không biết chỉnh ra sao nữa
Kính mong các anh chị bớt chút thời gian cho em .
Em có dùng lại file của thầy PTM và có vào nghiên cứu code nhưng làm không đựơc(trình độ có hạn)
Em xin gửi file của thầy PTM để các anh chị cùng các thầy cô giúp em .
Em xin cám ơn.
 

File đính kèm

  • TimePtm2.xls
    39.5 KB · Đọc: 11
Lần chỉnh sửa cuối:
Kính mong các thầy cô cùng các anh chị giúp em
 
Kính mong các thầy cô cùng các anh chị giúp em
Cũng phải từ từ chứ bạn, đừng hối!
Tôi biết bài của bạn rất hay nhưng cũng rất khó ---> Đang suy nghĩ xem hướng nào tốt nhất ---> Tuy nó giống với hàm WorkdayVN mà tôi đã từng viết nhưng lại có những khó khăn riêng (chưa khắc phục được)
Dù sao bạn cũng phải để người ta "thở" chứ ---> Khi nào "thở" xong sẽ tính tiếp (không dám hứa)
 
Em đã tìm ra giải pháp cho vấn đề rồi.Cách này có gì sai xót không .Liệu có còn cách nào hay hơn cách này không.Kính nhờ các Thầy cô và các anh chị xem giúp file .
 

File đính kèm

  • thoi_gian_ketthuc (2).xls
    24.5 KB · Đọc: 20
Em đã tìm ra giải pháp cho vấn đề rồi.Cách này có gì sai xót không .Liệu có còn cách nào hay hơn cách này không.Kính nhờ các Thầy cô và các anh chị xem giúp file .
Chưa coi code, (bận quá), nhưng test vài cái thấy 1 chỗ không đúng. Xem file.

Tôi cũng đang sửa file cũ nhưng cũng còn đang test dở dang, còn lỗi, chưa dám post
 

File đính kèm

  • thoi_gian_ketthuctest.xls
    38.5 KB · Đọc: 12
Chưa coi code, (bận quá), nhưng test vài cái thấy 1 chỗ không đúng. Xem file.

Tôi cũng đang sửa file cũ nhưng cũng còn đang test dở dang, còn lỗi, chưa dám post
Cám ơn thầy .Em test thấy đúng mà thầy.Em tính thế này :
Một ngày chỉ làm 8 giờ (480 phút) .nếu em giao việc cho ai đó lúc 7'30 với định mức cho phép phải hoàn thành trong 8 tiếng 30 phút (510 phút) thì kết quả là phài kết thúc công việc lúc 8giờ ngày hôm sau ,còn nếu rơi vào thứ 7 thì sẽ là 8 giờ ngày thứ 2. Em tính nếu công việc cần 16 tiếng phải hoàn thành thì ngừơi đó phải làm 2 ngày .
 
Xem trong file ấy. Tôi test với 8 ngày (quy ra giờ và phút), nhưng kết quả là 28 ngày

Nếu test đúng với vài con số và kết luận đúng 100% được, thì cao thủ như ndu đâu có gọi là "cực kỳ khó".
 
Lần chỉnh sửa cuối:
Nhờ mọi người test hộ với mọi trường hợp. Tôi đã test và sửa tới sửa lui 2 ngày nhưng vẫn sợ sót trường hợp.
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]EsTime [/COLOR][COLOR=#007700]As [/COLOR][COLOR=#0000bb]Single[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000bb]RestTime [/COLOR][COLOR=#007700]As [/COLOR][COLOR=#0000bb]Single[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000bb]TimeAtDate[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000bb]AddDays[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000bb]BeginTime
[/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

BeginTime [/COLOR][COLOR=#007700]= ([/COLOR][COLOR=#0000bb]BeginDate [/COLOR][COLOR=#007700]- [/COLOR][COLOR=#0000bb]Int[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000bb]BeginDate[/COLOR][COLOR=#007700])) * [/COLOR][COLOR=#0000bb]24
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
    AddDays [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000bb]7 [/COLOR][COLOR=#007700]* ([/COLOR][COLOR=#0000bb]RestTime  WeekWTime[/COLOR][COLOR=#007700])
    [/COLOR][COLOR=#0000bb]RestTime [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000bb]RestTime [/COLOR][COLOR=#007700]- [/COLOR][COLOR=#0000bb]WeekWTime [/COLOR][COLOR=#007700]* ([/COLOR][COLOR=#0000bb]RestTime  WeekWTime[/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]_
        AddDays [/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]AddDays[/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
    Else
        Do
            [/COLOR][COLOR=#0000bb]AddDays [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000bb]AddDays [/COLOR][COLOR=#007700]+ [/COLOR][COLOR=#0000bb]1
            AddDays [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000bb]AddDays [/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]AddDays[/COLOR][COLOR=#007700]) = [/COLOR][COLOR=#0000bb]1[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000bb]1[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000bb]0[/COLOR][COLOR=#007700])
            If [/COLOR][COLOR=#0000bb]RestTime [/COLOR][COLOR=#007700]<= [/COLOR][COLOR=#0000bb]DayWTime Then [/COLOR][COLOR=#007700]Exit Do
            [/COLOR][COLOR=#0000bb]RestTime [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000bb]RestTime [/COLOR][COLOR=#007700]- [/COLOR][COLOR=#0000bb]DayWTime
        Loop
    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]AddDays [/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]
 

File đính kèm

  • Tinh TG PtmNew.rar
    16.3 KB · Đọc: 17
Lần chỉnh sửa cuối:
Có hiệu chỉnh code 1 chút xíu, xin vui lòng tải lại file bài trên.
 
Dạ em cám ơn Thầy rất nhiều .

Em test file với định mức là 4 giờ cho ngày bắt đầu là 4/12/2010 12:30 thì kết quả là 6/12/2010 7:30.Kết quả em mong muốn là 4/12/2010 16:30 .
Hiên tại em đã dùng file của bài 53 ,kết quả đã đáp ứng được công việc.

Rất cám ơn Thầy đã nhiệt tình giúp em.File của Thầy tất cả rất tốt duy chỉ có một lỗi nhỏ đó thôi.

Em xin kết thúc bài tại đây.
 
Dạ em cám ơn Thầy rất nhiều .

Em test file với định mức là 4 giờ cho ngày bắt đầu là 4/12/2010 12:30 thì kết quả là 6/12/2010 7:30.Kết quả em mong muốn là 4/12/2010 16:30 .
Hiên tại em đã dùng file của bài 53 ,kết quả đã đáp ứng được công việc.

Rất cám ơn Thầy đã nhiệt tình giúp em.File của Thầy tất cả rất tốt duy chỉ có một lỗi nhỏ đó thôi.

Em xin kết thúc bài tại đây.
Bạn kiểm file mình làm bằng công thức xem có đáp ứng được yêu cầu của bạn không
 

File đính kèm

  • thoi gian han dinh(1).xls
    44 KB · Đọc: 18
Web KT

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

Back
Top Bottom