Hỏi về file tính tương (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

Thử đoạn sau xem:
Mã:
If "a" > "b" Then MsgBox "Chít liên!"

Đúng là chít liền :D. Cảm ơn Befaint!

Cái công thức này sao mình cảm thấy nó kỳ quoặc thế nào ấ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(OR(F9="X",F9="N",F9="H",F9="Y"),Z9>=8),8,IF(AND(OR(F9="N",F9="H"),O9>=$Q$7,P9<$AA$7,K9="ve som",Z9>=8),8,Z9))))))
 
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ờ.
 
Lần chỉnh sửa cuối:
Đúng là chít liền :D. Cảm ơn Befaint!

Cái công thức này sao mình cảm thấy nó kỳ quoặc thế nào ấy
Vậy bạn thử công thức này xem sao (hên xui nha, vì chỉ làm rút gọn công thức mà không xét các trường hợp tính giờ vì không biết mô tê gì hết /-*+//-*+//-*+/):

Mã:
AA9=IF(OR(F9={"D","Z"}),0,IF(OR(F9<>{"N","H"}),IF(Z9>=8,8,Z9),IF((O9<=$Q$7)*(P9>=$AA$7),8,IF((O9>$Q$7),IF((P9>=$AA$7),($AA$7-O9)*24-T9+Y9,Q9-T9+Y9),0))))

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!!

Chúc bạn ngày vui.
 
Lần chỉnh sửa cuối:
Vậy bạn thử công thức này xem sao (hên xui nha, vì chỉ làm rút gọn công thức mà không xét các trường hợp tính giờ vì không biết mô tê gì hết /-*+//-*+//-*+/):

Mã:
AA9=IF(OR(F9={"D","Z"}),0,IF(OR(F9<>{"N","H"}),IF(Z9>=8,8,Z9),IF((O9<=$Q$7)*(P9>=$AA$7),8,IF((O9>$Q$7),IF((P9>=$AA$7),($AA$7-O9)*24-T9+Y9,Q9-T9+Y9),0))))

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!!

Chúc bạn ngày vui.

Cảm ơn bạn nhé, để mình test xem sao. Bạn nói đúng rồi đấy nhưng vì code tính giờ ăn đang kẹt nên nó chưa trừ đi 1h giờ ăn.
 
....................

Nhân tiện bạn HieuCD xem qua các hàm này giúp mình nhé:
.......................................

Hàm 2:
=IF(AND(OR(F9="D",F9="Z"),SUM(Z9-AC9-AD9-AE9)>8),8,IF(AND(OR(F9="D",F9="Z"),SUM(Z9-AC9-AD9-AE9)<=8),SUM(Z9-AC9-AD9-AE9),0))

....................
Làm gọn công thức cho bạn:

Mã:
AB9=IF(AND(F9<>{"D","Z"}),0,MIN(Z9-AC9-AD9-AE9,8))

Chúc bạn ngày vui.
p/s: do rảnh được 1 lúc buổi trưa góp vui với anh em bằng việc rút gọn công thức cho chủ thớt. Chúc anh em ngày vui. bái bai! --=0/-*+//-*+//-*+/
 
Vậy bạn thử công thức này xem sao (hên xui nha, vì chỉ làm rút gọn công thức mà không xét các trường hợp tính giờ vì không biết mô tê gì hết /-*+//-*+//-*+/):

Mã:
AA9=IF(OR(F9={"D","Z"}),0,IF(OR(F9<>{"N","H"}),IF(Z9>=8,8,Z9),IF((O9<=$Q$7)*(P9>=$AA$7),8,IF((O9>$Q$7),IF((P9>=$AA$7),($AA$7-O9)*24-T9+Y9,Q9-T9+Y9),0))))

....

Công thức này sai với trường hợp ID 10024 bạn ạ.
 
Công thức này sai với trường hợp ID 10024 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

Mã:
AA9=IF(OR(F9={"D","Z"}),0,IF(AND(F9<>{"N","H"}),MIN(Z9,8),IF((O9<=$Q$7)*(P9>=$AA$7),8,IF((P9>=$AA$7),($AA$7-O9)*24,Q9)-T9+Y9)))

Ngoài ra bạn phải chỉnh lại công thức tính Tgian ăn giữa ca thì các công thức khác mới chính xác.

Chúc bạn ngày vui. /-*+//-*+//-*+/
 
Anh chị ơi em mắc:

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()

Nó báo lỗi Next without for.

Mọi người thông giúp em với **~**
 
Lần chỉnh sửa cuối:
Anh chị ơi em mắc:

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()

Nó báo lỗi Next without for.

Mọi người thông giúp em với **~**
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
 
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...

Đã diễn giải, HieuCD xem dùm nhé.

P/s: Dạo này anh ChanhTQ bận gì ạ, công thức của anh em sửa như vầy không biết có vấn đề gì không anh nhỉ:

Ví dụ Rws = [b9].CurrentRegion.Rows.Count em sửa thành Rws = [b9].CurrentRegion.Rows.Count - 8 để nó không bị thừa mảng nữa làm vậy có đúng không anh.
 
Đã diễn giải, HieuCD xem dùm nhé.

P/s: Dạo này anh ChanhTQ bận gì ạ, công thức của anh em sửa như vầy không biết có vấn đề gì không anh nhỉ:

Ví dụ Rws = [b9].CurrentRegion.Rows.Count em sửa thành Rws = [b9].CurrentRegion.Rows.Count - 8 để nó không bị thừa mảng nữa làm vậy có đúng không anh.
bạn chạy thử code sau
Mã:
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
 
ô AC9=Z9-AA9
có được không?
 
ô AC9=Z9-AA9
có được khô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.
nếu theo code trước thì trừ 8 cũng được
 
Ừm nhưng code trên của bạn không chạy, mình có up lại file đang làm dang dở ở bài #1.
 
Ừm nhưng code trên của bạn không chạy, mình có up lại file đang làm dang dở ở bài #1.
ừ 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
 
Vẫn không được HieuCD ạ.

Em đã up lại file ở bài #1 mọi người xem giúp em xem là lỗi ở đâu nhé. Em cảm ơn!
 
Mọi người ơi được rồi nhé, hóa ra ở trên bao nhiêu if mà chưa có end if thì cuối code phải có bấy nhiêu End if. Haiz, đúng là trẻ em mới tập nói :D
 
Web KT

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

Back
Top Bottom