Em đang mắc ở giờ ăn 1 và 2 không biết sai ở đâu, mọi người xem file đính kèm giúp em nhé. Em nghĩ do sai ở trường hợp giờ nào đấy số liệu nó khác biệt so với các giờ ăn còn lại.
P/s: Được rồi mọi người nhé, có một số ô nó không phải là dạng giờ.
Hình như công thức cũ: các trường hợp về sớm được tính là 9h ?!!! (vd: dòng 1362), trong khi thực tế làm 7h+1h được về sớm theo chế độ = 8h.
Chắc tính là 8h, như vậy mới đúng hả bạn!!
Hình như công thức cũ: các trường hợp về sớm được tính là 9h ?!!! (vd: dòng 1362), trong khi thực tế làm 7h+1h được về sớm theo chế độ = 8h.
Chắc tính là 8h, như vậy mới đúng hả bạn!!
Vậy bạn thử lần nữa công thức sau với nội dung điều kiện:
1. Nếu là Ca đêm ("D") và Ca 3 ("Z") thì Công ngày = 0
2. Nếu không là Ca ngày ("N") và Ca Hành chính ("H"); tức là "X & Y"; thì Công ngày được tính: lấy số Min khi so sánh giữa: "Tổng thời gian được tính" và 8.
3. Còn lại là "N" và "H": xét đến 3 trường hợp:
Giờ vào <=8h, giờ ra >=17h: tính đúng là 8 tiếng
Giờ vào >8h , giờ ra >=17h: lấy (17h - giờ vào) - Tgian ăn giữa ca + Giờ tính thêm
Còn lại (giờ vào bất kỳ; giờ ra <17h): Lấy Tổng thời gian - Tgian ăn giữa ca + Giờ tính thêm
Công thức tính công ngày tại cột AA9:
AA9=IF(AND(OR(F9="N",F9="H"),O9<=$Q$7,P9>=$AA$7),8,IF(AND(OR(F9="N",F9="H"),O9>$Q$7,P9>=$AA$7),($AA$7-O9)*24-T9+Y9,IF(AND(OR(F9="N",F9="H"),O9>=$Q$7,P9<$AA$7),Q9-T9+Y9,IF(OR(F9="D",F9="Z"),0,IF(AND(F9<>"D",F9<>"Z",Z9>=8),8,Z9)))))
+Nếu là ca N hoặc H và (O9<=$Q$7,P9>=$AA$7) thì bằng 8
+Nếu là ca N hoặc H và (O9>$Q$7,P9>=$AA$7) thì bằng ($AA$7-O9)*24-T9+Y9
+Nếu là ca N hoặc H và (O9>=$Q$7,P9<$AA$7) thì bằng Q9-T9+Y9
+Nếu là ca D hoặc Z thì bằng 0
+Nếu khác D hoặc Z và Z9>=8 thì bằng 8
+Các trường hợp còn lại bằng Z9
Em code thành như sau:
PHP:
'Cong ngay'
Arr() = [F9].Resize(Rws, 21).Value
ReDim dArr(1 To Rws, 1 To 1)
For J = 1 To UBound(Arr())
If Arr(J, 1) = "H" Or Arr(J, 1) = "N" Then
If Arr(J, 10) <= [Q7] And Arr(J, 11) >= [AA7] Then
dArr(J, 1) = 8
If Arr(J, 10) > [Q7] And Arr(J, 11) >= [AA7] Then
dArr(J, 1) = ([AA7] - Arr(J, 10)) * 24 - Arr(J, 15) + Arr(J, 20)
If Arr(J, 10) >= [Q7] And Arr(J, 11) < [AA7] Then
dArr(J, 1) = Arr(J, 12) - Arr(J, 15) + Arr(J, 20)
End If
If Arr(J, 1) = "D" Or Arr(J, 1) = "Z" Then
dArr(J, 1) = 0
If Arr(J, 1) <> "D" Or Arr(J, 1) <> "Z" And Arr(J, 21) >= 8 Then
dArr(J, 1) = 8
Else
dArr(J, 1) = Arr(J, 21)
End If
Next J
[AA9].Resize(Rws).Value = dArr()
Công thức tính công ngày:
=IF(AND(OR(F9="N",F9="H"),O9<=$Q$7,P9>=$AA$7),8,IF(AND(OR(F9="N",F9="H"),O9>$Q$7,P9>=$AA$7),($AA$7-O9)*24-T9+Y9,IF(AND(OR(F9="N",F9="H"),O9>=$Q$7,P9<$AA$7),Q9-T9+Y9,IF(OR(F9="D",F9="Z"),0,IF(AND(F9<>"D",F9<>"Z",Z9>=8),8,Z9)))))
Em code thành như sau:
PHP:
'Cong ngay'
Arr() = [F9].Resize(Rws, 21).Value
ReDim dArr(1 To Rws, 1 To 1)
For J = 1 To UBound(Arr())
If Arr(J, 1) = "H" Or Arr(J, 1) = "N" Then
If Arr(J, 10) <= [Q7] And Arr(J, 11) >= [AA7] Then
dArr(J, 1) = 8
If Arr(J, 10) > [Q7] And Arr(J, 11) >= [AA7] Then
dArr(J, 1) = ([AA7] - Arr(J, 10)) * 24 - Arr(J, 15) + Arr(J, 20)
If Arr(J, 10) >= [Q7] And Arr(J, 11) < [AA7] Then
dArr(J, 1) = Arr(J, 12) - Arr(J, 15) + Arr(J, 20)
End If
If Arr(J, 1) = "D" Or Arr(J, 1) = "Z" Then
dArr(J, 1) = 0
If Arr(J, 1) <> "D" Or Arr(J, 1) <> "Z" And Arr(J, 21) >= 8 Then
dArr(J, 1) = 8
Else
dArr(J, 1) = Arr(J, 21)
End If
Next J
[AA9].Resize(Rws).Value = dArr()
nhìn các công thức của bạn choáng cả người, khó có thể chuyển thành code được
bạn diễn giải bằng lời thật rỏ ràng, mỗi mệnh đề "nếu" ghi đủ điều kiện và trên 1 dòng, lúc đó mới có hy vọng chuyển thành code
Sub tam1()
Dim Arr(), dArr(), Rws As Long, J As Long
[COLOR=#ff0000] Rws = [b65500].End(xlUp).Row[/COLOR]
[COLOR=#ff0000] 'Cong ngay'[/COLOR]
[COLOR=#ff0000] Arr() = Range("B9:B" & Rws).Resize(, 21).Value[/COLOR]
ReDim dArr(1 To Rws, 1 To 1)
For J = 1 To UBound(Arr())
If Arr(J, 1) = "H" Or Arr(J, 1) = "N" Then
If Arr(J, 11) >= [AA7] Then
dArr(J, 1) = IIf(Arr(J, 10) <= [Q7], 8, ([AA7] - Arr(J, 10)) * 24 - Arr(J, 15) + Arr(J, 20))
Else
If dArr(J, 10) >= [Q7] Then dArr(J, 1) = Arr(J, 12) - Arr(J, 15) + Arr(J, 20)
End If
End If
If Arr(J, 1) = "D" Or Arr(J, 1) = "Z" Then
dArr(J, 1) = 0
ElseIf Arr(J, 21) >= 8 Then
dArr(J, 1) = 8
Else
dArr(J, 1) = Arr(J, 21)
End If
Next J
[AA9].Resize(Rws).Value = dArr()
End Sub
bạn không thể sửa thành
Rws = [b9].CurrentRegion.Rows.Count - 8
dư 8 dòng là do các số 0 ở các dòng cuối cột O, nếu xóa các ô nầy thì lại mất 8 dòng
Không bạn ạ vì nó có 3 loại OVT và căn cứ vào ca, vào giờ để xem nó là OVT N hay Đ1 hay Đ2. Mình nghĩ Rws = [b9].CurrentRegion.Rows.Count - 8 là ok vì mảng này bao gồm cả từ A1 cho nên từ A1 đến A8 là thừa nên mình trừ 8.
Không bạn ạ vì nó có 3 loại OVT và căn cứ vào ca, vào giờ để xem nó là OVT N hay Đ1 hay Đ2. Mình nghĩ Rws = [b9].CurrentRegion.Rows.Count - 8 là ok vì mảng này bao gồm cả từ A1 cho nên từ A1 đến A8 là thừa nên mình trừ 8.
ừ nhỉ nó lại không chịu chạy, chắc nó buồn rồi, đổi mới một chút hy vọng nó vui
Mã:
Sub tam1()
Dim Arr(), dArr(), Rws As Long, J As Long
Rws = [b65500].End(xlUp).Row
'Cong ngay'
Arr() = Range("F9:F" & Rws).Resize(, 21).Value
ReDim dArr(1 To Rws, 1 To 1)
For J = 1 To UBound(Arr())
If Arr(J, 1) = "H" Or Arr(J, 1) = "N" Then
If Arr(J, 11) >= [AA7] Then
dArr(J, 1) = IIf(Arr(J, 10) <= [Q7], 8, ([AA7] - Arr(J, 10)) * 24 - Arr(J, 15) + Arr(J, 20))
Else
If dArr(J, 10) >= [Q7] Then dArr(J, 1) = Arr(J, 12) - Arr(J, 15) + Arr(J, 20)
End If
End If
If Arr(J, 1) = "D" Or Arr(J, 1) = "Z" Then
dArr(J, 1) = 0
ElseIf Arr(J, 21) >= 8 Then
dArr(J, 1) = 8
Else
dArr(J, 1) = Arr(J, 21)
End If
Next J
[AA9].Resize(Rws).Value = dArr()
End Sub