Xử lý dữ liệu từ máy chấm công

Liên hệ QC

ngaykhong

Thành viên mới
Tham gia
10/9/14
Bài viết
5
Được thích
0
Chào các bác,
Công ty mình xuất dữ liệu từ máy chấm công như file gửi kèm. Cứ một lần ra vào cửa thì nhân viên sẽ quét thẻ vào máy 1 lần để mở cửa và máy sẽ ghi nhận lại nên khi xuất dữ liệu máy sẽ xuất ra tất cả n lần ra/vào của 1 nhân viên trong ngày hôm đó. Mình cần thống kê giờ đầu tiên và lần cuối cùng nhân viên ra/vào cửa trong một ngày để chấm công cho nv còn các giờ khác trong có thể xóa đi. Các bác hướng dẫn mình hàm nào có thể giải quyết được như nhu cầu của mình không.
 

File đính kèm

  • cham cong.xlsx
    13.7 KB · Đọc: 23
Chào các bác,
Công ty mình xuất dữ liệu từ máy chấm công như file gửi kèm. Cứ một lần ra vào cửa thì nhân viên sẽ quét thẻ vào máy 1 lần để mở cửa và máy sẽ ghi nhận lại nên khi xuất dữ liệu máy sẽ xuất ra tất cả n lần ra/vào của 1 nhân viên trong ngày hôm đó. Mình cần thống kê giờ đầu tiên và lần cuối cùng nhân viên ra/vào cửa trong một ngày để chấm công cho nv còn các giờ khác trong có thể xóa đi. Các bác hướng dẫn mình hàm nào có thể giải quyết được như nhu cầu của mình không.
Thử giải pháp kết hợp giữa Pivot Table và công thức.
Xem file kèm.

Thân
 

File đính kèm

  • cham cong.xlsx
    20.2 KB · Đọc: 26
Chào các bác,
Công ty mình xuất dữ liệu từ máy chấm công như file gửi kèm. Cứ một lần ra vào cửa thì nhân viên sẽ quét thẻ vào máy 1 lần để mở cửa và máy sẽ ghi nhận lại nên khi xuất dữ liệu máy sẽ xuất ra tất cả n lần ra/vào của 1 nhân viên trong ngày hôm đó. Mình cần thống kê giờ đầu tiên và lần cuối cùng nhân viên ra/vào cửa trong một ngày để chấm công cho nv còn các giờ khác trong có thể xóa đi. Các bác hướng dẫn mình hàm nào có thể giải quyết được như nhu cầu của mình không.
Bạn xem.Mà mình không hiểu cao thủ là gi.Cao thủ có nghĩa là đầu cao à.
Mã:
Sub laydulieu()
    Dim arr, i As Long, dk As String, kq, dic As Object, lr As Long, b As Long, a As Long, j As Long
    Set dic = CreateObject("scripting.dictionary")
    a = 1
    With Sheets("sheet1")
         lr = .Range("A" & Rows.Count).End(xlUp).Row
         If lr < 3 Then Exit Sub
         arr = .Range("A3:D" & lr).Value
         ReDim kq(1 To UBound(arr), 1 To 5)
         For i = 1 To UBound(arr)
             dk = arr(i, 1) & "#" & arr(i, 2)
             If Not dic.exists(dk) Then
                dic.Add dk, a
                For j = 1 To 4
                   kq(a, j) = arr(i, j)
                Next j
                kq(a, 5) = "gio vao"
                a = a + 2
             Else
               b = dic.Item(dk) + 1
               For j = 1 To 4
                  kq(b, j) = arr(i, j)
               Next j
               kq(b, 5) = "gio ra"
             End If
        Next i
        lr = .Range("I" & Rows.Count).End(xlUp).Row
        If lr > 2 Then .Range("I3:M" & lr).ClearContents
        If a Then .Range("I3:M3").Resize(a - 1).Value = kq
   End With
End Sub
 

File đính kèm

  • cham cong.xlsm
    20.2 KB · Đọc: 32
Bạn xem.Mà mình không hiểu cao thủ là gi.Cao thủ có nghĩa là đầu cao à.
Mã:
Sub laydulieu()
    Dim arr, i As Long, dk As String, kq, dic As Object, lr As Long, b As Long, a As Long, j As Long
    Set dic = CreateObject("scripting.dictionary")
    a = 1
    With Sheets("sheet1")
         lr = .Range("A" & Rows.Count).End(xlUp).Row
         If lr < 3 Then Exit Sub
         arr = .Range("A3:D" & lr).Value
         ReDim kq(1 To UBound(arr), 1 To 5)
         For i = 1 To UBound(arr)
             dk = arr(i, 1) & "#" & arr(i, 2)
             If Not dic.exists(dk) Then
                dic.Add dk, a
                For j = 1 To 4
                   kq(a, j) = arr(i, j)
                Next j
                kq(a, 5) = "gio vao"
                a = a + 2
             Else
               b = dic.Item(dk) + 1
               For j = 1 To 4
                  kq(b, j) = arr(i, j)
               Next j
               kq(b, 5) = "gio ra"
             End If
        Next i
        lr = .Range("I" & Rows.Count).End(xlUp).Row
        If lr > 2 Then .Range("I3:M" & lr).ClearContents
        If a Then .Range("I3:M3").Resize(a - 1).Value = kq
   End With
End Sub
Hihi thanks bạn rất nhiều.
 
Thử giải pháp kết hợp giữa Pivot Table và công thức.
Xem file kèm.

Thân

Em chào anh ạ.
Bên phía công ty em cũng lấy dữ liệu từ máy chấm công ra ( từ cột A tới cột F trong file ạ ).
Còn phần phía sau là em xử lý bằng công thức.
Anh có thể hướng dẫn em xử lý thêm bằng Pivot Table được không ạ.

Em cảm ơn anh nhiều.
 

File đính kèm

  • Chấm công.xlsx
    313.4 KB · Đọc: 14
Mình thử với 4 cột đầu bằng VBA :
PHP:
Sub TinhCong()
 Dim Rws As Long, Gio As Integer
 Dim Arr()
 
 Rws = [B2].CurrentRegion.Rows.Count
 Arr() = [A2].Resize(Rws, 6).Value
 ReDim aKQ(1 To Rws, 1 To 4)
 For j = 1 To UBound(Arr())
    Gio = Hour(Arr(j, 4))
    aKQ(j, 1) = TimeSerial(Gio, Minute(Arr(j, 4)), 0)
    aKQ(j, 2) = Day(Arr(j, 4))
    If Right(Arr(j, 4), 2) = "AM" And Arr(j, 5) = 240 Then
        aKQ(j, 3) = "In"
    ElseIf Right(Arr(j, 4), 2) = "PM" And Arr(j, 5) = 240 Then
        aKQ(j, 3) = "Out"
    Else
        If Arr(j, 5) = 241 Then
            aKQ(j, 3) = "In"
        Else
            aKQ(j, 3) = "Out"
        End If
    End If
    If aKQ(j, 3) = "In" Then aKQ(j, 4) = Gio
 Next j
 [G2].Resize(Rws, 4).Value = aKQ()
End Sub
 
Tạo 2 hàm Dax lấy Min và Max Time:
Mindate=Min('chamcong'[Time])
Maxdate=Max('chamcong'[Time)

1619842545604.png
 
Mình thử với 4 cột đầu bằng VBA :
PHP:
Sub TinhCong()
Dim Rws As Long, Gio As Integer
Dim Arr()

Rws = [B2].CurrentRegion.Rows.Count
Arr() = [A2].Resize(Rws, 6).Value
ReDim aKQ(1 To Rws, 1 To 4)
For j = 1 To UBound(Arr())
    Gio = Hour(Arr(j, 4))
    aKQ(j, 1) = TimeSerial(Gio, Minute(Arr(j, 4)), 0)
    aKQ(j, 2) = Day(Arr(j, 4))
    If Right(Arr(j, 4), 2) = "AM" And Arr(j, 5) = 240 Then
        aKQ(j, 3) = "In"
    ElseIf Right(Arr(j, 4), 2) = "PM" And Arr(j, 5) = 240 Then
        aKQ(j, 3) = "Out"
    Else
        If Arr(j, 5) = 241 Then
            aKQ(j, 3) = "In"
        Else
            aKQ(j, 3) = "Out"
        End If
    End If
    If aKQ(j, 3) = "In" Then aKQ(j, 4) = Gio
Next j
[G2].Resize(Rws, 4).Value = aKQ()
End Sub
Em cảm ơn anh ạ
Bài đã được tự động gộp:

Tạo 2 hàm Dax lấy Min và Max Time:
Mindate=Min('chamcong'[Time])
Maxdate=Max('chamcong'[Time)

View attachment 257898
Tạo 2 hàm Dax lấy Min và Max Time:
Mindate=Min('chamcong'[Time])
Maxdate=Max('chamcong'[Time)

View attachment 257898
Em cảm ơn anh.
Để e thử làm xem ạ
 
Bạn ơi, Có Cách nào để giờ ra và giờ vào trên 1 hàng không vậy ? Cho tiện tính giờ công !!
Bài đã được tự động gộp:

Bạn ơi, Có Cách nào để giờ ra và giờ vào trên 1 hàng không vậy ? Cho tiện tính giờ công !!
 

File đính kèm

  • Cham cong 1 hang.xlsm
    70.9 KB · Đọc: 11
Lần chỉnh sửa cuối:
Bạn ơi, Có Cách nào để giờ ra và giờ vào trên 1 hàng không vậy ? Cho tiện tính giờ công !!
 
Bạn ơi, Có Cách nào để giờ ra và giờ vào trên 1 hàng không vậy ? Cho tiện tính giờ công !!
Bạn làm như sau: Sử dụng Power Pivot
1620948468698.png

Nói chung nên sử dụng trong power bi, sử dụng Power pivot trong excel hơi lằng nhằng, không hỗ trợ như power pivot trong power bi. Nhưng tiện lợi là bạn sử dụng được luôn trong excel. Tuỳ sở thích hay thói quen từng người thôi.
VBA bạn không tuỳ biến được, muốn tuỳ biến bạn phải biết về nó, không lẽ mỗi lần muốn sửa gì lại mất công hỏi hoặc phải nâng cao năng lực VBA.
Nên sử dụng công cụ mạnh mà excel sẵn có là tốt nhất.
 

File đính kèm

  • Cham cong 1 hang-send.xlsm
    202.9 KB · Đọc: 10
Bạn tham khảo cách cùi bắp này: Tốc độ không đến nổi nào
 

File đính kèm

  • NhanSu.rar
    82.8 KB · Đọc: 14
Bạn tham khảo cách cùi bắp này: Tốc độ không đến nổi nào
Code chạy ngon mà bác. Chỉ là tôi chưa biết nếu đặt điều kiện để đến dòng dưới cùng của key mới ghi kết quả giờ ra thì code chạy có nhanh hơn cách của bác là dòng nào cũng ghi, dòng sau đè lên kết quả dòng trước?

Và cũng mạn phép sửa code của bác chút để đúng với mong muốn của chủ thớt!
Rich (BB code):
Sub laydulieu()
    Dim arr, i As Long, dk As String, kq, dic As Object, lr As Long, b As Long, a As Long, J As Long
    Set dic = CreateObject("scripting.dictionary")
    a = 1
    With Sheets("sheet1")
         lr = .Range("A" & Rows.Count).End(xlUp).Row
         If lr < 3 Then Exit Sub
         arr = .Range("A3:D" & lr).Value
         ReDim kq(1 To UBound(arr), 1 To 5)
         For i = 1 To UBound(arr)
             dk = arr(i, 1) & "#" & arr(i, 2)
             If Not dic.exists(dk) Then
                dic.Add dk, a
                For J = 1 To 4
                   kq(a, J) = arr(i, J)
                Next J
                a = a + 1
             Else
               kq(dic.Item(dk), 5) = arr(i, 4)
             End If
        Next i
        lr = .Range("I" & Rows.Count).End(xlUp).Row
        If lr > 2 Then .Range("I3:M" & lr).ClearContents
        If a Then .Range("I3:M3").Resize(a - 1).Value = kq
   End With
End Sub
 
Bạn làm như sau: Sử dụng Power Pivot
View attachment 258562

Nói chung nên sử dụng trong power bi, sử dụng Power pivot trong excel hơi lằng nhằng, không hỗ trợ như power pivot trong power bi. Nhưng tiện lợi là bạn sử dụng được luôn trong excel. Tuỳ sở thích hay thói quen từng người thôi.
VBA bạn không tuỳ biến được, muốn tuỳ biến bạn phải biết về nó, không lẽ mỗi lần muốn sửa gì lại mất công hỏi hoặc phải nâng cao năng lực VBA.
Nên sử dụng công cụ mạnh mà excel sẵn có là tốt nhất.
Cám ơn bạn nhiều ! Bạn làm sao để có Mintime và Maxtime vậy ?Min Max time.PNG
Bài đã được tự động gộp:

Code chạy ngon mà bác. Chỉ là tôi chưa biết nếu đặt điều kiện để đến dòng dưới cùng của key mới ghi kết quả giờ ra thì code chạy có nhanh hơn cách của bác là dòng nào cũng ghi, dòng sau đè lên kết quả dòng trước?

Và cũng mạn phép sửa code của bác chút để đúng với mong muốn của chủ thớt!
Rich (BB code):
Sub laydulieu()
    Dim arr, i As Long, dk As String, kq, dic As Object, lr As Long, b As Long, a As Long, J As Long
    Set dic = CreateObject("scripting.dictionary")
    a = 1
    With Sheets("sheet1")
         lr = .Range("A" & Rows.Count).End(xlUp).Row
         If lr < 3 Then Exit Sub
         arr = .Range("A3:D" & lr).Value
         ReDim kq(1 To UBound(arr), 1 To 5)
         For i = 1 To UBound(arr)
             dk = arr(i, 1) & "#" & arr(i, 2)
             If Not dic.exists(dk) Then
                dic.Add dk, a
                For J = 1 To 4
                   kq(a, J) = arr(i, J)
                Next J
                a = a + 1
             Else
               kq(dic.Item(dk), 5) = arr(i, 4)
             End If
        Next i
        lr = .Range("I" & Rows.Count).End(xlUp).Row
        If lr > 2 Then .Range("I3:M" & lr).ClearContents
        If a Then .Range("I3:M3").Resize(a - 1).Value = kq
   End With
End Sub
Cám ơn mấy anh em nhiều nha, kết quả đúng ý mình rồi !!
 
Viết 2 hàm Mintime=Min(table(time)) và Maxtime=Max(table(time)) trong Power Pivot đó bạn:
1620958392191.png
1620958416211.png
 
Em chào anh ạ

Anh có thể chỉ rõ cách thêm hàm vào trong pivot table được không ạ.
Em có tìm hiểu nhưng vẫn chưa được ạ
Bạn tạo Table dữ liệu, sau đó nạp vô data model và viết hàm trong Power Pivot nhé! Nếu bạn chưa có Tab Power Pivot thì bạn phải add vào mới sử dụng được. Hàm này là hàm Dax trong Power pivot nhé! Để viết hàm Dax thì bạn cần tìm hiểu 3 khái niệm: Rowcontext và Filter context và Transition Context
 
Web KT
Back
Top Bottom