Giúp hoàn thiện bảng BCC (2 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
Web KT

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

Back
Top Bottom