Giúp hoàn thiện bảng BCC (1 người xem)

Liên hệ QC

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

tueyennhi

Thành viên tích cực
Tham gia
18/10/10
Bài viết
1,192
Được thích
105
Chào anh chị!

Em gửi lên diễn đàn bản chấm công em đang xây dựng theo sự hướng dẫn của rất nhiều anh chị em trên này (nhưng chưa hoàn thiện hết). Hiện tại BCC còn sử dụng cả công thức nên chậm. Mong anh chị đưa ra phương án xử lý cải thiện BCC này tốt hơn. (theo hướng VBA cũng được hoặc dùng hàm nào đó tối ưu hơn cũng được).
Để tổng hợp công từ tất cả các sheet khác bấm vào biểu tượng bàn tay.

Hiện tại các công thức em đang sử dụng trong sheet BCC như sau:
+ Thử việc ngày: =+SUMIFS(K8:ED8,$K$6:$ED$6,"<="&G8,$K$7:$ED$7,"WD")
Căn cứ vào thời gian hết HĐ thử việc ở cột ED ta sẽ tính tổng các cột có tiêu đề là WD

+ Thử việc đêm: =SUMPRODUCT(($K$6:$ED$6<=G8)*IFERROR(IF(K8:ED8="D",1,--SUBSTITUTE($K$8:$ED$8,"D","")),0)*($K$7:$ED$7="WD")*ISTEXT(K8:ED8))
Căn cứ vào thời gian hết HĐ thử việc ở cột ED ta sẽ tính tổng các giá trị D (có thể là 0.1D hoặc 0.5D hoặc D) ở các cột có tiêu đề là WD.

Tương tự với Công ngày chính thức và công đêm chính thức căn cứ vào thời gian hết thử việc.

+Đối với các cột nghỉ từ EK đến EV và:
Ví dụ nghỉ Holiday: =+COUNTIFS($K8:$ED8,"LT",$K$7:$ED$7,"WD")+SUMIF(N!$I$5:$I$1000,BCC!$B8,N!$N$5:$N$1000)
Đếm các ô có ký hiệu LT ở các cột có tiêu đề WD + tổng có điều kiện trong sheet N
Các ngày nghỉ khác tương tự.

+ Tính Day OVT và Night OVT:
+) OVT ngày thường =+SUMIFS($K8:$ED8,$K$7:$ED$7,"ON",$K$5:$ED$5,"<>1",$K$5:$ED$5,"<>LT")
Tính tổng từ K8 đến ED8 đối với các cột có tiêu đề ON và xét $K$5:$ED$5 giá trị khác 1 (loại bỏ ON ngày chủ nhật) và xét $K$5:$ED$5 giá trị khác LT (loại bỏ ON ngày lễ tết)

Tương tự với các OVT khác.

Công việc khá là rối răm phức tạp em mong anh chị giúp đỡ.

Em cảm ơn ạ!
 

File đính kèm

Sao bảng chấm công lại "rối rắm phức tạp" (ý chủ thớt) thế. Mà lại quản lý đông nữa , khoảng 2000 người.
Tất nhiên đông không quan trọng.

Quan trọng là bạn chỉ rõ đầu vào gồm những nội dung nào, có các đặc điểm gì, ghi trên sheet và vùng nào...
Sau đó các bước xử lý tiếp là gì: yêu cầu kết quả có bao nhiêu giá trị, ghi trên vùng nào, sheet nào... Quá trình tính toán có dựa vào đặc điểm nào chưa có của dữ liệu thì bổ sung.

Cuối cùng chuẩn bị khoảng 10 (hoặc 20 nếu cần) dòng dữ liệu có những sự phân biệt nào đó và có kết quả tính bằng tay. Nếu dữ liệu có trên nhiều sheets thì chuẩn bị 2 - 4 sheet, mỗi sheet có 10 - 20 dong.
 
Upvote 0
Nếu là mình thì 1 người 1 ngày có 4 dòng để chấm các loại công thay vì 4 cột như hiện nay.

& nên lập BCC theo từng đơn vị/bộ phận như trong thực tế thường diễn ra.
 
Upvote 0
Sao bảng chấm công lại "rối rắm phức tạp" (ý chủ thớt) thế. Mà lại quản lý đông nữa , khoảng 2000 người.
Tất nhiên đông không quan trọng.

Quan trọng là bạn chỉ rõ đầu vào gồm những nội dung nào, có các đặc điểm gì, ghi trên sheet và vùng nào...
Sau đó các bước xử lý tiếp là gì: yêu cầu kết quả có bao nhiêu giá trị, ghi trên vùng nào, sheet nào... Quá trình tính toán có dựa vào đặc điểm nào chưa có của dữ liệu thì bổ sung.

Cuối cùng chuẩn bị khoảng 10 (hoặc 20 nếu cần) dòng dữ liệu có những sự phân biệt nào đó và có kết quả tính bằng tay. Nếu dữ liệu có trên nhiều sheets thì chuẩn bị 2 - 4 sheet, mỗi sheet có 10 - 20 dong.


Ngoài các sheet không phải là sheet chấm công còn lại phát sinh sheet số lượng bao nhiêu thì căn cứ vào chu kỳ lương (từ 26 tháng trước đến 25 tháng sau), và mỗi ngày công có tên là ngày như mình đã cho ví dụ minh họa. Tổng hợp dữ liệu thì ngày trước anh Bate có giúp mình sao cho tập hợp công của tất cả các sheet ngày cho vào đúng loại công và ngày công trong BCC. Tương tự sheet N, ai nghỉ ngày nào nghỉ lý do gì thì cũng update hết vào BCC.

Về tốc độ và độ chính xác chuẩn chỉ chưa phát hiện sai sót nào nên mình thấy như vậy là hài lòng. Còn mảng sau về tập hợp số liệu thì hiện tại đang dùng công thức mình muốn chỉnh về VBA hoặc làm công thức tối giản hơn vì thực tế công ty mình có khoảng hơn 4000 người cho nên dùng công thức rất chậm và quan trọng nhiều khi đang làm thì đơ tự tắt file, mất dữ liệu...
 
Upvote 0
Nếu là mình thì 1 người 1 ngày có 4 dòng để chấm các loại công thay vì 4 cột như hiện nay.

& nên lập BCC theo từng đơn vị/bộ phận như trong thực tế thường diễn ra.

Mình là người tổng hợp công của tất cả các bộ phận, hàng tháng các bộ phận gửi BCC còn mình là người đối chiếu kết quả sau cùng.
Như bạn nói và theo ý hiểu của mình thì thay vì chia làm nhiều cột ta sẽ đẩy sang thành nhiều dòng. Mình thấy cái này cũng có cái hay nhưng số dòng sẽ tăng lên rất nhiều lần. Code VBA theo cách này thì chắc dễ thở hơn bạn nhỉ?
 
Lần chỉnh sửa cuối:
Upvote 0
Dễ thở do dễ định vị ngày (khỏi Offset() này nọ)
& với ~ 4 ngàn nhân viên thì quên công thức đi là vừa!
Bạn có thể tách theo bộ phận bỡi vài dòng trắng trong BCC.
 
Upvote 0
Dễ thở do dễ định vị ngày (khỏi Offset() này nọ)
& với ~ 4 ngàn nhân viên thì quên công thức đi là vừa!
Bạn có thể tách theo bộ phận bỡi vài dòng trắng trong BCC.

Có thể xây dựng BCC theo hướng đi của bạn giúp mình được không? Các module trong file của mình toàn mọi người xây dựng giúp cho vì mình chưa có khả năng, mình chỉ dựa vào đó để tùy biến thêm thôi.
 
Upvote 0
Mình nghỉ rằng do diễn đàn này nhiệt tình quá mức nên đã hại bạn rồi;

Theo mình thì đầu tiên phải xây dựng cấu trúc các trang CSDL chuẩn;
Sau đó mới bỏ dữ liệu vô
& cuối cùng mới trích xuất dữ liệu thành các báo cáo theo yêu cầu.

Theo IZO thì mình cho rằng bạn phải mô tả công việc của bạn lại từ đầu.
Chỉ sau khi rõ "mô tả công việc", những người rành về CSDL trên diễn đàn sẽ giúp bạn thiết kế CSDL tương đối khả dĩ.
Sau đó sẽ là chu trình nhập liệu
. . . . . .
Thao tác vận hành thử để ra các báo biểu . . . .
 
Upvote 0
Mình nghỉ rằng do diễn đàn này nhiệt tình quá mức nên đã hại bạn rồi;

Theo mình thì đầu tiên phải xây dựng cấu trúc các trang CSDL chuẩn;
Sau đó mới bỏ dữ liệu vô
& cuối cùng mới trích xuất dữ liệu thành các báo cáo theo yêu cầu.

Theo IZO thì mình cho rằng bạn phải mô tả công việc của bạn lại từ đầu.
Chỉ sau khi rõ "mô tả công việc", những người rành về CSDL trên diễn đàn sẽ giúp bạn thiết kế CSDL tương đối khả dĩ.
Sau đó sẽ là chu trình nhập liệu
. . . . . .
Thao tác vận hành thử để ra các báo biểu . . . .

:) bạn nói quá rồi, nhờ sự nhiệt tình đó mình học hỏi được nhiều điều, mình có thể hiểu một phần code của người viết. Còn bài toán mình đưa ra hôm nay hoàn toàn mới nó quá sức đối với mình.

Công việc thì không có gì cả hiện tại Code của anh Bate dùng để tập hợp dữ liệu từ sheet công và sheet N rất tốt, chạy rất nhanh và chính xác. Ban đầu đối với mình như thế là quá ổn vì phần sau của BCC (tập hợp chi tiết tổng số công, OVT, Nghỉ) mình muốn dùng công thức do các xếp yêu cầu. Tuy nhiên hiện tại công nhân viên tăng lên quá đông và nhanh nên cách dùng công thức không còn phù hợp nữa. Mong mọi người đưa ra lời khuyên giúp mình!
 
Upvote 0
Các trang tính là do bạn nghỉ ra; Chúng chưa chắc đã là tốt nhất;

Mọi người hồ hỡi giúp bạn do nhiệt tình; nhưng chắc gì đó là tối ưu?!

Nói chuyện này với bạn là mình muốn nêu vấn đề: Những gì mình/bạn nghỉ ra chưa chắc là hay hơn & có cách khác hay hơn!
 
Upvote 0
Thử liên hệ lại với anh Bate xem có thể giúp được kg. Dạo này anh ấy viết code cũng hay lắm.
 
Upvote 0
:) bạn nói quá rồi, nhờ sự nhiệt tình đó mình học hỏi được nhiều điều, mình có thể hiểu một phần code của người viết. Còn bài toán mình đưa ra hôm nay hoàn toàn mới nó quá sức đối với mình.

Công việc thì không có gì cả hiện tại Code của anh Bate dùng để tập hợp dữ liệu từ sheet công và sheet N rất tốt, chạy rất nhanh và chính xác. Ban đầu đối với mình như thế là quá ổn vì phần sau của BCC (tập hợp chi tiết tổng số công, OVT, Nghỉ) mình muốn dùng công thức do các xếp yêu cầu. Tuy nhiên hiện tại công nhân viên tăng lên quá đông và nhanh nên cách dùng công thức không còn phù hợp nữa. Mong mọi người đưa ra lời khuyên giúp mình!
Tôi chỉ "trợn mắt" nhìn công thức của bạn rồi viết lại trong VBA thôi nhé, đúng, sai bạn phải tự kiểm tra lại.
 

File đính kèm

Upvote 0
Trong file bài #1 bạn gởi lên, tại trang 'BCC' có 2 cột [B ] & [J] đều chứa cùng dữ liệu ID; Điều này thể hiện sự thừa thải & lãng phí!
 
Upvote 0
Trong file bài #1 bạn gởi lên, tại trang 'BCC' có 2 cột [B ] & [J] đều chứa cùng dữ liệu ID; Điều này thể hiện sự thừa thải & lãng phí!
Tôi chỉ "trợn mắt" nhìn công thức của bạn rồi viết lại trong VBA thôi nhé, đúng, sai bạn phải tự kiểm tra lại.

Tuyệt vời, đúng như ý em, lại học được thêm được một số thứ rồi. Cảm ơn anh nhé. Nhân thể cho em hỏi thêm:
Cái này viết dưới dạng Function có cải thiện được tốc độ không ạ?

PHP:
Arr() = [F9].Resize(Rws, 8).Value
 ReDim dArr(1 To Rws, 1 To 3)
 ReDim tArr(1 To Rws, 1 To 3)
    For J = 1 To UBound(Arr())
    dArr(J, 1) = 0
    dArr(J, 2) = 0
        Sht = Arr(J, 1)
        Vao = Arr(J, 3)
        Ra = Arr(J, 4)
      
    If Arr(J, 6) <> "" Then
        If Arr(J, 7) <> "" Then
            If Arr(J, 8) <> "" Then
                dArr(J, 1) = Arr(J, 6)
                dArr(J, 2) = Arr(J, 7)
            End If
        End If
    Else
        If Abs(Arr(J, 4) - Arr(J, 3)) >= T8 Then
            Select Case Sht
            'Tu 8h den 17h
            Case "H"
                If Arr(J, 3) > T6 Then
                    If Arr(J, 3) <= T8 Then
                        If Arr(J, 4) < T18 Then
                            If Arr(J, 4) >= T17 Then
                                dArr(J, 1) = T8
                                dArr(J, 2) = T17
                            End If
                        End If
                    End If
                End If
            'Tu 8h den 20h
            Case "N"
                If Arr(J, 3) > T6 Then
                    If Arr(J, 3) <= T8 Then
                        If Arr(J, 4) < T21 Then
                            If Arr(J, 4) >= T20 Then
                                dArr(J, 1) = T8
                                dArr(J, 2) = T20
                            End If
                        End If
                    End If
                End If
            'Tu 20h den 8h
            Case "D"
                If Arr(J, 3) > T18 Then
                    If Arr(J, 3) <= T20 Then
                        If Arr(J, 4) < T09 Then
                            If Arr(J, 4) >= T8 Then
                                dArr(J, 1) = T20
                                dArr(J, 2) = T32
                            End If
                        End If
                    End If
                End If
            'Tu 6h den 14h
            Case "X"
                If Arr(J, 3) <= T6 Then
                    If Arr(J, 4) < T15 Then
                        If Arr(J, 4) >= T14 Then
                            dArr(J, 1) = T6
                            dArr(J, 2) = T14
                        End If
                    End If
                End If
            'Tu 14 den 22h
            Case "Y"
                If Arr(J, 3) > T10 Then
                    If Arr(J, 3) <= T14 Then
                        If Arr(J, 4) < T23 Then
                            If Arr(J, 4) >= T22 Then
                                dArr(J, 1) = T14
                                dArr(J, 2) = T22
                            End If
                        End If
                    End If
                End If
            'Tu 22h den 6h
            Case "Z"
                If Arr(J, 3) > T20 Then
                    If Arr(J, 3) <= T22 Then
                        If Arr(J, 4) < T7 Then
                            If Arr(J, 4) >= T6 Then
                                dArr(J, 1) = T22
                                dArr(J, 2) = T30
                            End If
                        End If
                    End If
                End If
            End Select
        End If
    End If
        dArr(J, 3) = Round((dArr(J, 2) - dArr(J, 1)) * 24, 2)

Code này trong module CPU em viết thêm vào mà chạy quay quay chứ không được mau lẹ như của anh :(
 
Upvote 0
Nhân thể cho em hỏi thêm:
Cái này viết dưới dạng Function có cải thiện được tốc độ không ạ?

PHP:
Arr() = [F9].Resize(Rws, 8).Value
 ReDim dArr(1 To Rws, 1 To 3)
 ReDim tArr(1 To Rws, 1 To 3)
    For J = 1 To UBound(Arr())
    dArr(J, 1) = 0
    dArr(J, 2) = 0
        Sht = Arr(J, 1)
        Vao = Arr(J, 3)
        Ra = Arr(J, 4)
 
    If Arr(J, 6) <> "" Then
        If Arr(J, 7) <> "" Then
            If Arr(J, 8) <> "" Then
                dArr(J, 1) = Arr(J, 6)
                dArr(J, 2) = Arr(J, 7)
            End If
        End If
    Else
        If Abs(Arr(J, 4) - Arr(J, 3)) >= T8 Then
            Select Case Sht
            'Tu 8h den 17h
            Case "H"
                If Arr(J, 3) > T6 Then
                    If Arr(J, 3) <= T8 Then
                        If Arr(J, 4) < T18 Then
                            If Arr(J, 4) >= T17 Then
                                dArr(J, 1) = T8
                                dArr(J, 2) = T17
                            End If
                        End If
                    End If
                End If
            'Tu 8h den 20h
            Case "N"
                If Arr(J, 3) > T6 Then
                    If Arr(J, 3) <= T8 Then
                        If Arr(J, 4) < T21 Then
                            If Arr(J, 4) >= T20 Then
                                dArr(J, 1) = T8
                                dArr(J, 2) = T20
                            End If
                        End If
                    End If
                End If
            'Tu 20h den 8h
            Case "D"
                If Arr(J, 3) > T18 Then
                    If Arr(J, 3) <= T20 Then
                        If Arr(J, 4) < T09 Then
                            If Arr(J, 4) >= T8 Then
                                dArr(J, 1) = T20
                                dArr(J, 2) = T32
                            End If
                        End If
                    End If
                End If
            'Tu 6h den 14h
            Case "X"
                If Arr(J, 3) <= T6 Then
                    If Arr(J, 4) < T15 Then
                        If Arr(J, 4) >= T14 Then
                            dArr(J, 1) = T6
                            dArr(J, 2) = T14
                        End If
                    End If
                End If
            'Tu 14 den 22h
            Case "Y"
                If Arr(J, 3) > T10 Then
                    If Arr(J, 3) <= T14 Then
                        If Arr(J, 4) < T23 Then
                            If Arr(J, 4) >= T22 Then
                                dArr(J, 1) = T14
                                dArr(J, 2) = T22
                            End If
                        End If
                    End If
                End If
            'Tu 22h den 6h
            Case "Z"
                If Arr(J, 3) > T20 Then
                    If Arr(J, 3) <= T22 Then
                        If Arr(J, 4) < T7 Then
                            If Arr(J, 4) >= T6 Then
                                dArr(J, 1) = T22
                                dArr(J, 2) = T30
                            End If
                        End If
                    End If
                End If
            End Select
        End If
    End If
        dArr(J, 3) = Round((dArr(J, 2) - dArr(J, 1)) * 24, 2)

Code này trong module CPU em viết thêm vào mà chạy quay quay chứ không được mau lẹ như của anh :(
Bạn "quăng bài" lên, 3 ngày sau mới "ý kiến",, vậy 3 ngày sau tôi mới trả lời cho bạn nhé.(9/6)
Híc!
 
Lần chỉnh sửa cuối:
Upvote 0
Anh Ba tê ơi chờ lâu phết nhỉ. Mà không phải 3 ngày đâu mà 1.5 ngày thôi, em thấy anh trích dẫn nhưng không thấy nói gì nên em chờ đấy chứ...
 
Upvote 0
Cái này viết dưới dạng Function có cải thiện được tốc độ không ạ?
Hổng biết "cái này" là "cái gì".
Nếu là Sub tôi vừa viết mà viết thành Function, tốc độ "tồi tệ" thêm vì sẽ giống như công thức mảng.
Anh Ba tê ơi chờ lâu phết nhỉ. Mà không phải 3 ngày đâu mà 1.5 ngày thôi, em thấy anh trích dẫn nhưng không thấy nói gì nên em chờ đấy chứ...
Híc! Chưa đến 9/6.
 
Lần chỉnh sửa cuối:
Upvote 0
Hổng biết "cái này" là "cái gì".
Nếu là Sub tôi vừa viết mà viết thành Function, tốc độ "tồi tệ" thêm vì sẽ giống như công thức mảng.

Híc! Chưa đến 9/6.

Em thấy giống Lưu Bị và Khổng Minh quá :).
- Code trên của em dựa trên cột F (ca làm) cột H và I (giờ ra vào theo hệ thống); cột K và L (giờ ra vào tự chấm tay).
- Dựa vào 5 cột trên nếu K và L có dữ liệu thì ưu tiên lấy dữ liệu ở đây gán vào O và P ---> Tính ra thời gian làm việc ở cột Q
- Còn nếu cột K và L không có thì ta xét dữ liệu ở cột H và I.

Em có 6 ca làm như sau:

+ Ca H: Từ 08h đến 17h (Ca hành chính)
+ Ca N: Từ 08h đến 20h (Ca ngày)
+ Ca D: Từ 20h đến 08h (Ca đêm)
+ Ca X: Từ 06h đến 14h (Ca 1)
+ Ca Y: Từ 14h đến 22h (Ca 2)
+ Ca Z: Từ 22h đến 06h (Ca 3)

Căn cứ khung giờ trên nếu nằm trong điều kiện cho phép ở ca nào thì gán giờ ra vào ở ca đó.
 
Lần chỉnh sửa cuối:
Upvote 0
Em thấy giống Lưu Bị và Khổng Minh quá :).
- Code trên của em dựa trên cột F (ca làm) cột H và I (giờ ra vào theo hệ thống); cột K và L (giờ ra vào tự chấm tay).
- Dựa vào 5 cột trên nếu K và L có dữ liệu thì ưu tiên lấy dữ liệu ở đây gán vào O và P ---> Tính ra thời gian làm việc ở cột Q
- Còn nếu cột K và L không có thì ta xét dữ liệu ở cột H và I.

Em có 6 ca làm như sau:

+ Ca H: Từ 08h đến 17h (Ca hành chính)
+ Ca N: Từ 08h đến 20h (Ca ngày)
+ Ca D: Từ 20h đến 08h (Ca đêm)
+ Ca X: Từ 06h đến 14h (Ca 1)
+ Ca Y: Từ 14h đến 22h (Ca 2)
+ Ca Z: Từ 22h đến 06h (Ca 3)

Căn cứ khung giờ trên nếu nằm trong điều kiện cho phép ở ca nào thì gán giờ ra vào ở ca đó.

Đúng là "....", chẳng biết bạn nói cái gì, code nào của sheet nào, hình như chuyện của bạn chỉ mình bạn hiểu.
Kính mời chân sự xuống núi...!!! :rolleyes:;):D

Code bài #14 không đầu không đuôi, chẳng biết viết cho việc gì, sheet nào. "Má tui" cũng "điếc".
Đúng 9/6 rồi nhé. Xong Topic này.
 
Upvote 0
Đúng là "....", chẳng biết bạn nói cái gì, code nào của sheet nào, hình như chuyện của bạn chỉ mình bạn hiểu.


Code bài #14 không đầu không đuôi, chẳng biết viết cho việc gì, sheet nào. "Má tui" cũng "điếc".
Đúng 9/6 rồi nhé. Xong Topic này.

@@ đúng là em hay nói vắn tắt không rõ ràng. Code em có nói là ở module tên là CPU dùng để chấm giờ ra vào của các ngày công ấy anh.

*Note: Hôm qua F5 cả sáng mà không thấy anh nên em nghĩ anh bận, chiều em cũng bận nhiều việc nên sáng nay em mới check :(
 
Upvote 0
Tại sao file của em càng chạy thì thời gian thực thi VBA càng lâu? Phải chăng do có cái gì đó không được giải phóng? Đóng file mở lại lại chạy nhanh gấp 3 lần.
 
Upvote 0
Tại sao file của em càng chạy thì thời gian thực thi VBA càng lâu? Phải chăng do có cái gì đó không được giải phóng? Đóng file mở lại lại chạy nhanh gấp 3 lần.
Bạn vẫn thích nói cho bạn hiểu.
"file của em càng chạy thì thời gian thực thi VBA càng lâu" nghĩa là code nào, của ai chạy càng lâu? Hay là tất cả các sub trong file đều chạy lâu?
Nếu chỉ 1 Sub chạy "bị lâu" thì tìm cách viết lại Sub đó, đó là sub nào cho mọi người biết.
 
Upvote 0
Bạn vẫn thích nói cho bạn hiểu.
"file của em càng chạy thì thời gian thực thi VBA càng lâu" nghĩa là code nào, của ai chạy càng lâu? Hay là tất cả các sub trong file đều chạy lâu?
Nếu chỉ 1 Sub chạy "bị lâu" thì tìm cách viết lại Sub đó, đó là sub nào cho mọi người biết.

Dạ vâng module tên là CPU, Public Sub Cong_Ver25052017() anh ạ. Sub đó em gán vào cái biểu tượng mặt cười ở phía trên bên trái của các ngày chấm công anh ạ.

Em định up cả code lên nhưng mà dài quá, vượt quá 1000 ký tự quy định của diễn đàn.
 
Lần chỉnh sửa cuối:
Upvote 0
Có ai xem giúp em với, em cố soát lại code mà không thấy vấn đề ở đâu.
 
Upvote 0
Code này đúng là đang có vấn đề , nó là Sub Cong_ver25052017() ở Module CPU. Cùng một dữ liệu xử lý mà mỗi lần bấm chạy lại là thời gian xử lý tăng dần lên. Em không hiểu nó đang có vấn đề gì nữa. Mong mọi người chỉ dạy.
 
Upvote 0
Hay là do file của em có vấn đề. Chứ cùng xử lý một dữ liệu, cùng là một code tại sao thời gian xử lý khác nhau. Mỗi lần em cho chạy code đó là time xử lý tăng lên dần đều.
 
Upvote 0
Em tìm ra nguyên nhân rồi, lỗi không phải ở code mà lỗi là ở trong sheet có cái name lạ, bấm Ctrl+F3 không thấy, đã dùng del name của thầy ndu rồi mà cũng không ăn thua. Lạ thật.
 
Upvote 0
Hãy làm lại từ đầu đi bạn; Xóa đi làm lại có khi hay hơn.

Tất nhiên Xóa không có nghĩa là bỏ, mà là cất kho 1 thời gian; chuyển sang hướng khác xem sao/

Chớ tiếc công sức bấy lâu nay & tái cấu trúc đi bạn!

Với mình cấu trúc CSDL mới là khâu quan trọng bật nhất & là duy nhất.
 
Upvote 0
Nhờ mọi người xem giúp em. Em đang không hiểu vì sao, sheet càng nhiều thì mỗi lần bấm chạy code bằng cách bấm vào biểu tượng mặt cười ở bên trái phía trên là thời gian xử lý ngày càng tăng. (Càng chạy nhiều lần code đó thì tốc độ xử lý càng ngày càng tăng lên).

Kết luận trên file này có thể thấy tốc độ code phụ thuộc vào hai yếu tố sau:

- Số lượng sheet
- Số lần chạy code (Cái này ưu tiên hơn bởi vì số lượng sheet dù có bao nhiêu đi nữa thì nếu em đóng file vào chạy lại 1 đến 2 lần đầu tốc độ xử lý vẫn rất nhanh, nhưng bấm chạy lại càng về sau thì tốc độ càng chậm). Khó hiểu (code nằm trong module Cong)
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Nhờ mọi người xem giúp em. Em đang không hiểu vì sao, sheet càng nhiều thì mỗi lần bấm chạy code bằng cách bấm vào biểu tượng mặt cười ở bên trái phía trên là thời gian xử lý ngày càng tăng. (Càng chạy nhiều lần code đó thì tốc độ xử lý càng ngày càng tăng lên).

Kết luận trên file này có thể thấy tốc độ code phụ thuộc vào hai yếu tố sau:

- Số lượng sheet
- Số lần chạy code (Cái này ưu tiên hơn bởi vì số lượng sheet dù có bao nhiêu đi nữa thì nếu em đóng file vào chạy lại 1 đến 2 lần đầu tốc độ xử lý vẫn rất nhanh, nhưng bấm chạy lại càng về sau thì tốc độ càng chậm). Khó hiểu (code nằm trong module Cong)
Có lẽ không ai "chịu" đọc hơn ngàn dòng code của bạn đâu.
Bạn muốn làm cái gì có thể tách từng phần (kết quả muốn có từng cột), nói rõ cách lấy kết quả, mọi người mới có thể nghĩ cách viết Code khác dựa theo yêu cầu của bạn, chứ đọc mà hiểu được bạn muốn gì trong cái "đống bòng bong" có lẽ "loạn óc".
 
Upvote 0
Có lẽ không ai "chịu" đọc hơn ngàn dòng code của bạn đâu.
Bạn muốn làm cái gì có thể tách từng phần (kết quả muốn có từng cột), nói rõ cách lấy kết quả, mọi người mới có thể nghĩ cách viết Code khác dựa theo yêu cầu của bạn, chứ đọc mà hiểu được bạn muốn gì trong cái "đống bòng bong" có lẽ "loạn óc".

Anh ơi, tạm thời file em đang có vấn đề nên nhờ mọi người check xem do vì đâu. Anh đã thử chạy file của em gửi lên chưa? Tại sao cùng một dữ liệu mà càng bấm chạy chấm công thì tốc độ lại càng chậm?
 
Upvote 0
Anh ơi, tạm thời file em đang có vấn đề nên nhờ mọi người check xem do vì đâu. Anh đã thử chạy file của em gửi lên chưa? Tại sao cùng một dữ liệu mà càng bấm chạy chấm công thì tốc độ lại càng chậm?
Bạn đọc kỹ bài #32 lại đi. Muốn biết tại sao thì phải đọc hiểu tất cả các dòng code bạn viết.
Trong file bài trước của bạn có những sheet ẩn, ví dụ Check, toàn công thức mảng, nếu không cần thiết thì xóa, nếu cần thì chuyển nó sang VBA.
 
Upvote 0
Bạn đọc kỹ bài #32 lại đi. Muốn biết tại sao thì phải đọc hiểu tất cả các dòng code bạn viết.
Trong file bài trước của bạn có những sheet ẩn, ví dụ Check, toàn công thức mảng, nếu không cần thiết thì xóa, nếu cần thì chuyển nó sang VBA.

File em mới gửi đã xóa hết các sheet đó chỉ để lại cái Form và các sheet chấm công. Công thức không có tí nào mà lại như vậy mới lạ anh ạ.

Để em viết lại nội dung chú thích trên từng code.
 
Upvote 0
Vì nội dung hơi dài nên em viết tạm nội dung các cột tính đầu tiên, các nội dung tiếp theo sau khi viết xong em sẽ tiếp tục post lên để anh chị em đỡ hoa mắt :(

1. Xét giờ ra vào tại cột H, I và ca tại cột F (Sau đây em xin gọi giờ vào là Vào, giờ ra là Ra, ca là Ca) nếu thỏa mãn thì gán dữ liệu vào cột O và P:


- Ca là H (ca hành chính) khung giờ quy định từ 8h đến 17h nếu:
+ 6h < Vào <= 8h và 17h <= Ra < 18h thì gán giờ vào tại cột O là 8h và giờ ra tại cột P là 17h


- Ca là N (ca ngày) khung giờ quy định từ 8h đến 20h nếu:
+ 6h < Vào <= 8h và 20h <= Ra < 21h thì gán giờ vào tại cột O là 8h và giờ ra tại cột P là 20h


- Ca là D (ca đêm) khung giờ quy định từ 20h đến 08h hôm sau nếu:
+ 18h < Vào <= 20h và 8h <= Ra < 9h thì gán giờ vào tại cột O là 20h và giờ ra tại cột P là 32h


- Ca là X (ca 1) khung giờ quy định từ 6h đến 14h nếu:
+ 6h <= Vào và 14h <= Ra < 15h thì gán giờ vào tại cột O là 6h và giờ ra tại cột P là 14h


- Ca là Y (ca 2) khung giờ quy định từ 14h đến 22h nếu:
+ 12h < Vào <= 14 và 22h <= Ra thì gán giờ vào tại cột O là 14h và giờ ra tại cột P là 22h


- Ca là Z (ca 3) khung giờ quy định từ 22h đến 6h hôm sau nếu:
+ 20h < Vào <= 22h và 6h <= Ra < 7h thì gán giờ vào tại cột O là 22h và giờ ra tại cột P là 30h

*Các trường hợp ngoài các điều kiện trên thì ta xét xem dữ liệu giờ tại cột K và L có hay không, nếu có thì gán dữ liệu ra và vào tại cột K và L cho dữ liệu ra và vào tại cột O và P


2. Tiếp tục Tính khoảng thời gian giữa thời gian vào và ra sau đó cho vào cột Q

3. Tính giờ ăn 1 và 2 (Cột T và W)

- Thời gian ăn 1: Nếu khoảng thời gian ăn giữa Bắt đầu và kết thúc tại cột R và S mà bằng 0.5 (30 phút) thì cộng thêm 0.5 cho tròn 1. Các trường hợp khác tính ra bao nhiêu thì gán bấy nhiêu vào cột T

- Thời gian ăn 2: Tính khoảng thời gian giữa bắt đầu và kết thúc tại cột U và V sau đó gán vào cột W

4. Thời gian hưởng chế độ (Cột Y):

- Nếu cột lý do tính công (M) có chứa giá trị S thì gán 1 vào cột Y (Theo quy định nghỉ 1 tiêng cho trường hợp thai sản, nuôi con nhỏ)
 
Lần chỉnh sửa cuối:
Upvote 0
Em post tiếp nhé, đi đến đây là gần cuối con đường rồi, phù

5. Tính thời gian người lao động được tính công và giờ làm thêm

- Đối với ca ngày, hành chính thời: Lấy thời gian ở cột Q trừ đi thời gian ăn 1

- Các ca còn lại không trừ giờ ăn mà lấy luôn thời gian ở cột Q

6. Tính công ngày (cột AA) và công đêm (Cột AB)

- Tùy từng ca làm việc mà công được tính ở khoảng thời gian khác nhau:
+ Ca ngày, hành chính giờ công được tính trong khoảng từ 8h đến 17h trừ đi giờ ăn 1. Khung giờ làm phát sinh mà ngoài khoảng trên thì không phải là công mà sẽ quy thành giờ làm thêm.
+ Ca 1, giờ công được tính trong khoảng từ 6h đến 14h. Ngoài khoảng này sẽ là giờ làm thêm.
+ Ca 2, giờ công được tính trong khoảng từ 14h đến 22h. Ngoài khoảng này sẽ là giờ làm thêm.
+ Ca 1, giờ công được tính trong khoảng từ 22h đến 30h (6h sáng hôm sau). Ngoài khoảng này sẽ là giờ làm thêm.

7. Tính giờ làm thêm (OVT ngày - cột AC, OVT Đ1 cột AD, OVT Đ2 cột AE)

- Như phần 6 đã trình bày thì khoảng thời gian ngoài khoảng công sẽ được quy là OVT.
+Ca ngày, hành chính, ca 1, ca 2: OVT ngày sẽ lấy mốc 22h, sau 22h sẽ là OVT đêm
+Ca đêm, ca 3: OVT ngày sẽ là khoảng thởi gian làm việc trước 22h. OVT phát sinh sau đó sẽ được tính là OVT đêm.

*Lưu ý: Việc quy định phân chia làm OVT đêm 1 (Đ1) và OVT đêm 2 (Đ2) lý do như sau: Nếu như người lao động phát sinh OVT ngày, thì nếu tiếp tục phát sinh OVT đêm thì OVT đêm đó sẽ quy là OVT Đ1 (được hưởng 210%) còn nếu không phát sinh OVT ngày mà có OVT đêm thì sẽ được tính là OVT Đ2 (được hưởng 200%)
 
Lần chỉnh sửa cuối:
Upvote 0
1. Xét giờ ra vào tại cột H, I và ca tại cột F (Sau đây em xin gọi giờ vào là Vào, giờ ra là Ra, ca là Ca) nếu thỏa mãn thì gán dữ liệu vào cột O và P:
2. Tính khoảng thời gian giữa vào và ra sau đó cho vào cột Q
Tạo bảng phụ trong sheet Form: Giờ Vào Ra từng ca.
Format cột Q dạng "hh:mm"
 

File đính kèm

Upvote 0
1. Xét giờ ra vào tại cột H, I và ca tại cột F (Sau đây em xin gọi giờ vào là Vào, giờ ra là Ra, ca là Ca) nếu thỏa mãn thì gán dữ liệu vào cột O và P:
2. Tính khoảng thời gian giữa vào và ra sau đó cho vào cột Q
Tạo bảng phụ trong sheet Form: Giờ Vào Ra từng ca.
Format cột Q dạng "hh:mm"

Anh ơi, anh thử lại các trường hợp ca khác nhau cho em nhé. Theo như file nó là ca H vậy thì không thể nào nhập ca X Y và Z nó vẫn tính ra được. Cho nên ở trên em miêu tả rất kỹ điều kiện đặt ra. Anh xem lại giúp em nhé!
 
Lần chỉnh sửa cuối:
Upvote 0
Thêm 2 yêu cầu 3, 4
PHP:
Public Sub Cong()
Dim sArr(),  tArr(), I As Long, J As Long, R As Long, Vao As Double, Ra As Double, Tem
tArr = Sheets("Form").Range("AZ1:BB6").Value
sArr = Range("F9", Range("F1000000").End(xlUp)).Resize(, 40).Value
R = UBound(sArr): ReDim dArr(1 To R, 1 To 3)
For I = 1 To R
    If sArr(I, 3) > 0 Then
        '----------------------------------------1 Loai cong'
        For J = 1 To 6
            If tArr(J, 1) = sArr(I, 1) Then
                Vao = Application.Max(sArr(I, 3), tArr(J, 2))
                Ra = Application.Min(sArr(I, 4), tArr(J, 3))
                Exit For
            End If
        Next J
        sArr(I, 10) = IIf(sArr(I, 6) = "", Vao, sArr(I, 6))
        sArr(I, 11) = IIf(sArr(I, 7) = "", Ra, sArr(I, 7))
        sArr(I, 12) = (sArr(I, 11) - sArr(I, 10) + IIf(sArr(I, 11) < sArr(I, 10), 1, 0)) * 24
        '---------------------------------- An 1'
        Tem = Application.WorksheetFunction.Round((sArr(I, 14) - sArr(I, 13)) * 24, 2)
        sArr(I, 15) = IIf(Tem = 0.5, 1, Tem)
        '----------------------------------An 2'
        sArr(I, 18) = (sArr(I, 17) - sArr(I, 16)) * 24
        '----------------------------------Tg còn lai'
        sArr(I, 19) = sArr(I, 12) - sArr(I, 15) - sArr(I, 18)
        '----------------------------------Che do'
        sArr(I, 20) = IIf(sArr(I, 8) = "S", 1, 0)
    End If
Next I
Range("F9").Resize(R, 40) = sArr
End Sub
 
Upvote 0
Thêm 2 yêu cầu 3, 4
PHP:
Public Sub Cong()
Dim sArr(),  tArr(), I As Long, J As Long, R As Long, Vao As Double, Ra As Double, Tem
tArr = Sheets("Form").Range("AZ1:BB6").Value
sArr = Range("F9", Range("F1000000").End(xlUp)).Resize(, 40).Value
R = UBound(sArr): ReDim dArr(1 To R, 1 To 3)
For I = 1 To R
    If sArr(I, 3) > 0 Then
        '----------------------------------------1 Loai cong'
        For J = 1 To 6
            If tArr(J, 1) = sArr(I, 1) Then
                Vao = Application.Max(sArr(I, 3), tArr(J, 2))
                Ra = Application.Min(sArr(I, 4), tArr(J, 3))
                Exit For
            End If
        Next J
        sArr(I, 10) = IIf(sArr(I, 6) = "", Vao, sArr(I, 6))
        sArr(I, 11) = IIf(sArr(I, 7) = "", Ra, sArr(I, 7))
        sArr(I, 12) = (sArr(I, 11) - sArr(I, 10) + IIf(sArr(I, 11) < sArr(I, 10), 1, 0)) * 24
        '---------------------------------- An 1'
        Tem = Application.WorksheetFunction.Round((sArr(I, 14) - sArr(I, 13)) * 24, 2)
        sArr(I, 15) = IIf(Tem = 0.5, 1, Tem)
        '----------------------------------An 2'
        sArr(I, 18) = (sArr(I, 17) - sArr(I, 16)) * 24
        '----------------------------------Tg còn lai'
        sArr(I, 19) = sArr(I, 12) - sArr(I, 15) - sArr(I, 18)
        '----------------------------------Che do'
        sArr(I, 20) = IIf(sArr(I, 8) = "S", 1, 0)
    End If
Next I
Range("F9").Resize(R, 40) = sArr
End Sub

Cách viết này hay quá, sArr nào không bị biến đổi thì vẫn giữ nguyên. Nếu chuyển thành mảng dArr thì không linh động như vậy được :)
 
Upvote 0
Anh ơi em giải thích lại ở bài #37 rồi anh nhé. Anh xem lại giúp em.
Hiểu thêm được số 5:
PHP:
Public Sub Cong()
Dim sArr(), tArr(), I As Long, J As Long, R As Long, Vao As Double, Ra As Double, Tem
tArr = Sheets("Form").Range("AZ1:BB6").Value
sArr = Range("F9", Range("F1000000").End(xlUp)).Resize(, 40).Value
R = UBound(sArr): ReDim dArr(1 To R, 1 To 3)
For I = 1 To R
    If sArr(I, 3) > 0 Then
        '----------------------------------------1 Loai cong'
        For J = 1 To 6
            If tArr(J, 1) = sArr(I, 1) Then
                Vao = Application.Max(sArr(I, 3), tArr(J, 2))
                Ra = Application.Min(sArr(I, 4), tArr(J, 3))
                Exit For
            End If
        Next J
        sArr(I, 10) = IIf(sArr(I, 6) = "", Vao, sArr(I, 6))
        sArr(I, 11) = IIf(sArr(I, 7) = "", Ra, sArr(I, 7))
        sArr(I, 12) = (sArr(I, 11) - sArr(I, 10) + IIf(sArr(I, 11) < sArr(I, 10), 1, 0)) * 24
        '---------------------------------- An 1'
        Tem = Application.WorksheetFunction.Round((sArr(I, 14) - sArr(I, 13)) * 24, 2)
        sArr(I, 15) = IIf(Tem = 0.5, 1, Tem)
        '----------------------------------An 2'
        sArr(I, 18) = (sArr(I, 17) - sArr(I, 16)) * 24
        '----------------------------------Tg còn lai'
        sArr(I, 19) = sArr(I, 12) - sArr(I, 15) - sArr(I, 18)
        '----------------------------------Che do'
        sArr(I, 20) = IIf(sArr(I, 8) = "S", 1, 0)
        '----------------------------------Tong TG'
        If sArr(I, 1) = "N" Or sArr(I, 1) = "H" Then
            sArr(I, 21) = sArr(I, 12) - sar(I, 15)
        Else
            sArr(I, 21) = sArr(I, 12)
        End If
        '?????????????????????????'
       
    End If
Next I
Range("F9").Resize(R, 40) = sArr
End Sub
Mã:
6. Tính công ngày (cột AA) và công đêm (Cột AB)
- Tùy từng ca làm việc mà công được tính ở khoảng thời gian khác nhau:
+ Ca ngày, hành chính giờ công được tính trong khoảng từ 8h đến 17h trừ đi giờ ăn 1. Khung giờ làm phát sinh mà ngoài khoảng trên thì không phải là công mà sẽ quy thành giờ làm thêm.
+ Ca 1, giờ công được tính trong khoảng từ 6h đến 14h. Ngoài khoảng này sẽ là giờ làm thêm.
+ Ca 2, giờ công được tính trong khoảng từ 14h đến 22h. Ngoài khoảng này sẽ là giờ làm thêm.
+ Ca 1, giờ công được tính trong khoảng từ 22h đến 30h (6h sáng hôm sau). Ngoài khoảng này sẽ là giờ làm thêm.
Ca nào ghi vào cột nào? 2 dòng ca 1 làm theo dòng nào?
 
Upvote 0
Hiểu thêm được số 5:
PHP:
Public Sub Cong()
Dim sArr(), tArr(), I As Long, J As Long, R As Long, Vao As Double, Ra As Double, Tem
tArr = Sheets("Form").Range("AZ1:BB6").Value
sArr = Range("F9", Range("F1000000").End(xlUp)).Resize(, 40).Value
R = UBound(sArr): ReDim dArr(1 To R, 1 To 3)
For I = 1 To R
    If sArr(I, 3) > 0 Then
        '----------------------------------------1 Loai cong'
        For J = 1 To 6
            If tArr(J, 1) = sArr(I, 1) Then
                Vao = Application.Max(sArr(I, 3), tArr(J, 2))
                Ra = Application.Min(sArr(I, 4), tArr(J, 3))
                Exit For
            End If
        Next J
        sArr(I, 10) = IIf(sArr(I, 6) = "", Vao, sArr(I, 6))
        sArr(I, 11) = IIf(sArr(I, 7) = "", Ra, sArr(I, 7))
        sArr(I, 12) = (sArr(I, 11) - sArr(I, 10) + IIf(sArr(I, 11) < sArr(I, 10), 1, 0)) * 24
        '---------------------------------- An 1'
        Tem = Application.WorksheetFunction.Round((sArr(I, 14) - sArr(I, 13)) * 24, 2)
        sArr(I, 15) = IIf(Tem = 0.5, 1, Tem)
        '----------------------------------An 2'
        sArr(I, 18) = (sArr(I, 17) - sArr(I, 16)) * 24
        '----------------------------------Tg còn lai'
        sArr(I, 19) = sArr(I, 12) - sArr(I, 15) - sArr(I, 18)
        '----------------------------------Che do'
        sArr(I, 20) = IIf(sArr(I, 8) = "S", 1, 0)
        '----------------------------------Tong TG'
        If sArr(I, 1) = "N" Or sArr(I, 1) = "H" Then
            sArr(I, 21) = sArr(I, 12) - sar(I, 15)
        Else
            sArr(I, 21) = sArr(I, 12)
        End If
        '?????????????????????????'
    
    End If
Next I
Range("F9").Resize(R, 40) = sArr
End Sub

Ca nào ghi vào cột nào? 2 dòng ca 1 làm theo dòng nào?
Đừng nói tui "ngu", vì tôi không phải cùng ngành với bạn mà hiểu cái cột nào để ghi cái chuyện gì.

Mã:
6. Tính công ngày (cột AA) và công đêm (Cột AB)
- Tùy từng ca làm việc mà công được tính ở khoảng thời gian khác nhau:
+ Ca ngày, hành chính giờ công được tính trong khoảng từ 8h đến 17h trừ đi giờ ăn 1. Khung giờ làm phát sinh mà ngoài khoảng trên thì không phải là công mà sẽ quy thành giờ làm thêm.
+ Ca 1, giờ công được tính trong khoảng từ 6h đến 14h. Ngoài khoảng này sẽ là giờ làm thêm.
+ Ca 2, giờ công được tính trong khoảng từ 14h đến 22h. Ngoài khoảng này sẽ là giờ làm thêm.
+ Ca 1, giờ công được tính trong khoảng từ 22h đến 30h (6h sáng hôm sau). Ngoài khoảng này sẽ là giờ làm thêm.
 
Upvote 0
6. Tính công ngày (cột AA) và công đêm (Cột AB) căn cứ vào giờ ra vào ở cột O và P, ca ở cột F
- Tùy từng ca làm việc mà công được tính ở khoảng thời gian khác nhau:
+ Ca ngày, hành chính giờ công được tính trong khoảng từ 8h đến 17h trừ đi giờ ăn 1. Khung giờ làm phát sinh mà ngoài khoảng trên thì không phải là công mà sẽ quy thành giờ làm thêm.
+ Ca 1, giờ công được tính trong khoảng từ 6h đến 14h. Ngoài khoảng này sẽ là giờ làm thêm.
+ Ca 2, giờ công được tính trong khoảng từ 14h đến 22h. Ngoài khoảng này sẽ là giờ làm thêm.
+ Ca 1, giờ công được tính trong khoảng từ 22h đến 30h (6h sáng hôm sau). Ngoài khoảng này sẽ là giờ làm thêm.

Hì sao anh nói vậy :). Vì viết nhiều quá em không để ý tên cột tính và dữ liệu căn cứ để tính. Chưa kịp sửa thì anh đã nhắc rồi :)
 
Lần chỉnh sửa cuối:
Upvote 0
6. Tính công ngày (cột AA) và công đêm (Cột AB) căn cứ vào giờ ra vào ở cột O và P, ca ở cột F
- Tùy từng ca làm việc mà công được tính ở khoảng thời gian khác nhau:
+ Ca ngày, hành chính giờ công được tính trong khoảng từ 8h đến 17h trừ đi giờ ăn 1. Khung giờ làm phát sinh mà ngoài khoảng trên thì không phải là công mà sẽ quy thành giờ làm thêm. (Cái này hiểu là ghi vào cột AA)
+ Ca 1, giờ công được tính trong khoảng từ 6h đến 14h. Ngoài khoảng này sẽ là giờ làm thêm. (Ghi vào cột nào)
+ Ca 2, giờ công được tính trong khoảng từ 14h đến 22h. Ngoài khoảng này sẽ là giờ làm thêm.(Ghi vào cột nào)
+ Ca 1, giờ công được tính trong khoảng từ 22h đến 30h (6h sáng hôm sau). Ngoài khoảng này sẽ là giờ làm thêm. (Ca 1 đã có bên trên, bây giờ ca 1 nữa là sao?)
Từ đầu và trong code đều dùng ca N,D,X,Z.... ghi ngày đêm, ca 1, ca2 làm gì cho rắc rối?
 
Upvote 0
6. Tính công ngày (cột AA) và công đêm (Cột AB) căn cứ vào giờ ra vào ở cột O và P, ca ở cột F
- Tùy từng ca làm việc mà công được tính ở khoảng thời gian khác nh...
Từ đầu và trong code đều dùng ca N,D,X,Z.... ghi ngày đêm, ca 1, ca2 làm gì cho rắc rối?

- Tính công ngày (cho các ca N, H, X, Y) rồi ghi vào cột AA
- Tính công đêm (cho các ca D, Z) rồi ghi vào cột AB

+ Ca N, ca H giờ công được tính trong khoảng từ 8h đến 17h trừ đi giờ ăn 1. Khung giờ làm phát sinh mà ngoài khoảng trên thì không phải là công mà sẽ quy thành giờ làm thêm.
+ Ca X, giờ công được tính trong khoảng từ 6h đến 14h. Ngoài khoảng này sẽ là giờ làm thêm.
+ Ca Y, giờ công được tính trong khoảng từ 14h đến 22h. Ngoài khoảng này sẽ là giờ làm thêm.

+ Ca Z, ca D giờ công được tính trong khoảng từ 22h đến 30h (6h sáng hôm sau). Ngoài khoảng này sẽ là giờ làm thêm.

(Em nhầm ca 1 ở dưới là ca 3)
 
Upvote 0
- Tính công ngày (cho các ca N, H, X, Y) rồi ghi vào cột AA
- Tính công đêm (cho các ca D, Z) rồi ghi vào cột AB

+ Ca N, ca H giờ công được tính trong khoảng từ 8h đến 17h trừ đi giờ ăn 1. Khung giờ làm phát sinh mà ngoài khoảng trên thì không phải là công mà sẽ quy thành giờ làm thêm.
+ Ca X, giờ công được tính trong khoảng từ 6h đến 14h. Ngoài khoảng này sẽ là giờ làm thêm.
+ Ca Y, giờ công được tính trong khoảng từ 14h đến 22h. Ngoài khoảng này sẽ là giờ làm thêm.

+ Ca Z, ca D giờ công được tính trong khoảng từ 22h đến 30h (6h sáng hôm sau). Ngoài khoảng này sẽ là giờ làm thêm.

(Em nhầm ca 1 ở dưới là ca 3)

(Em nhầm ca 1 ở dưới là ca 3)
Bài #46 tôi đã thắc mắc 2 dòng ca 1, bài #48 bạn vẫn copy "y chang" bài #46 để hỏi, không chịu đọc hiểu thắc mắc của người khác.
Khi thấy điều kiện rõ ràng, có thể làm được thì tính, gặp bài "lu bu" quá thì "chạy"
Tôi không tham gia Topic này nữa, bạn nhờ người khác đi.
 
Upvote 0
Anh Bate
(Em nhầm ca 1 ở dưới là ca 3)
Bài #46 tôi đã thắc mắc 2 dòng ca 1, bài #48 bạn vẫn copy "y chang" bài #46 để hỏi, không chịu đọc hiểu thắc mắc của người khác.
Khi thấy điều kiện rõ ràng, có thể làm được thì tính, gặp bài "lu bu" quá thì "chạy"
Tôi không tham gia Topic này nữa, bạn nhờ người khác đi.

Vâng, em xin lỗi. Sáng dậy mắt nhắm mắt mở trông con nên em không đọc kĩ. Cảm ơn anh!
 
Upvote 0

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

Back
Top Bottom