Bác Tường làm hay quá, khi nào Bác chỉ giúp tôi hàm hour này với. Bữa giờ xem mà không biết cách làm giúp Bác Le Tin.Em xin góp một cách giải:Dựa vào dữ liệu của bác, em đặt 3 Name để kiểm tra dữ liệu ngày giờ như sau:![]()
Công thức để tính thời gian dự kiến kết thúc (F5:H5)
- Test1 = Sheet1!F$4 + Sheet1!F$3/24
- Test2 = (AND(HOUR(Test1)>11.5,HOUR(Test1)<13.5))*2/24 + (OR(HOUR(Test1)>17,HOUR(Test1)<7))*16.5/24
- Test3 = (WEEKDAY(Test2+Test1)=7)*44/24 - (WEEKDAY(Sheet1!F$4)=7)*2/24
= Test1 + Test2 + Test3Công thức để tính thời gian làm thực tế (F7:H7)=(F6-F4)*24 - (AND(HOUR(F6)>13.5, HOUR(F4)<11.5)*2 + (INT(F6)-INT(F4))*16.5 + (WEEKDAY(F6)=2)*11)Nhờ bác kiểm tra lại giúp em xem có đúng hay không.
Để em diễn Nôm cho bác nghe nhá. Trước tiên bác phải nắm được 2 cái này:Bác Tường làm hay quá, khi nào Bác chỉ giúp tôi hàm hour này với. Bữa giờ xem mà không biết cách làm giúp Bác Le Tin.
Bác giải thích hộ số *44/24
Cám ơn Bác nhiều!
Hu hu... Đúng là chưa chính xác.44 là số giờ từ 11:30 thứ bảy đến 7:30 sáng thứ 2
chia 24 là giờ quy ra ngày (học của ngocmaipretty), ngược lại nhân 24 là quy ngày ra giờ
nhân 44/24 là nếu WEEKDAY(Test2+Test1)=7) = "giờ kết thúc là nhằm vào thứ 7" thì cộng thêm 44 giờ
Giải thích hộ BNTT, nhưng hình như còn sai:
- test1 + test2 trúng ngày chủ nhật thì sao?
- test1 + test2 trúng ngày thứ bảy, nhưng vào buổi sáng thì sao?
- trừ 2 giờ để làm gì?
Chắc phải cầu cứu lại Ms. NgocMai!
Mấy con số 11.5, 13.5, 17, 7 chắc bác đoán được là gì chớ?
Dạ đúng là như vậy. Chưa chính xác. Em đang nghiên cứu lại nó, vì quả thật là ... hơi khó nhai!Cảm ơn bạn BNTT ,nhưng chưa ổn ,Ví dụ nhập 41.5 thì phải cách đúng 1 tuần sau (vì 1 tuần làm 41.5 giờ) chứ
Bài toán dạng này không phải là KHÓ, mà là CỰC KHÓDạ đúng là như vậy. Chưa chính xác. Em đang nghiên cứu lại nó, vì quả thật là ... hơi khó nhai!
Quả đúng là Cực Khó!Bài toán dạng này không phải là KHÓ, mà là CỰC KHÓ
Tôi thì nghĩ vầy:Quả đúng là Cực Khó!
Em nghĩ rằng chắc không dùng công thức nổi, giả như có nổi đi nữa thì chắc cái công thức này sẽ dài khủng khiếp, và phải rất nhiều công thức thì mới có thể chơi nổi!
Em có ý tưởng này, dùng VBA. Nhưng em thì không giỏi về VBA, nên xin nêu ra ý tưởng thôi, các bác xem có khả thi không thì làm dùm...
Lấy thời gian bắt đầu + thời gian dự định sẽ hoàn thành công việc, ra kết quả là A chẳng hạn. Rồi dùng vòng lặp để kiểm tra kết quả A:
(Các điều kiện kiểm tra trên có thể còn thiếu... em chỉ ví dụ thôi)
- Nếu A rơi vào khoảng nghỉ trưa (tử 11:30 đến 13:30) thì cộng thêm 2 tiếng. Cho ra A1.
- Nếu A1 rơi vào khoảng nghỉ chiều (từ 17:00 đến 7:30 ngày hôm sau) thì cộng thêm 14,5 tiếng. Cho ra A2.
- Nếu A2 rơi vào trưa thứ 7 (sau 11:30) thì cộng thêm 44 tiếng, cho ra A3.
- Rồi lại quay vòng tiếp, nếu A3 rơi vào khoảng nghỉ trưa thì lại cộng thêm 2 tiếng
- V.v...
- Cho tới khi nào cái kết quả này nằm trong khoảng thời gian chấp nhận được (rơi vào trong giờ hành chánh) thì dừng lại.
Liệu có khả thi không ạ ?
Em làm thử 1 function EstEndDate dự kiến ngày kết thúc. Anh xem thử có OK, em làm tiếp phần kia.Tôi gởi file nhờ các bạn xem giúp tối ưu hóa , mới tập viết code ,nhưng thấy nhiều IF quá , và chưa phát hiện sai .
Tôi đã làm tìm thời gian thực tế (Chưa biết ổn không), còn thời gian dự định chưa làm được , mời các bạn động não tiếp . Cảm ơn
Function EstEndTime(NgayDau As Variant, SoPhut As Long)
Dim NgayCuoi As Variant, iPhut As Long, IntervalType As String
IntervalType = "n"
SoPhut = SoPhut * 60
If Weekday(NgayDau) = 1 Then Exit Function 'xem lai cac dieu kien ve t7, CN
If Not IsDate(NgayDau) Then Exit Function
If SoPhut = 0 Then
EstEndTime = NgayCuoi
Exit Function
End If
iPhut = 30
Do While Not iPhut = SoPhut + 30
NgayCuoi = DateAdd(IntervalType, 30, NgayDau)
If Weekday(NgayDau) <> 7 And Hour(NgayCuoi) = 11 And Minute(NgayCuoi) = 30 And iPhut < SoPhut Then
NgayDau = DateAdd(IntervalType, 120, NgayCuoi)
ElseIf Weekday(NgayDau) <> 7 And Hour(NgayCuoi) = 17 And Minute(NgayCuoi) = 0 And iPhut < SoPhut Then
NgayDau = DateAdd(IntervalType, 14 * 60 + 30, NgayCuoi)
ElseIf Weekday(NgayDau) = 7 And Hour(NgayCuoi) = 11 And Minute(NgayCuoi) = 30 And iPhut < SoPhut Then
NgayDau = DateAdd(IntervalType, 44 * 60, NgayCuoi)
Else
NgayDau = NgayCuoi
End If
iPhut = iPhut + 30
Loop
EstEndTime = NgayCuoi
End Function
Chạy sub sau thì OK mà chưa hiểu sao chuyển sang UDF thì sai ở giờ end la 11h30Hình như là số giờ chứ không phải số phút
Và chỉ OK đối với số giờ chẵn .
Sub EndTime()
Dim NgayDau, NgayCuoi, iPhut As Long
With Application
.Calculation = xlCalculationManual
End With
Dim SoPhut As Long
Dim IntervalType As String
Sheet2.Select
IntervalType = "n"
NgayDau = Cells(2, 2)
SoPhut = Cells(1, 2) * 60
If Weekday(NgayDau) = 1 Then Exit Sub 'xem lai thu sau
iPhut = 30
Do While Not iPhut = SoPhut + 30
NgayCuoi = DateAdd(IntervalType, 30, NgayDau)
If Weekday(NgayDau) <> 7 And Hour(NgayCuoi) = 11 And Minute(NgayCuoi) = 30 And iPhut < SoPhut Then
NgayDau = DateAdd(IntervalType, 120, NgayCuoi)
ElseIf Weekday(NgayDau) <> 7 And Hour(NgayCuoi) = 17 And Minute(NgayCuoi) = 0 And iPhut < SoPhut Then
NgayDau = DateAdd(IntervalType, 14 * 60 + 30, NgayCuoi)
ElseIf Weekday(NgayDau) = 7 And Hour(NgayCuoi) = 11 And Minute(NgayCuoi) = 30 And iPhut < SoPhut Then
NgayDau = DateAdd(IntervalType, 44 * 60, NgayCuoi)
Else
NgayDau = NgayCuoi
End If
iPhut = iPhut + 30
Loop
Cells(2, 3) = NgayCuoi
End Sub
Bạn nghiên cứu hàm DateAdd nó cũng tựa như hàm Datedif.Chưa ổn lắm nhưng không hiểu ý nghĩa mấy chữ trong câu này nên cũng chưa biết nên sửa thế nào : NgayDau = DateAdd(IntervalType, 120, NgayCuoi)
Mình nói rõ thêm là Giờ định mức ấy có thể là : 10 ph ,15 ph , ... 30 ph,35 ph...1 g ,..
Function EndTime(NgayDau As Variant, SoPhut As Double)
Dim NgayCuoi As Variant, iPhut As Double, Block As Long
SoPhut = SoPhut * 60 'xem lai neu 1h5' thi nhap so the nao'
If Weekday(NgayDau) = 1 Then Exit Function 'xem lai cac dieu kien ve t7, CN'
If Not IsDate(NgayDau) Then Exit Function
Block = 30
If SoPhut = 0 Then
EndTime = NgayCuoi
Exit Function
End If
iPhut = Block
Do While Not iPhut = SoPhut + Block
NgayCuoi = DateAdd("n", Block, NgayDau)
If Weekday(NgayDau) <> 7 And Hour(NgayCuoi) = 11 And Minute(NgayCuoi) = 30 Then
NgayDau = DateAdd("n", 120, NgayCuoi)
ElseIf Weekday(NgayDau) <> 7 And Hour(NgayCuoi) = 17 And Minute(NgayCuoi) = 0 Then
NgayDau = DateAdd("n", 14 * 60 + 30, NgayCuoi)
ElseIf Weekday(NgayDau) = 7 And Hour(NgayCuoi) = 11 And Minute(NgayCuoi) = 30 Then
NgayDau = DateAdd("n", 44 * 60, NgayCuoi)
Else
NgayDau = NgayCuoi
End If
iPhut = iPhut + Block
Loop
EndTime = NgayCuoi
End Function
Em mày mò gần xong rồi, nhưng chỉ tính giờ định mức là bội số của 30 phút thôi... theo cái ví dụ ban đầu của bác. Giờ nghe bác nói vầy... oải quá!Mình nói rõ thêm là Giờ định mức ấy có thể là : 10 ph ,15 ph , ... 30 ph,35 ph...1 g ,..
Bác cụ thể cho em một ví dụ. Và quan trọng là Định mức công việc(g) Bác nhập theo dạng gì. 1.5h hay là 1:30' hay 1.2h hay là 1:12'. Bác sửa trong UDF của em thay block =1 xem thử nhưng mà sẽ chậm vì step 1'Xin lỗi do nói chưa rõ ràng , nhưng các bạn đã làm bội số 30 được thì bội số cho 1 hoặc 5 chắc là không khó . Còn định dạng thì mình có thể đổi qua lại được mà .
Function EndTime(NgayDau As Variant, SoPhut As Double)
Dim NgayCuoi As Variant, iPhut As Double, Block As Long
On Error Resume Next
SoPhut = Round(SoPhut * 60, 0) 'xem lai neu 1h5' thi nhap so the nao'
If Weekday(NgayDau) = 1 Then Exit Function 'xem lai cac dieu kien ve t7, CN'
If Not IsDate(NgayDau) Then Exit Function
Block = 1
If SoPhut = 0 Then
EndTime = NgayCuoi
Exit Function
End If
iPhut = Block
Do While Not iPhut = SoPhut + Block
NgayCuoi = DateAdd("n", Block, NgayDau)
If Weekday(NgayDau) <> 7 And Hour(NgayCuoi) = 11 And Minute(NgayCuoi) = 30 Then
NgayDau = DateAdd("n", 120, NgayCuoi)
ElseIf Weekday(NgayDau) <> 7 And Hour(NgayCuoi) = 17 And Minute(NgayCuoi) = 0 Then
NgayDau = DateAdd("n", 14 * 60 + 30, NgayCuoi)
ElseIf Weekday(NgayDau) = 7 And Hour(NgayCuoi) = 11 And Minute(NgayCuoi) = 30 Then
NgayDau = DateAdd("n", 44 * 60, NgayCuoi)
Else
NgayDau = NgayCuoi
End If
iPhut = iPhut + Block
Loop
EndTime = NgayCuoi
End Function
Mà có đúng không, em viết tiếp UDF thứ 2.Ok ,chậm không đáng kể
Chưa thấy sai , chắc là đúng , mình chỉ chỉnh lại chỗ UDF để người nhập khỏi nhầm lẫn , là nhập Sogio chứ không phải nhập phútMà có đúng không, em viết tiếp UDF thứ 2.
Function GetEndTime(BatDau, ThoiGian)
Dim SoTuan, SoNgay, ret, ThoiGianCon
Dim ThoiGianTemp
ThoiGianTemp = TimeSerial(Hour(BatDau), Minute(BatDau), 0)
If ThoiGianTemp > TimeSerial(13, 30, 0) Then
ThoiGianTemp = TimeSerial(4, 0, 0) + TimeSerial(13, 30, 0) - ThoiGianTemp
Else
ThoiGianTemp = ThoiGianTemp - TimeSerial(7, 30, 0)
End If
ThoiGian = ThoiGian + Hour(ThoiGianTemp) + Minute(ThoiGianTemp) / 60
BatDau = DateSerial(Year(BatDau), Month(BatDau), Day(BatDau)) + TimeSerial(7, 30, 0)
SoTuan = ThoiGian \ 41.5
ThoiGianCon = ThoiGian - SoTuan * 41.5
ret = BatDau + SoTuan * 7
Do While (Weekday(ret) <> 7 And ThoiGianCon >= 7.5) Or (Weekday(ret) = 7 And ThoiGianCon >= 4)
ThoiGianCon = ThoiGianCon - 4
If Weekday(ret) < 7 Then ThoiGianCon = ThoiGianCon - 3.5
If ThoiGianCon = 0 Then Exit Do
ret = ret + 1
If Weekday(ret) = 1 Then ret = ret + 1
Loop
If ThoiGianCon = 0 Then
ret = ret + TimeSerial(4, 0, 0)
If Weekday(ret) <> 7 Then ret = ret + TimeSerial(5, 30, 0)
ElseIf ThoiGianCon > 4 Then
ThoiGianCon = ThoiGianCon - 4
ret = ret + TimeSerial(Int(ThoiGianCon), (ThoiGianCon - Int(ThoiGianCon)) * 60, 0) + TimeSerial(6, 0, 0)
Else
ret = ret + TimeSerial(Int(ThoiGianCon), (ThoiGianCon - Int(ThoiGianCon)) * 60, 0)
End If
GetEndTime = ret
End Function
Bạn rollover79 xem thử nha:Cho em góp vui 1 đoạn code, ko rõ có đúng không mong các bác kiểm tra lại giúp. Trong code em chưa kiểm tra trường hợp người dùng nhập vào giá trị không hợp lệ![]()
Function GetEndTime(BatDau, ThoiGian)
Dim SoTuan, SoNgay, ret, ThoiGianCon
Dim ThoiGianTemp
ThoiGianTemp = TimeSerial(Hour(BatDau), Minute(BatDau), 0)
If ThoiGianTemp > TimeSerial(13, 30, 0) Then
ThoiGianTemp = TimeSerial(4, 0, 0) + TimeSerial(13, 30, 0) - ThoiGianTemp
Else
ThoiGianTemp = ThoiGianTemp - TimeSerial(7, 30, 0)
End If
ThoiGian = ThoiGian + Hour(ThoiGianTemp) + Minute(ThoiGianTemp) / 60
BatDau = DateSerial(Year(BatDau), Month(BatDau), Day(BatDau)) + TimeSerial(7, 30, 0)
SoTuan = ThoiGian \ 41.5
ThoiGianCon = ThoiGian - SoTuan * 41.5
ret = BatDau + SoTuan * 7
If ThoiGianCon > 0 Then
Do While (Weekday(ret) <> 7 And ThoiGianCon >= 7.5) Or (Weekday(ret) = 7 And ThoiGianCon >= 4)
ThoiGianCon = ThoiGianCon - 4
If Weekday(ret) < 7 Then ThoiGianCon = ThoiGianCon - 3.5
If ThoiGianCon = 0 Then Exit Do
ret = ret + 1
If Weekday(ret) = 1 Then ret = ret + 1
Loop
If ThoiGianCon = 0 Then
ret = ret + TimeSerial(4, 0, 0)
If Weekday(ret) <> 7 Then ret = ret + TimeSerial(5, 30, 0)
ElseIf ThoiGianCon > 4 Then
ThoiGianCon = ThoiGianCon - 4
ret = ret + TimeSerial(Int(ThoiGianCon), (ThoiGianCon - Int(ThoiGianCon)) * 60, 0) + TimeSerial(6, 0, 0)
Else
ret = ret + TimeSerial(Int(ThoiGianCon), (ThoiGianCon - Int(ThoiGianCon)) * 60, 0)
End If
End If
If True And TimeSerial(7, 30, 0) = TimeSerial(Hour(ret), Minute(ret), Second(ret)) Then
ret = (ret - 1) + TimeSerial(9, 30, 0)
If Weekday(ret) = 1 Then ret = (ret - 1) - TimeSerial(5, 30, 0)
End If
GetEndTime = ret
End Function
Với bài toán ngược này thì dễ hơn bài toàn xuôi nhiều, cách đơn giản là bác lặp hết các ngày cũng ra. Nhưng bác có thể giảm bớt số vòng lặp bằng cách tính trọn thời gian trong ngày và trong tuần. Mỗi tuần là 41.5, mỗi ngày thường là 7.5, thứ 7 là 4. Sau khi ra kết quả thì bác trừ đi 2 khoảng đầu ngày bắt đầu và khoảng cuối của ngày kết thúc là xong.Nhờ Bác RollOver79 làm hộ code ngược lại
Ta có ngày giờ đầu, cuối => số phút (h).
Tôi dùng code trên làm ngược lại vòng do sao cho có ngày giờ đầu = cuối => => số phút (h) mà chưa được
Cụ thể như
Function TimGio(NgayDau, NgayCuoi)
Do while endTime(NgayDau,SoGio) = NgayCuoi
...
Loop
end Function
Cám ơn Bạn nhiều. Đang học Do ...Loop mà chưa hiểu nhiểu.
Function GetTime(BatDau, KetThuc)
Dim NgayDau, NgayCuoi, SoTuan, ret, i
NgayDau = DateSerial(Year(BatDau), Month(BatDau), Day(BatDau))
NgayCuoi = DateSerial(Year(KetThuc), Month(KetThuc), Day(KetThuc))
SoTuan = DateDiff("d", NgayDau, NgayCuoi) \ 7
ret = SoTuan * 41.5
NgayDau = NgayDau + SoTuan * 7
For i = NgayDau To NgayCuoi
Select Case Weekday(i)
Case 7: ret = ret + 4
Case 2, 3, 4, 5, 6: ret = ret + 7.5
End Select
Next
Dim ThoiGianTemp
ThoiGianTemp = TimeSerial(Hour(BatDau), Minute(BatDau), 0)
If ThoiGianTemp > TimeSerial(13, 30, 0) Then
ThoiGianTemp = TimeSerial(4, 0, 0) + TimeSerial(13, 30, 0) - ThoiGianTemp
Else
ThoiGianTemp = ThoiGianTemp - TimeSerial(7, 30, 0)
End If
ret = ret - Hour(ThoiGianTemp) - Minute(ThoiGianTemp) / 60
ThoiGianTemp = TimeSerial(Hour(KetThuc), Minute(KetThuc), 0)
If ThoiGianTemp > TimeSerial(13, 30, 0) Then
ThoiGianTemp = TimeSerial(17, 0, 0) - ThoiGianTemp
Else
ThoiGianTemp = TimeSerial(11, 30, 0) - ThoiGianTemp
If Weekday(KetThuc) <> 7 Then ThoiGianTemp = ThoiGianTemp + TimeSerial(3, 30, 0)
End If
ret = ret - Hour(ThoiGianTemp) - Minute(ThoiGianTemp) / 60
GetTime = ret
End Function
Option Explicit
Public Function EndTime(NgayDau As Variant, SoGio As Double)
Dim NgayCuoi As Variant, iPhut As Double, Block As Long, SoPhut As Long
On Error Resume Next
Application.Volatile
SoPhut = Round(SoGio * 60, 0) 'xem lai neu 1h5' thi nhap so the nao'
If Not IsDate(NgayDau) Then Exit Function
'Xac dinh gio ngay dau co phai la 11h30 hay 17h hay 11h30 TB'
Select Case Weekday(NgayDau)
Case Weekday(NgayDau) = 1 'neu la CN'
Exit Function
Case Is <> 7 'Neu khac thu 7'
If Hour(NgayDau) = 11 And Minute(NgayDau) = 30 Then
NgayDau = DateAdd("n", 120, NgayDau)
ElseIf Hour(NgayDau) = 17 And Minute(NgayDau) = 0 Then
NgayDau = DateAdd("n", 14 * 60 + 30, NgayDau)
End If
Case Is = 7 'neu la th 7'
If Hour(NgayDau) = 11 And Minute(NgayDau) = 30 Then
NgayDau = DateAdd("n", 44 * 60, NgayDau)
End If
End Select
If SoPhut = 0 Then
EndTime = NgayCuoi
Exit Function
End If
Block = 1
iPhut = Block
Do While Not iPhut = SoPhut + Block
NgayCuoi = DateAdd("n", Block, NgayDau)
If Weekday(NgayDau) <> 7 And Hour(NgayCuoi) = 11 And Minute(NgayCuoi) = 30 Then
NgayDau = DateAdd("n", 120, NgayCuoi)
ElseIf Weekday(NgayDau) <> 7 And Hour(NgayCuoi) = 17 And Minute(NgayCuoi) = 0 Then
NgayDau = DateAdd("n", 14 * 60 + 30, NgayCuoi)
ElseIf Weekday(NgayDau) = 7 And Hour(NgayCuoi) = 11 And Minute(NgayCuoi) = 30 Then
NgayDau = DateAdd("n", 44 * 60, NgayCuoi)
Else
NgayDau = NgayCuoi
End If
iPhut = iPhut + Block
Loop
EndTime = NgayCuoi
End Function
Cảm ơn bác BNTT, test nhiều trường hợp mà quên mất trường hợp làm chẵn tuần và thời gian bắt đầu là 7h:30. Xin sửa lại code như sau các bác test tiếp xem còn lỗi nào không nhé.
Với cách của bác ThuNghi mà khi dữ liệu lớn hoặc nhiều thì không ổn về mặt tốc độ, vì bác dùng vòng For với step là 1 phút nên tốc độ sẽ bị phụ thuộc nhiều vào thời gian.
Còn đây là thuật toán của em, hơi dài nên xin được tóm tắt thế này mong các bác góp ý thêm.
- Đưa thời gian bắt đầu về 7:30(bắt đầu 1 ngày) bằng cách cộng thêm vào thời gian định mức 1 khoảng hợp lý. Ví dụ đang bắt đầu từ 8:30 ngày 5/1/2009 và định mức là 5 thì thay bằng bắt đầu từ 7:30 ngày 5/1/2009 và định mức là 5.5
- Từ bảng thời gian làm việc ban đầu ta thấy mỗi tuần làm 41.5 tiếng, vậy với định mức ban đầu ta tính xem phải làm bao nhiêu tuần, cộng luôn số ngày trong các tuần này vào ngày ban đầu, phần thời gian còn lại(còn lại chắc chắn chưa đến 1 tuần<41.5). Duyệt lần lượt các ngày tiếp theo, ngày thường thì thời gian còn lại trừ đi 7.5 là thời gian làm việc ngày thường, tương tự nếu là ngày thứ 7 thì trừ đi 4, chủ nhật thì trừ đi 0, đến khi nào thời gian còn lại không đủ cho 1 ngày làm việc thì đem thời gian đó cộng với ngày cuối cùng tìm được.
- Với giải thuật này có thể thực hiện hoàn toàn bằng công thức được, nhưng vẫn hơi phức tạp và sẽ phải tạo thêm cột phụ. Và với VBA thì số vòng lặp cũng không vượt quá 7 nên tốc độ sẽ hầu như không phụ thuộc vào thời gian định mức.
Function GetEndTime(BatDau, ThoiGian)
Dim SoTuan, SoNgay, ret, ThoiGianCon
Dim ThoiGianTemp
ThoiGianTemp = TimeSerial(Hour(BatDau), Minute(BatDau), 0)
If ThoiGianTemp > TimeSerial(13, 30, 0) Then
ThoiGianTemp = TimeSerial(4, 0, 0) + [COLOR=Red][B]TimeSerial(13, 30, 0) - ThoiGianTemp[/B][/COLOR]
Else
ThoiGianTemp = ThoiGianTemp - TimeSerial(7, 30, 0)
End If
ThoiGian = ThoiGian + Hour(ThoiGianTemp) + Minute(ThoiGianTemp) / 60
BatDau = DateSerial(Year(BatDau), Month(BatDau), Day(BatDau)) + TimeSerial(7, 30, 0)
SoTuan = ThoiGian \ 41.5
ThoiGianCon = ThoiGian - SoTuan * 41.5
ret = BatDau + SoTuan * 7
If ThoiGianCon > 0 Then
Do While (Weekday(ret) <> 7 And ThoiGianCon >= 7.5) Or (Weekday(ret) = 7 And ThoiGianCon >= 4)
ThoiGianCon = ThoiGianCon - 4
If Weekday(ret) < 7 Then ThoiGianCon = ThoiGianCon - 3.5
If ThoiGianCon = 0 Then Exit Do
ret = ret + 1
If Weekday(ret) = 1 Then ret = ret + 1
Loop
If ThoiGianCon = 0 Then
ret = ret + TimeSerial(4, 0, 0)
If Weekday(ret) <> 7 Then ret = ret + TimeSerial(5, 30, 0)
ElseIf ThoiGianCon > 4 Then
ThoiGianCon = ThoiGianCon - 4
ret = ret + TimeSerial(Int(ThoiGianCon), (ThoiGianCon - Int(ThoiGianCon)) * 60, 0) + TimeSerial(6, 0, 0)
Else
ret = ret + TimeSerial(Int(ThoiGianCon), (ThoiGianCon - Int(ThoiGianCon)) * 60, 0)
End If
End If
If True And TimeSerial(7, 30, 0) = TimeSerial(Hour(ret), Minute(ret), Second(ret)) Then
ret = (ret - 1) + TimeSerial(9, 30, 0)
If Weekday(ret) = 1 Then ret = (ret - 1) - TimeSerial(5, 30, 0)
End If
GetEndTime = ret
End Function
Cảm ơn cả sư nương nữa, đã bỏ công test lại dùm em và động viên em...Bài toán dạng này không phải là KHÓ, mà là CỰC KHÓ
Em mới thử trường hợp này thấy chưa đúng.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:3. Ngày kết thúc = ngày bắt đầu (quy về 7:30 sáng) + số ngày cộng thêmb.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
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.
Nếu này đầu là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.
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.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
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
If RestTime >= 41.5 then AddDays = 7 * (RestTime \ 41.5)
RestTime = RestTime Mod 41.5
AddDays = 7 * (RestTime \ 41.5)
RestTime = RestTime Mod 41.5
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.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.
Cũng phải từ từ chứ bạn, đừng hối!Kính mong các thầy cô cùng các anh chị giúp em
Chưa coi code, (bận quá), nhưng test vài cái thấy 1 chỗ không đúng. Xem file.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 .
Cám ơn thầy .Em test thấy đúng mà thầy.Em tính thế này :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
[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]
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ôngDạ 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.
Rất cám ơn bạn,file bạn mình test các kiểu rồi :làm rất đạt.Cám ơn bạn đã tham gia.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
BeginTime = (BeginDate - Int(BeginDate)) * 24
BeginTime = Hour(BeginDate) + Minute(BeginDate) / 60 + Second(BeginDate) / 3600
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 )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:
bằng câu:PHP:BeginTime = (BeginDate - Int(BeginDate)) * 24
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
[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]
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ạnXin 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.