Tạo bảng chấm công tháng? (1 người xem)

Liên hệ QC

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

Delfy_Coltech

Thành viên mới
Tham gia
5/5/10
Bài viết
21
Được thích
4
Nghề nghiệp
Lecturer
Hi ACE,
Mình có một "Bảng ghi công chi tiết" theo thời gian vào/ra của nhân viên tại các phòng ban từng ngày trong tháng.

Bây giờ mình muốn tạo một Sheet " Chấm công" để lọc dữ liệu theo phòng ban và tính công cho từng người.
Xin các bạn trợ giúp cách làm!

Trong file mình có đưa ra ý tưởng cho sheet "Bảng chấm công". Bạn nào có cách giải quyết nào hay hơn xin chia sẻ! }}}}}

Thanks in advance! ^^
 

File đính kèm

Hi ACE,
Mình có một "Bảng ghi công chi tiết" theo thời gian vào/ra của nhân viên tại các phòng ban từng ngày trong tháng.

Bây giờ mình muốn tạo một Sheet " Chấm công" để lọc dữ liệu theo phòng ban và tính công cho từng người.
Xin các bạn trợ giúp cách làm!

Trong file mình có đưa ra ý tưởng cho sheet "Bảng chấm công". Bạn nào có cách giải quyết nào hay hơn xin chia sẻ! }}}}}

Thanks in advance! ^^
Trong sheet Bang cong chi tiet tôi thấy có người có giờ vào mà không có giờ ra! Trường hợp này tính sao?
 
Trong sheet Bang cong chi tiet tôi thấy có người có giờ vào mà không có giờ ra! Trường hợp này tính sao?

Thì bỏ trống không tính cột "Thời gian làm việc" Anh ạ!
Mong A chỉ giáo! ^^
 
Thì bỏ trống không tính cột "Thời gian làm việc" Anh ạ!
Mong A chỉ giáo! ^^
Có nhiều cách AutoFilter, AdFi, Dic ...
Dùng đỡ code sau thử nhé.
PHP:
Dim endR As Long, i As Long, s As Long, k As Long
Dim ArrCT(), ArrCC()
Dim iPhong As String
Sub TaoTH()
With Application
  .ScreenUpdating = False: .Calculation = xlCalculationManual
End With
With Sheets("CongChiTiet")
  endR = .Cells(65000, 1).End(xlUp).Row
  ArrCT = .Range("A6:H" & endR).Value
End With
ReDim ArrCC(1 To UBound(ArrCT), 1 To 8)
With Sheets("bangChamCong")
  iPhong = .[C4]
End With
s = 0
For i = 1 To UBound(ArrCT)
  If ArrCT(i, 3) = iPhong Then 'Neu phong = phong'
    If Len(ArrCT(i, 7)) > 0 Then 'neu gio ra <> ""
      s = s + 1
      ArrCC(s, 1) = s 'so TT'
      ArrCC(s, 2) = ArrCT(i, 1) 'ten NV'
      ArrCC(s, 3) = ArrCT(i, 5) 'Ngay'
      ArrCC(s, 4) = ArrCT(i, 6) 'Vao'
      ArrCC(s, 5) = ArrCT(i, 7) 'Ra'
      ArrCC(s, 8) = ArrCT(i, 8) 'TG'
      With WorksheetFunction
        ArrCC(s, 6) = .Max(CDate(ArrCC(s, 4)) - CDate("08:00:00 AM"), 0) 'di tre'
        ArrCC(s, 7) = .Max(CDate("05:00:00 PM") - CDate(ArrCC(s, 5)), 0) 've som'
      End With
    End If
  End If
Next i
If s = 0 Then GoTo bien
With Sheets("bangChamCong")
  .[A7].Resize(s, 8) = ArrCC
End With
Erase ArrCT(), ArrCC()
bien:
With Application
  .ScreenUpdating = True: .Calculation = xlCalculationAutomatic
End With
End Sub
 

File đính kèm

Theo mình thì nên đổi lài kết cấu trang 'Bang Cham Cong'

Lúc đó [Ngày] trong tháng sẽ được bố trí tăng dần theo cột các ngày của tháng; Lúc đó ta tận dụng được lợi thế của CF đối với các ngày thứ bảy hay chủ nhựt.

Nếu cần thì tách riêng bảng chấm công thời gian làm việc riêng 1 table, bảng đi muộn về sớm có thể riêng làm 2 hay 1 bảng tùy mức độ đi muộn về sớm của nhân viên cơ quan bạn;

Trong các bảng này, chỉ bảng đầu tiên có fần tổng hợp thôi; các bảng còn lại chỉ giống như ghi chép số liệu trực quan cho bảng tổng hợp công này.

Mà sao bạn dùng tên trang tính lê thê làm vậy; Theo mình chỉ nên là [ChiTiet] & [BCCg] là OK rồi!

Thân ái!

Bạn tham khảo thêm:
http://www.giaiphapexcel.com/forum/showthread.php?39213-Ch%E1%BA%A5m-c%C3%B4ng-cho-c%C3%B4ng-nh%C3%A2n-t%E1%BB%AB-d%E1%BB%AF-li%E1%BB%87u-m%C3%A1y-ch%E1%BA%A5m-c%C3%B4ng
http://www.giaiphapexcel.com/forum/showthread.php?34716-Cách-tính-tổng-số-giờ-làm-thêm.
http://giaiphapexcel.com/forum/showthread.php?29363-Bảng-chấm-công
http://www.giaiphapexcel.com/forum/showthread.php?38627-Theo-dõi-và-tổng-hợp-bảng-chấm-công
http://www.giaiphapexcel.com/forum/showthread.php?12610-Hàm-chấm-công-và-tính-lương#16
 
Chỉnh sửa lần cuối bởi điều hành viên:
Cảm ơn bạn!
Tuy nhiên cách này của bạn chưa thực thi đúng hoàn toàn.
Giả sử lúc đầu bạn để mặc định là Phòng Đào tạo, nhưng khi chọn Khoa CNTT chẳng hạn, thì danh sách nhân viên của Khoa CNTT sẽ được ghi đè lên cột Họ tên.
Và DS nhân viên cũ không bị xoá đi mà vẫn ở phía dưới nếu như DS nhân viên Khoa CNTT ngắn hơn DS nhân viên trong Phòng Đào tạo.

- Bạn fix lại giúp mình nhé!
Với cả nếu bạn sắp thứ tự theo tên nhân viên được luôn thì nhìn bảng công sẽ đẹp hơn. Theo kiểu PivotTable.
 
Cảm ơn bạn!
Tuy nhiên cách này của bạn chưa thực thi đúng hoàn toàn.
Giả sử lúc đầu bạn để mặc định là Phòng Đào tạo, nhưng khi chọn Khoa CNTT chẳng hạn, thì danh sách nhân viên của Khoa CNTT sẽ được ghi đè lên cột Họ tên.
Và DS nhân viên cũ không bị xoá đi mà vẫn ở phía dưới nếu như DS nhân viên Khoa CNTT ngắn hơn DS nhân viên trong Phòng Đào tạo
.
Đó là vì ThuNghi quên xóa dữ liệu cũ đấy mà
trong code có đoạn
PHP:
With Sheets("bangChamCong")
  iPhong = .[C4]
End With
Hãy sửa thành:
PHP:
With Sheets("bangChamCong")
  .Range("A7:H60000").ClearContents
  iPhong = .[C4]
End With
 
Cảm ơn ThuNghi đã và anh NDU đã giúp đỡ,
Bi giờ Em muốn thêm chức năng sau:

1. Tự động Sort theo tên abc, nếu cùng là tên 1 nhân viên thì merge các ô đó lại và thay thế bằng 1 tên nhân viên duy nhất của người đó.

2. Bố trí thêm 1 dòng (Hoặc 1 phương án nào đó) để tính tổng thời gian làm việc trong tháng cho từng nhân viên.

Đây là file Em đã edit lại theo hướng dẫn của các anh.
 

File đính kèm

Cảm ơn ThuNghi đã và anh NDU đã giúp đỡ,
Bi giờ Em muốn thêm chức năng sau:

1. Tự động Sort theo tên abc, nếu cùng là tên 1 nhân viên thì merge các ô đó lại và thay thế bằng 1 tên nhân viên duy nhất của người đó.

2. Bố trí thêm 1 dòng (Hoặc 1 phương án nào đó) để tính tổng thời gian làm việc trong tháng cho từng nhân viên.
1/ Sort thì phải sort theo mã NV thôi. Nếu NV trùng tên thì sao, vậy sh BangChamCong nên thêm cột mã trước cột tên.
2/ Ý là thêm 1 dòng để tính số tổng giờ của NV. Vậy bạn muốn thêm ở trên hay ở dưới cùng.
3/ Phần code nếu =0 thì lấy "" có thể bỏ, mình sẽ dùng excel option không lấy zero.
4/ Phần mã thẻ giống nhau thì kg merge mà dùng conditional format.

Mới làm cái code sort bạn muốn thêm dòng tổng vào đâu thì yêu cầu. Bạn khá là nắm bắt về VBA đó.

Bạn lấy file kèm lại nhé.

Edit lại code có dòng tổng cộng. Nhưng chưa OK vấn đề format. Bạn nhớ bỏ cái Table2 vì nó chỉ có 200 dòng.
PHP:
Dim endR As Long, i As Long, s As Long, k As Long
Dim ArrCT(), ArrCC()
Dim iPhong As String
Dim myRng As Range
Sub TaoTH()
With Application
  .ScreenUpdating = False: .Calculation = xlCalculationManual
End With
With Sheets("CongChiTiet")
  endR = .Cells(65000, 1).End(xlUp).Row
  ArrCT = .Range("A6:H" & endR).Value
End With
ReDim ArrCC(1 To UBound(ArrCT), 1 To 9)
With Sheets("BangChamCong")
  .Range("A11:I1000").ClearContents 'Xoa du lieu cu'
  iPhong = .[C8]
End With

'THUC HIEN TINH TOAN'
s = 0
For i = 1 To UBound(ArrCT)
If ArrCT(i, 3) = iPhong Then
  s = s + 1
  'ArrCC(s, 1) = s 'so TT''
  ArrCC(s, 2) = CStr(ArrCT(i, 2)) 'mathe'
  ArrCC(s, 3) = ArrCT(i, 1) 'Ten NV'
  ArrCC(s, 4) = ArrCT(i, 5) 'Ngay'
  ArrCC(s, 5) = ArrCT(i, 6) 'Gio vao'
  ArrCC(s, 6) = ArrCT(i, 7) 'Gio ra'
  ArrCC(s, 9) = ArrCT(i, 8) 'TG lam viec'
  If Len(ArrCT(i, 7)) > 0 Then
    With WorksheetFunction
      ArrCC(s, 7) = .Max(CDate(ArrCC(s, 5)) - CDate("08:00:00 AM"), 0) 'Di muon'
      ArrCC(s, 8) = .Max(CDate("05:00:00 PM") - CDate(ArrCC(s, 6)), 0) 'Ve som'
    End With
  Else
  ArrCC(s, 6) = "No" ' Khong quet the'
  End If

End If
Next i
If s = 0 Then GoTo Escape
With Sheets("bangChamCong")
  .[A11].Resize(s, 9) = ArrCC
  Set myRng = .[A11].Resize(s, 8)
End With
Erase ArrCT(), ArrCC()
SortBCC
Set myRng = Nothing
GanTotal
Escape:
With Application
  .ScreenUpdating = True: .Calculation = xlCalculationAutomatic
End With
End Sub
Sub SortBCC()
With myRng
 .Sort Key1:=Cells(1, 2), Order1:=xlAscending, Header:=xlGuess, _
        OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
End With
End Sub
Sub GanTotal()
s = 0
With Sheets("BangChamCong")
  endR = .Cells(1000, 2).End(xlUp).Row
  For i = endR To 11 Step -1
    s = s + 1
    If .Cells(i, 2) <> .Cells(i - 1, 2) Then
      .Rows(i).Insert Shift:=xlDown
      .Cells(i, 3) = "Total of Maso " & .Cells(i + 1, 3).Value
      With .Cells(i, 9)
        .FormulaR1C1 = "=SUBTOTAL(9,R" & i + 1 & "C:R" & i + s & "C)"
      End With
      s = 0
    End If
  Next i
End With
End Sub
 

File đính kèm

Lần chỉnh sửa cuối:
Mới làm cái code sort bạn muốn thêm dòng tổng vào đâu thì yêu cầu. Bạn khá là nắm bắt về VBA đó.
--> Bạn cứ thể hiện theo ý bạn xem thế nào. Mình cũng đang nghĩ xem bố trí sao cho đẹp mắt.
Mình định thêm một vùng Tổng hợp gồm các thành phần như: Số ngày đi muộn, số ngày về sớm, tổng TG làm việc của nhân viên trong tháng. Nhưng chưa bít làm thế nào cho đẹp và tiện lợi khi in báo cáo.

Cảm ơn sự nhiệt tình của ThuNghi, thực sự mình mới bước vào thế giới GPE thôi.
Trước kia, mình nghĩ Excel chẳng qua chỉ là cái bảng tính đơn giản, mà chỉ có dân kế toán mới hay dùng. Nên cũng không học hành gì.
Nhưng rồi công việc càng ngày càng cần đến Excel. Và tìm thấy một nơi rất thú vị để cùng học hỏi và chia sẻ với tất cả ACE - Đó là Diễn đàn Giải pháp Excel.

Về VBA, mình mới chỉ tìm hiểu từ đêm qua. Nhờ có bạn ThuNghi mở đường chỉ lối. :) Nên còn non lắm.
Mình thường lập trình C# nên chắc quen đọc code thôi.

Rất vui được học hỏi và trao đổi với tất cả ACE trên diễn đàn! ^^
 
Lần chỉnh sửa cuối:
Chấm công tới đâu thì khóa lại tới đó.

Tôi muốn bảng công sau khi save thì khóa lại, (nghĩa là chưa save thì vẫn sửa được)
 

File đính kèm

The first version...

Hi all,
Mình share cho mọi người bảng tổng hợp chấm công mình đã làm nhờ sự hướng dẫn của một số ace trên 4rum.

Have a nice day! ^^ ;;;;;;;;;;;
 

File đính kèm

Hi all,
Mình share cho mọi người bảng tổng hợp chấm công mình đã làm nhờ sự hướng dẫn của một số ace trên 4rum.

Have a nice day! ^^ ;;;;;;;;;;;
Bạn mau tiến bộ đấy, xin góp vài ý
1/ Đã làm VBA thì VBA luôn, ct làm gì
2/ Sh PhongBan hầu như ít thay đổi, nếu có thì mình làm thêm 1 code cập nhật để tạo ra Range hay table PhongBan => validation
3/ Sh BangCongThang
- Dòng ngày trong tháng là biến trích lọc ngày duy nhất của tất cả NV trong tháng X, nếu tháng có 28 ngày thì chả lẽ cột cộng cả tháng kế. Dòng tiêu đề ngày nên xem lại các ngày cuối tháng, vd if EOMONTH(...)
- Cũng là KQ của Sh BangChamCong thì dùng code luôn.
Tóm lại viết code trích ra sh này luôn.
Ráng lên bạn nhé.
 
Thank you so much!
1. Vì VBA mình còn non nên kết hợp cả hai để giải quyết vấn đề cho kịp tiến độ. ^^
2. Đồng ý với ThuNghi, dùng code sẽ ngắn gọn hơn
3. Vì dữ liệu là xuất theo từng tháng. Nên tuy tháng có 28 ngày nó hiện cả ngày của tháng kế nhưng những ngày này ko có dữ liệu fill vào nên không sợ bị cộng như bạn nói. Tuy nhiên, code được thì vẫn tốt hơn! :)

Mình sẽ cố gắng xử lý toàn bộ bằng VBA.

Thân,
 
Thank you so much!
1. Vì VBA mình còn non nên kết hợp cả hai để giải quyết vấn đề cho kịp tiến độ. ^^
2. Đồng ý với ThuNghi, dùng code sẽ ngắn gọn hơn
3. Vì dữ liệu là xuất theo từng tháng. Nên tuy tháng có 28 ngày nó hiện cả ngày của tháng kế nhưng những ngày này ko có dữ liệu fill vào nên không sợ bị cộng như bạn nói. Tuy nhiên, code được thì vẫn tốt hơn! :)

Mình sẽ cố gắng xử lý toàn bộ bằng VBA.

Thân,
Mình thử dùng code làm các yêu cầu của bạn theo file sau.
Code hơi dài dòng và luộm thuộm.
 

File đính kèm

Oh bạn thật là nhiệt tình! ^^
Code không hề dài đâu ThuNghi ạ! Mình rất hoan nghênh.:<>
Tuy nhiên, cho mình hỏi luôn nếu dùng code có thể cho thực thi ngay khi fill dữ liệu vào bảng chi tiết không? Có nghĩa là bên "Bảng chấm công" không cần cái button ENTER!
 
Oh bạn thật là nhiệt tình! ^^
Code không hề dài đâu ThuNghi ạ! Mình rất hoan nghênh.:<>
Tuy nhiên, cho mình hỏi luôn nếu dùng code có thể cho thực thi ngay khi fill dữ liệu vào bảng chi tiết không? Có nghĩa là bên "Bảng chấm công" không cần cái button ENTER!
Nghiên cứu các sự kiện worksheet_change...
Bạn thay code file trên như sau, gọn hơn 1 chút, kg cần lấy dòng 1.
PHP:
' CHUONG TRINH XU LY DU LIEU CHO PHAN MEM QUAN LY VAO/RA CHAM CONG '
' RFID_COLTECH 1.0                                                 '
' MECHATRONICS LAB, TRUONG DAI HOC CONG NGHE, DHQG HA NOI          '
Option Explicit
Dim endR As Long, i As Long, s As Long, k As Long, endM As Long, fM As Long
Dim ArrCT(), ArrCC(), Arr(), ArrTotalDM(), ArrTotalCT()
Dim iPhong As String
Dim myRng As Range
Dim Dic As Object
Dim Wf As WorksheetFunction
Dim fDate As Date, iDate As Date
Sub TaoTH()
Set Wf = WorksheetFunction
With Application
  .ScreenUpdating = False: .Calculation = xlCalculationManual
End With
With Sheets("Bangchitiet")
  endR = .Cells(1000, 1).End(xlUp).Row
  ArrCT = .Range("A6:I" & endR).Value
End With
ReDim ArrCC(1 To UBound(ArrCT), 1 To 8)
With Sheets("BangChamCong")
  .Range("A11:I1000").ClearContents 'Xoa du lieu cu'
  iPhong = .[C8]
End With
'THUC HIEN TINH TOAN'
s = 0
For i = 1 To UBound(ArrCT)
  If ArrCT(i, 4) = iPhong Then
    s = s + 1
    'ArrCC(s, 1) = s 'So TT''
    ArrCC(s, 1) = CStr(ArrCT(i, 3)) 'Mathe'
    ArrCC(s, 2) = ArrCT(i, 2) 'Ten NV'
    ArrCC(s, 3) = ArrCT(i, 6) 'Ngay'
    ArrCC(s, 4) = ArrCT(i, 7) 'Gio vao'
    ArrCC(s, 5) = ArrCT(i, 8) 'Gio ra'
    ArrCC(s, 8) = ArrCT(i, 9) 'TG lam viec'
    If Len(ArrCT(i, 8)) > 0 Then
      With Wf
        ArrCC(s, 6) = .Max(CDate(ArrCC(s, 4)) - CDate("08:00:00 AM"), 0) 'Di muon'
        ArrCC(s, 7) = .Max(CDate("05:00:00 PM") - CDate(ArrCC(s, 5)), 0) 'Ve som'
      End With
    Else
    ArrCC(s, 5) = "No" ' Khong quet the'
    End If
     'Truong hop khong vi pham'
        If ArrCC(s, 6) = 0 Then
          ArrCC(s, 6) = ""
        End If
        If ArrCC(s, 7) = 0 Then
          ArrCC(s, 7) = ""
        End If
  End If
Next i
If s = 0 Then GoTo Escape
With Sheets("BangChamCong")
  .[A11].Resize(s, 8) = ArrCC
  Set myRng = .[A11].Resize(s, 8)
End With
Erase ArrCT(), ArrCC()
SortBCC
'tao dong ngay tren sh bangcongthang
TaoDongNgay
TaoTHMonth
Erase ArrCC(), Arr(), ArrTotalDM(), ArrTotalCT()
Set myRng = Nothing: Set Wf = Nothing
Escape:
With Application
  .ScreenUpdating = True: .Calculation = xlCalculationAutomatic
End With
End Sub
Sub TaoTHMonth()
ReDim ArrTotalDM(1 To UBound(ArrCC), 1 To 3)
ReDim ArrTotalCT(1 To UBound(ArrCC), 1 To 32)
s = 1
For i = 1 To UBound(ArrCC) - 1
  k = Day(ArrCC(i, 3)) - 1
  ArrTotalDM(s, 1) = s  'stt
  ArrTotalDM(s, 2) = ArrCC(i, 2) 'ten
  ArrTotalDM(s, 3) = ArrCC(i, 1)  'ma
  ArrTotalCT(s, k) = ArrCC(i, 8)  'TG
  ArrTotalCT(s, 32) = ArrTotalCT(s, 32) + ArrTotalCT(s, k) ' TG total
  If ArrCC(i + 1, 1) <> ArrTotalDM(s, 3) Then s = s + 1
Next i
With Sheets("Bangcongthang")
  .Range("A4:AJ1000").ClearContents
  With .[A4]
    .Resize(s, 3) = ArrTotalDM
  End With
  With .[D4]
    .Resize(s, 32) = ArrTotalCT
  End With
End With
End Sub
Sub TaoDongNgay()
Dim k As Long
'tao bangcongthang
s = s + 10
'tao lai arr theo da sort
With Sheets("BangChamCong")
  ArrCC = .Range("A11:H" & s + 1).Value
  Set myRng = .Range("C11:C" & s)
  fDate = Wf.Min(myRng)
End With
endM = Day(DateSerial(Year(fDate), Month(fDate) + 1, 0))
'phuc tap vi muon dua ve 1
fM = Day(fDate): k = fM - 1
ReDim Arr(fM - k To endM - k)
For i = fM - k To endM - k
  iDate = DateSerial(Year(fDate), Month(fDate), i + k)
  Arr(i) = CDate(iDate)
Next i
With Sheets("Bangcongthang")
  With .[D3]
    .Resize(1, 31).ClearContents
    .Resize(1, endM - fM + 1) = Arr
  End With
End With
End Sub
Sub SortBCC()
With myRng
 .Sort Key1:=myRng.Cells(1, 1), Order1:=xlAscending, Key2:=myRng.Cells(1, 3), Order1:=xlAscending, Header:=xlGuess, _
        OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
End With
End Sub
 
Lần chỉnh sửa cuối:
Web KT

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

Back
Top Bottom