[Nhờ giúp đỡ!] Tổng hợp dữ liệu chấm công theo mã nhân viên vào 1 sheet

Liên hệ QC

nguyenquynhtrangneu52

Thành viên mới
Tham gia
11/12/18
Bài viết
8
Được thích
2
Em chào các bác,
Em có một file excel dưới đây nhờ các bác giúp.
Trong file có nhiều sheet là dữ liệu các ngày chấm công (cùng form, cùng các cột). Em muốn nó được tổng hợp về 1 sheet theo mã nhân viên. Mã nhân viên có hai loại (KIB hoặc TV) nếu tìm theo mã KIB ko được sẽ tự động tìm theo mã TV. Dữ liệu cần lấy là các cột worktime (vào sheet Absent) và cột OT time (vào sheet OT).
Ngoài ra em muốn nếu em thêm mã nhân viên vào sheet tổng hợp thì nó cũng sẽ tự động nhảy ra số liệu (mã nhân viên có thể ở dạng KIB hoặc TV ạ)
Trước nay em toàn dùng hàm rồi làm thủ công từng ngày một nên khá mất thời gian.
Nhờ các cao nhân chỉ giúp xem có cách nào nhanh hơn ko ạ.
Em cảm ơn các bác rất nhiều :)
 

File đính kèm

Em chào các bác,
Em có một file excel dưới đây nhờ các bác giúp.
Trong file có nhiều sheet là dữ liệu các ngày chấm công (cùng form, cùng các cột). Em muốn nó được tổng hợp về 1 sheet theo mã nhân viên. Mã nhân viên có hai loại (KIB hoặc TV) nếu tìm theo mã KIB ko được sẽ tự động tìm theo mã TV. Dữ liệu cần lấy là các cột worktime (vào sheet Absent) và cột OT time (vào sheet OT).
Ngoài ra em muốn nếu em thêm mã nhân viên vào sheet tổng hợp thì nó cũng sẽ tự động nhảy ra số liệu (mã nhân viên có thể ở dạng KIB hoặc TV ạ)
Trước nay em toàn dùng hàm rồi làm thủ công từng ngày một nên khá mất thời gian.
Nhờ các cao nhân chỉ giúp xem có cách nào nhanh hơn ko ạ.
Em cảm ơn các bác rất nhiều :)
Không phải cao nhân nhưng mà mình góp ý.File của bạn thiết kế tên sheets linh tinh muốn lập trình với VBA thì bạn nên sửa lại.Mà cái mã mình cũng không hiểu lắm bạn giải thích rõ hơn được không.
 
Upvote 0
Không phải cao nhân nhưng mà mình góp ý.File của bạn thiết kế tên sheets linh tinh muốn lập trình với VBA thì bạn nên sửa lại.Mà cái mã mình cũng không hiểu lắm bạn giải thích rõ hơn được không.
Dạ
Em giải thích thêm là một người có thể có 2 mã số. Tức là có thể tìm kiếm theo mã số KIB (tạm gọi mã 1) nếu ko tìm thấy theo mã 1 có thể tìm kiếm tiếp theo mã TV(tạm gọi mã 2) ạ. Phần mềm chấm công cũng được update mã số theo như vậy ạ.
 
Upvote 0
Bạn thử con rùa này & kiểm tra dữ liệu kết quả xem sao; Nếu được ta tính tiếp
PHP:
Sub OtTime()
Dim Sh As Worksheet, Rng As Range, sRng As Range, Cls As Range, sRg As Range
Dim MaKib As String, MaTV As String, MyAdd As String, ShName As String
Dim Rws As Long, Col As Integer, Cot As Integer

Sheets("OT time").Select
Application.ScreenUpdating = False
For Each Cls In Range([c3], [c3].End(xlDown))
    MaKib = Cls.Value:                          MaTV = Cls.Offset(, -1).Value
    Cls.Offset(, 2).Resize(, 31).Clear
    For Each Sh In ThisWorkbook.Worksheets
        ShName = Left(Sh.Name, 2)
        If IsNumeric(ShName) Then
            Rws = Sh.[C1].CurrentRegion.Rows.Count
            Set Rng = Sh.[C1].Resize(Rws)
            Set sRng = Rng.Find(MaKib, , xlFormulas, xlWhole)
            If sRng Is Nothing Then
                Set sRg = Rng.Find(MaTV, , xlFormulas, xlWhole)
                If Not sRg Is Nothing Then
                    If Sh.Cells(sRg.Row, "Q").Value <> Space(0) Then
                        Col = Day(sRg.Offset(, 3).Value)
                        If Col > 15 Then
                            Cot = Col - 14
                        Else
                            Cot = Col + 16
                        End If
                        Cls.Offset(, Cot).Value = Sh.Cells(sRg.Row, "Q").Value
                    End If
                End If
            Else
                If Sh.Cells(sRng.Row, "Q").Value <> Space(0) Then
                    Col = Day(sRng.Offset(, 3).Value)
                    If Col > 15 Then
                        Cot = Col - 14
                    Else
                        Cot = Col + 16
                    End If
                    Cls.Offset(, Cot).Value = Sh.Cells(sRng.Row, "Q").Value
                End If
            End If
        End If
    Next Sh
Next Cls
Application.ScreenUpdating = True
End Sub

Với con này, máy của mình mất ~ 10.4"
 
Lần chỉnh sửa cuối:
Upvote 0
Đa tạ bác

Code chạy trên máy em khá nhanh chưa đầy 1p đã xong. Tuy nhiên em thấy hình như dữ liệu bị thiếu. Em ví dụ một bạn mã TV3488 ngày 16 có tăng ca nhưng chạy code xong không thấy hiện lên trong bảng tổng hợp.
Ngoài ra em đổi tên sheet. Không biết như thế này đã dễ nhìn hơn chưa ạ. Vì kì chốt công của công ty em là từ 16 tháng trước đến 15 tháng sau nên cách đặt tên sheet hơi khó nhìn.

Em cảm ơn ạ!
Bài đã được tự động gộp:

Đa tạ bác

Code chạy trên máy em khá nhanh chưa đầy 1p đã xong. Tuy nhiên em thấy hình như dữ liệu bị thiếu. Em ví dụ một bạn mã TV3488 ngày 16 có tăng ca nhưng chạy code xong không thấy hiện lên trong bảng tổng hợp.
Ngoài ra em đổi tên sheet. Không biết như thế này đã dễ nhìn hơn chưa ạ. Vì kì chốt công của công ty em là từ 16 tháng trước đến 15 tháng sau nên cách đặt tên sheet hơi khó nhìn.

Em cảm ơn ạ!
Dạ ngoài ra em muốn đổi từ giờ sang phút luôn được không ạ. Vì dữ liệu trên máy chấm là 4:00:58 chẳng hạn thì em muốn trong bảng tổng hợp quy luôn ra số phút ạ.
 

File đính kèm

Upvote 0
(1)Code chạy trên máy em khá nhanh chưa đầy 1p đã xong.
(2) Tuy nhiên em thấy hình như dữ liệu bị thiếu. Em ví dụ một bạn mã TV3488 ngày 16 có tăng ca nhưng chạy code xong không thấy hiện lên trong bảng tổng hợp.
(3)Ngoài ra em đổi tên sheet. Không biết như thế này đã dễ nhìn hơn chưa ạ. Vì kì chốt công của công ty em là từ 16 tháng trước đến 15 tháng sau nên cách đặt tên sheet hơi khó nhìn.
(4) Dạ ngoài ra em muốn đổi từ giờ sang phút luôn được không ạ. Vì dữ liệu trên máy chấm là 4:00:58 chẳng hạn thì em muốn trong bảng tổng hợp quy luôn ra số phút ạ.
(1) Máy cà tèng của mình chỉ cần dưới 11" thôi;
Sau này ta có thể hoàn chỉnh để đạt tốc độ cao hơn; Giờ thì lo số liệu đúnh hết cái đã
(2) Mọi số liệu được fát hiện đang sai sẽ chỉnh lại sai do đâu;
File trước chỉ đúng cho các tháng bắt đầu bỡi tháng đó 30 ngày (như tháng 11, tháng 6,. . . .)
Các tháng còn lại & nhất là tháng 2 cần điều chỉnh thêm
(3) Bạn cứ đặt N01, N02, ,N16,. . . có sao không?
(4) Được nhưng sẽ lâu hơn nhiều về thời gian tính toán chuyển đổi.
 
Upvote 0
Cảm ơn bác đã hỗ trợ em nhiệt tình.
Bác xem em đặt tên sheet như này đã được chưa. Công ty em tính công từ ngày 16 tháng trước đến 15 tháng sau. Tức là chấm công của tháng 12 sẽ lấy từ ngày 16/11 đến ngày 15/12 chứ không phải là lấy nguyên cả tháng 12 ạ. Có khi nào code mà bác chỉ em chỉ chạy đến dòng nào đó và kết thúc ko ạ? Vì dữ liệu những người từ dòng thứ 776 trở đi là không hiện lên mặc dù có tăng ca ạ.
Em cảm ơn ạ!
 

File đính kèm

Upvote 0
Cảm ơn bác đã hỗ trợ em nhiệt tình.
Bác xem em đặt tên sheet như này đã được chưa. Công ty em tính công từ ngày 16 tháng trước đến 15 tháng sau. Tức là chấm công của tháng 12 sẽ lấy từ ngày 16/11 đến ngày 15/12 chứ không phải là lấy nguyên cả tháng 12 ạ. Có khi nào code mà bác chỉ em chỉ chạy đến dòng nào đó và kết thúc ko ạ? Vì dữ liệu những người từ dòng thứ 776 trở đi là không hiện lên mặc dù có tăng ca ạ.
Em cảm ơn ạ!
Bạn nên đặt tên sheets theo kiểu như thế này 16-11-2018 .Thì sẽ rễ hơn.Mỗi ngày tên đều như vậy thì nó sẽ trùng với các mốc ngày của bạn.
 
Upvote 0
Mình sẽ gán tên các trang tính sẽ là '1601, '1702,. . . . '3015, 0116,. . . . (tháng 11 - 12)
BCC Tháng tiếp theo sẽ fải là: '1601, '1702, . . . . '3015,'3116,. . . . .
 
Upvote 0
Bạn kiểm số liệu các cột khi chép sang đúng ngày chưa;
Sau đó chịu khó thử với 2 trường hợp sau:
BCC tháng 2, kể từ ngày 16 & BCC tháng 7 cũng kể từ ngày 16/07

Thời gian máy mình thực hiện > 12 "; Còn trên máy bạn?
& bạn có muốn rút ngắn tiếp hay không?
 

File đính kèm

Upvote 0
Em test thử các tháng khác ok bác ạ. Dữ liệu nhảy ra đúng ngày.
Thời gian chạy trên máy em lần này chưa đến 10s.
Tuy nhiên vẫn có lỗi là dữ liệu chạy ra ko đầy đủ như lần trước ạ. Tức là có người tăng ca nhưng ko hiện dữ liệu.
Em nghĩ vấn đề nằm ở đây (bác xem thử hình). Đến dòng thứ 776 thì code dừng chạy thì phải. Code chỉ chạy khi có mã KIB, nếu không thấy mã KIB thì tìm theo mã TV. Chỉ cần 1 người ko có mã KIB là code sẽ kết thúc tìm kiếm. Có phải thế ko bác? Em thử code với cả sheet Absent cũng có tình trạng như vậy.
Nhờ bác kiểm tra lại lẫn nữa giúp em ạ
Em cảm ơn bác rất nhiều
 

File đính kèm

  • ảnh.png
    ảnh.png
    18.5 KB · Đọc: 4
Upvote 0
Sửa 1 dòng lệnh & bổ sung 1 dòng lệnh; Bạn kiểm tra xem:
PHP:
Sub OtTime()
Dim Sh As Worksheet, Rng As Range, sRng As Range, Cls As Range, sRg As Range
Dim MaKib As String, MaTV As String, MyAdd As String, ShName As String
Dim Rws As Long, Col As Integer, Tmr As Double
On Error GoTo LoiCT

Sheets("OT time").Select:                       Tmr = Timer()
Application.ScreenUpdating = False
For Each Cls In Range([c3],[D65500].End(xlUp).Offset(, -1))          '*      *      '
    MaKib = Cls.Value:                          MaTV = Cls.Offset(, -1).Value
    If MaKib = "" Then MaKib = MaTV                         '*      '
    Cls.Offset(, 2).Resize(, 31).Clear
    For Each Sh In ThisWorkbook.Worksheets
        ShName = Left(Sh.Name, 2)
        If IsNumeric(ShName) Then
            Rws = Sh.[C1].CurrentRegion.Rows.Count
            Col = 1 + CInt(Right(Sh.Name, 2))
            Set Rng = Sh.[C1].Resize(Rws)
            Set sRng = Rng.Find(MaKib, , xlFormulas, xlWhole)
            If sRng Is Nothing Then
                Set sRg = Rng.Find(MaTV)
                If Not sRg Is Nothing Then
                    If Sh.Cells(sRg.Row, "Q").Value <> Space(0) Then
                        Cls.Offset(, Col).Value = (Sh.Cells(sRg.Row, "Q").Value)
                    End If
                End If
            Else
                If Sh.Cells(sRng.Row, "Q").Value <> Space(0) Then
                    Cls.Offset(, Col).Value = (Sh.Cells(sRng.Row, "Q").Value)
                    If Cls.Row = 4 Then
                        MsgBox TToM(Sh.Cells(sRng.Row, "Q").Value), , Sh.Cells(sRng.Row, "Q").Value
                    End If
                End If
            End If
        End If
    Next Sh
Next Cls
Application.ScreenUpdating = True:                  MsgBox Timer() - Tmr
Err_:               Exit Sub
LoiCT:
    If Err = 13 Then
        Resume Next
    Else
        MsgBox Err:                                             Resume Err_
    End If
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Còn đây là biến thể khác của macro trên; Bạn chạy đỡ buồn:
PHP:
Sub OtTime()
Dim Sh As Worksheet, Rng As Range, sRng As Range, Cls As Range, sRg As Range
Dim MaKib As String, MaTV As String, MyAdd As String, ShName As String
Dim Rws As Long, Col As Integer, Tmr As Double
On Error GoTo LoiCT

Sheets("OT time").Select:                       Tmr = Timer()
Application.ScreenUpdating = False
For Each Cls In Range([c3], [D65500].End(xlUp).Offset(, -1))
    ReDim Arr(1 To 1, 1 To 31)              '**     '
    MaKib = Cls.Value:                          MaTV = Cls.Offset(, -1).Value
    If MaKib = "" Then MaKib = MaTV
    Cls.Offset(, 2).Resize(, 31).Clear
    For Each Sh In ThisWorkbook.Worksheets
        ShName = Left(Sh.Name, 2)
        If IsNumeric(ShName) Then
            Rws = Sh.[C1].CurrentRegion.Rows.Count
            Col = 1 + CInt(Right(Sh.Name, 2))
            Set Rng = Sh.[C1].Resize(Rws)
            Set sRng = Rng.Find(MaKib, , xlFormulas, xlWhole)
            If sRng Is Nothing Then
                Set sRg = Rng.Find(MaTV)
                If Not sRg Is Nothing Then
                    If Sh.Cells(sRg.Row, "Q").Value <> Space(0) Then
                        Arr(1, Col) = (Sh.Cells(sRg.Row, "Q").Value)
'                        Cls.Offset(, Col).Value =  (Sh.Cells(sRg.Row, "Q").Value) '
                    End If
                End If
            Else
                If Sh.Cells(sRng.Row, "Q").Value <> Space(0) Then
                    Arr(1, Col) = (Sh.Cells(sRng.Row, "Q").Value)
'                    Cls.Offset(, Col).Value = (Sh.Cells(sRng.Row, "Q").Value)  '
                End If
            End If
        End If
    Next Sh
    Cls.Offset(, 2).Resize(, 31).Value = Arr():     Erase Arr()             '**     '
Next Cls

For Each Cls In Range([c3], [D65500].End(xlUp).Offset(, -1)).Offset(, 2).Resize(, 31)
    If Cls.Value > 0 Then Cls.Value = Cls.Value * 1440 \ 1
Next Cls
Application.ScreenUpdating = True:                  MsgBox Timer() - Tmr
Err_:               Exit Sub
LoiCT:
    If Err = 13 Then
        Resume Next
    Else
        MsgBox Err:                                             Resume Err_
    End If
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Bác ơi giúp em với.
Code sửa 1 dòng lệnh và thêm 1 dòng lệnh trên em chạy thì báo lỗi như này ạ
Em cảm ơn bác rất nhiều
 

File đính kèm

  • Loi.png
    Loi.png
    272.7 KB · Đọc: 8
Upvote 0
Web KT

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

Back
Top Bottom