Nhờ giúp đỡ: Chuyển đổi dữ liệu ngày công của nhân viên (1 người xem)

Liên hệ QC

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

Oanhnhunguyen2610

Thành viên mới
Tham gia
24/3/20
Bài viết
26
Được thích
0
Chào anh chị. Mình hiện đang làm Nhân sự của một công ty sản xuất. Dữ liệu chấm công xuất ra được thể hiện dưới dạng hàng ngang rất khó xử lý để xác định ca và thời gian làm việc (sheet "Dữ liệu nguồn" như file đính kèm).
Do đó, nhờ anh chị hỗ trợ hướng dẫn giúp thao tác hoặc hàm excel để chuyển từ sheet "Dữ liệu nguồn" sang sheet "Dữ liệu kết quả" để dễ dàng tính toán hơn. Thêm một thông tin là em chưa học về VBA hoặc Macro ạ.
Cảm ơn anh chị rất nhiều :throb::throb:
 

File đính kèm

Ngồi buồn vận động tí.

Về thao tác bằng tay thì bạn chờ người khác. Tôi dùng code. Bạn không biết code thì cứ gán macro một nút nào đó rồi nhấn nút thôi. Code đã có tôi cầy xong rồi, chỉ cần nhắm mắt nhấn nút thôi.

Vd. thẻ Developer -> Insert -> chọn Button ở Form Controls rồi gán cho nó code ở dưới - chuyen_doi.

Trong VBE menu Insert -> Module -> dán code sau vào Module vừa chèn thêm.

Mã:
Sub chuyen_doi()
Dim lastRow As Long, r As Long, k As Long, count As Long, cotInOut As Long, ngay, dulieuCN As String, InOut, ma As String, hoten As String, dulieu(), kq()
'    xoa ket qua cu
    With ThisWorkbook.Worksheets("Du lieu ket qua")
        lastRow = .Cells(Rows.count, "A").End(xlUp).Row
        If lastRow > 1 Then .Range("A2:E" & lastRow).ClearContents
    End With
    
    With ThisWorkbook.Worksheets("Du lieu nguon")
        lastRow = .Cells(Rows.count, "J").End(xlUp).Row ' dong cuoi co du lieu o cot J
        If lastRow < 11 Then Exit Sub   ' khong co du lieu thi don do choi
        dulieu = .Range("B10:J" & lastRow).Value    ' lay du lieu nguon vao mang dulieu
    End With
    ReDim kq(1 To 3 * UBound(dulieu, 1), 1 To 5)    ' chua ro so dong ket qua, lay trung binh so dong gap 3 lan so dong nguon
    For r = 1 To UBound(dulieu, 1)  ' duyet tung dong nguon
        If dulieu(r, 1) <> "" Then  ' cot dau tien co dang: <ma> - <hoten> (<...>)
            dulieuCN = dulieu(r, 1)
            k = InStr(1, dulieuCN, "-")
            ma = Trim(Mid(dulieuCN, 1, k - 1))  ' ma NV hien hanh
            hoten = Trim(Mid(dulieuCN, k + 1, InStr(1, dulieuCN, "(") - k - 1)) ' ho ten nhan vien hien hanh
        Else
            If dulieu(r, 4) <> "" Then
                ngay = Split(dulieu(r, 4), "/")
                ngay = DateSerial(ngay(2), ngay(1), ngay(0))    ' ngay hien hanh
            End If
            InOut = dulieu(r, 9)
            If InStr(1, InOut, "In:", vbTextCompare) Then
                cotInOut = 4    ' gio nhap vao cot In
            Else
                cotInOut = 5    ' gio nhap vao cot Out
            End If
            InOut = Trim(Mid(InOut, InStr(1, InOut, ":") + 1))
            If InOut <> "" Then
                InOut = Split(InOut, ";")   ' mang thoi gian vao hoav ra
                For k = 0 To UBound(InOut, 1)
                    count = count + 1   ' so dong co du lieu trong mang ket qua
                    kq(count, 1) = ma   ' ma NV
                    kq(count, 2) = hoten    ' ho ten NV
                    kq(count, 3) = ngay ' ngay
                    kq(count, cotInOut) = Trim(InOut(k))    ' gio ra / vao
                Next k
            End If
        End If
    Next r
    If count Then ThisWorkbook.Worksheets("Du lieu ket qua").Range("A2").Resize(count, 5).Value = kq    ' nhap ket qua xuong sheet
End Sub
 
Rất cảm ơn bạn. Bởi vì mình chưa học qua VBA nên đã làm theo hướng dẫn của bạn nhưng không thực hiện được. Rất mong bạn thực hiện và gửi file giúp ạ.
1644152063600.png
 

File đính kèm

Rất cảm ơn bạn. Bởi vì mình chưa học qua VBA nên đã làm theo hướng dẫn của bạn nhưng không thực hiện được. Rất mong bạn thực hiện và gửi file giúp ạ.
Tôi quên không hướng dẫn.

Không nên dùng tên sheet có dấu tiếng Việt.

Hãy đổi tên sheet thành "Du lieu nguon" và "Du lieu ket qua". Nếu trong tương lai đổi thành tên khác thì tìm trong code "Du lieu nguon" và "Du lieu ket qua" và đổi theo.

Lần sau khi xuất hiên cửa sổ như bạn đính kèm thì nhấn "debug" thì bạn sẽ biết sai ở đâu.
 
Tôi quên không hướng dẫn.

Không nên dùng tên sheet có dấu tiếng Việt.

Hãy đổi tên sheet thành "Du lieu nguon" và "Du lieu ket qua". Nếu trong tương lai đổi thành tên khác thì tìm trong code "Du lieu nguon" và "Du lieu ket qua" và đổi theo.

Lần sau khi xuất hiên cửa sổ như bạn đính kèm thì nhấn "debug" thì bạn sẽ biết sai ở đâu.
Thật kỳ diệu :yeah:. Nếu bạn có mở lớp đào tạo excel online liên quan các dữ liệu thuộc lĩnh vực Nhân sự, vui lòng gửi thông tin liên lạc để mình tham khảo và đăng ký học nhé. Cảm ơn bạn lần nữa.
 
Thật kỳ diệu :yeah:. Nếu bạn có mở lớp đào tạo excel online liên quan các dữ liệu thuộc lĩnh vực Nhân sự, vui lòng gửi thông tin liên lạc để mình tham khảo và đăng ký học nhé. Cảm ơn bạn lần nữa.
Tôi bây giờ chỉ thích hưởng thụ thôi bạn. Ăn ngon, ngủ ngon, giao lưu bạn bè và ngắm cái đẹp.
 
Web KT

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

Back
Top Bottom