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

  • Thread starter Thread starter haudk8
  • Ngày gửi Ngày gửi
Liên hệ QC

haudk8

Thành viên chính thức
Tham gia
12/8/10
Bài viết
86
Được thích
7
Công ty em mới được lắp đặt máy chấm công. Máy chỉ có chức năng xuất dữ liệu ra excel (file đính kèm) mà không có báo cáo số công của từng nhân viên. Em muốn xử lý dữ liệu đó ra số công mà không biết cách làm thế nào, mong các bác giúp em với. Công ty em quy định: Nếu đi sớm thì không được tính thời gian làm việc, về muộn thì được tính thời gian làm thêm giờ, đi muộn và về sớm thì thời gian bị trừ theo từng ngày. Cuối tháng sẽ cộng dồn thời gian đi làm muộn và về sớm để trừ lương.
Xin cảm ơn các bác trước nhá!
 
Dữ liệu ghi trong các cột từ cột 'Den Tre' không fải dạng số

Cho nên mới ra công được thôi;
Chờ thêm nữa mới tìm ra quy luật đổi sang thời gian cho bạn được

Xem trong file nha

PHP:
Option Explicit

Sub RaCong()
 Dim Sh As Worksheet, Rng As Range, sRng As Range, Cls As Range
 Dim MyAdd As String, sLoi As String
 Dim Thg As Byte, Nam As Integer
 Dim Tre As Double, TGio As Double, Dat As Date
 
 Set Sh = Sheets("MayGhi"):                     Sheets("Cong").Select
 Thg = [a1].Value:                              Nam = Year([A2].Value)
 Set Rng = Sh.Range(Sh.[a1], Sh.[a65500].End(xlUp))
 On Error GoTo LoiCT:                           sLoi = "@"
 [d6].Resize(200, 33).ClearContents
 For Each Cls In Range([A6], [a65500].End(xlUp))
   If Cls.Value <> "" Then
      Set sRng = Rng.Find(Cls.Value, , xlFormulas, xlWhole)
      If Not sRng Is Nothing Then
         MyAdd = sRng.Address
         Tre = 0:                               TGio = 0
         Do
            Dat = sRng.Offset(, 2).Value
            If Month(Dat) = Thg And Year(Dat) = Nam Then
               If sRng.Offset(, 5).Value <> "" And sRng.Offset(, 6).Value > 0 Then
1                 Cells(Cls.Row, 3 + Day(Dat)).Value = "X"
                  If sRng.Offset(, 7) > 0 And IsNumeric(sRng.Offset(, 7).Value) Then _
                     Tre = Tre + sRng.Offset(, 7).Value
3                 If sRng.Offset(, 8) > 0 And IsNumeric(sRng.Offset(, 8).Value) Then _
                     Tre = Tre + sRng.Offset(, 8).Value
                  If sRng.Offset(, 9) > 0 And IsNumeric(sRng.Offset(, 9).Value) Then _
                     TGio = TGio + sRng.Offset(, 9).Value
               End If
            End If
            Set sRng = Rng.FindNext(sRng)
         Loop While Not sRng Is Nothing And sRng.Address <> MyAdd
         If Tre > 0 Then Cells(Cls.Row, "AI").Value = Tre
         If TGio > 0 Then Cells(Cls.Row, "AJ").Value = TGio
         Tre = 0:                               TGio = 0
      Else:                                     MsgBox "Nothing"
      End If
   End If
 Next Cls
Err_:                                           Exit Sub
LoiCT:
   If Err = 13 Then
      If InStr(sLoi, sRng.Address) < 1 Then sLoi = sLoi & sRng.Address
      Resume Next
   Else
      Resume Err_
   End If
End Sub
 

File đính kèm

Cảm ơn bạn đã quan tâm. Rất mong bạn giúp đỡ.
 
Dữ liệu từ cột 'H' về sau của bạn chỉ đa số (chứ không hoàn toàn) dạng TETXT!

Nên khi dùng macro này thay thế cái trên; Ở bảng tổng hợp vẫn còn thiếu 1 số số liệu chưa được cộng vô.
Số nào đã được ghi vô số liệu tổng hợp sẽ có màu nền được sơn (bỡi macro)
(Chú ý có những số liệu tháng 05 được mình tô màu vàng ở cột 2 đó nghe)

Thật quái dị với dữ liệu này thế chứ?!

PHP:
Option Explicit

Sub RaCong()
 Dim Sh As Worksheet, Rng As Range, sRng As Range, Cls As Range
 Dim MyAdd As String, sTG As String, sLoi As String
 Dim Thg As Byte, Tre As Double, TrGio As Double, Dat As Date
 Dim Gio As Integer, Phut As Integer, Gy As Integer, Nam As Integer
 
 
 Set Sh = Sheets("MayGhi"):                     Sheets("Cong").Select
 Thg = [a1].Value:                              Nam = Year([A2].Value)
 Set Rng = Sh.Range(Sh.[a1], Sh.[a65500].End(xlUp))
 On Error GoTo LoiCT:                           sLoi = "@"
 [d6].Resize(200, 33).ClearContents
 For Each Cls In Range([A6], [a65500].End(xlUp))
   If Cls.Value <> "" Then
      Set sRng = Rng.Find(Cls.Value, , xlFormulas, xlWhole)
      If Not sRng Is Nothing Then
         MyAdd = sRng.Address
         Tre = 0:                               TrGio = 0
         Do
            Dat = sRng.Offset(, 2).Value
            If Month(Dat) = Thg And Year(Dat) = Nam Then
               If sRng.Offset(, 5).Value <> "" And sRng.Offset(, 6).Value > 0 Then
1                 Cells(Cls.Row, 3 + Day(Dat)).Value = "X"

                  If sRng.Offset(, 7) <> "" Then
                     If IsNumeric(sRng.Offset(, 7)) Then MsgBox "IsNumeric", , "7"
                     Tre = Tre + QuyDoi(sRng.Offset(, 7).Value)
                     sRng.Offset(, 7).Interior.ColorIndex = 30 + Cls.Row
                  End If
                  If sRng.Offset(, 8) <> "" Then
                     If IsNumeric(sRng.Offset(, 7)) Then MsgBox "IsNumeric", , "8"
                     Tre = Tre + QuyDoi(sRng.Offset(, 8).Value)
                     sRng.Offset(, 8).Interior.ColorIndex = 31 + Cls.Row
                  End If
                  
                  If sRng.Offset(, 9) <> "" Then
                     TrGio = TrGio + QuyDoi(sRng.Offset(, 9).Value)
                  End If
               End If
            End If
            Set sRng = Rng.FindNext(sRng)
         Loop While Not sRng Is Nothing And sRng.Address <> MyAdd
         If Tre > 0 Then Cells(Cls.Row, "AI").Value = Tre
         If TrGio > 0 Then Cells(Cls.Row, "AJ").Value = TrGio
         Tre = 0:                               TrGio = 0
      Else:                                     MsgBox "Nothing"
      End If
   End If
 Next Cls
Err_:                                           Exit Sub
LoiCT:
   If Err = 13 Then
      If InStr(sLoi, sRng.Address) < 1 Then sLoi = sLoi & sRng.Address
      Resume Next
   Else
      Resume Err_
   End If
End Sub

Function QuyDoi(sTG As String) As Double
 Dim Gio As Integer, Phut As Integer, Gy As Integer
 
 Gy = CInt(Right(sTG, 2))
 If Len(sTG) > 6 Then
   Gio = CInt(Left(sTG, 2)):           Phut = CInt(Mid(sTG, 4, 2))
 ElseIf Len(sTG) > 3 Then
   Phut = CInt(Left(sTG, 2))
 End If
 QuyDoi = TimeSerial(Gio, Phut, Gy)
End Function
Chắc còn f ải mệt dài dài với chúng đây & xin trợ giúp từ cộng đồng!
 
Cảm ơn các bạn. Với dữ liệu kểu này thì rất khó xử lý. Mong cộng động giúp đỡ em với!
 
Không có ai giúp mình với à! Em nhờ cả nhà giúp em với.
 
Web KT

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

Back
Top Bottom