Nhờ các anh chị diễn đàn viết code cho sheets chấm công (1 người xem)

Liên hệ QC

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

diemhuyenanh

Thành viên hoạt động
Tham gia
6/9/09
Bài viết
167
Được thích
58
em có file chấm công như đính kèm.em có biết chút ít về vba nhưng cái vụ chấm công này thì em chưa nghĩ ra giải thuật thế nào để giải quyết mong các anh chị giúp đỡyêu cầu: em ghi rõ trong file mong các anh chị giúp viết code cho sheet chấm công
 

File đính kèm

TẠI SHEET2:
- Ô B1 dùng để nhập ngày tháng năm chấm công
- viết code để điền thứ trong tháng vào các cells từ C2 đến AG2, điền các ngày trong tháng từ các cells từ C3 đến AG3

Nếu tôi là bạn, tôi sẽ thực hiện các iêu cầu này bằng cách sau

(1) Thay vì ở [B1] (đang là 4/1/2015) mình sẽ làm ô Validation tại [A1] để chọn 1 trong 12 tháng của năm & [B1] sẽ là 1 ô Validation nữa để chọn năm;
Tại [c3] ta áp công thức =Date(B1, A1, 1) & định dạng cho nó kiểu thể hiện là 'DD'
Ô liền kề fía fải của nó sẽ áp công thức =C3 +1
& cứ thế ta chép sang fải cho đủ 31 ô (Số ngày cho 1 tháng tối đa về ngày)
Ổ 31 ô trên ô này ta không cần áp công thức nào hết & càng không cần dùng VBA gì sất nữa cả;
Ta chỉ việc xài cái có sẵn do excel cung cấp đó là CF có trên thanh menu để tô màu tự động các ngày thứ 7 & chủ nhật

Bạn có thể tìm thấy trên diễn đàn rất nhiều bảng chấm công mẫu kiểu mà mình vừa đề cập
Mình xin gởi bạn 1 ví dụ như trong file
 
Lần chỉnh sửa cuối:
Upvote 0
cảm ơn bác chanhTQ. Hôm nay em bận quá giời mới quay lại diễn đàn.
em biết một chút về VBA nhưng trường hợp này thì em không biết giải thuật thế nào lên muốn các anh chị diễn đàn viết code để từ đó em học hỏi them
mong các anh chị giúp đỡ chỉ bảo cho em tiến bộ hơn
 
Upvote 0
trường hợp này thì em không biết giải thuật thế nào lên muốn các anh chị diễn đàn viết code để từ đó em học hỏi them
mong các anh chị giúp đỡ chỉ bảo cho em tiến bộ hơn

Chưa cần dùng đến VBA; Bạn xem cách mình làm trong file đính kèm

Nếu bạn đồng í, ta sẽ áp dụng VBA để chuyển công đã chấm ở Sheet2 sang Sheet1; Mình cho là điều này là cần thiết & đúng chổ khi xử dụng VBA trong trang tính của bạn!
 
Lần chỉnh sửa cuối:
Upvote 0
Chưa cần dùng đến VBA; Bạn xem cách mình làm trong file đính kèm

Nếu bạn đồng í, ta sẽ áp dụng VBA để chuyển công đã chấm ở Sheet2 sang Sheet1; Mình cho là điều này là cần thiết & đúng chổ khi xử dụng VBA trong trang tính của bạn!
cảm ơn bạn đã quan tâm:
để bạn hình dung mình xin diễn giải thế này:
sheet2 của mình dung để đánh dấu ngày nghỉ và làm them của nhân viên.
tại sheet1 sẽ có kết quả căn cứ vào sheet2. sheet1 sẽ tự đánh dấu "X" vào các ngày nhân viên có đi làm. trường hợp trong sheet2 nhân viên nào có ngày đánh dấu bang ký tự bất kỳ thì sheet1 sẽ không chấm công ( không đánh dấu "X" vào ngày tương ứng đã nghỉ làm bên sheet1.
 
Upvote 0
Bạn thử với các fương àn nhập liệu các tháng khác nhau đi nha
/-(ẹn sớm mai gặp lại!

Diễn đàn có ma hay sao đó ta?
Muốn đăng bài mà mươi lần chưa được!
 
Lần chỉnh sửa cuối:
Upvote 0
cảm ơn bác chanhTQ, bác chỉnh lại cho em thế này nhé0
ở bên sheet1 các cell chỉ được chấm công bang ký tự "X" cho các ngày đi làm, và các ngày nghỉ là để chống chứ không phải là chuyển hết các ký tự bên sheet2 sang sheet1 bác nhé. sheet2 là sheet em nhập lieu nếu em nhập là F có nghĩa là nghỉ phép thì bên sheet1 không chấm công cho ngày này, tương tự như vậy ô là nghỉ ốm. tóm lại bên sheet2 có ký tự cho cell nào (trừ ký tự là LB có nghĩa là làm them) thì bên sheet1 không chấm công cho cell tương ứng (để trống cell tương ứng bên sheet1)
nếu ở ngày nghỉ mà có ký tự LB bên sheet2 thì bên sheet1 vẫn chấm công cho cell này bất kể là ngày nghỉ
 
Lần chỉnh sửa cuối:
Upvote 0
(/ậy bạn chép toàn bộ cái này đè lên macro cũ, nha:
PHP:
Sub ChuyenCong()
 Dim Sh As Worksheet, Rng As Range, sRng As Range
 Dim Cll As Range, Cls As Range
 Dim Col As Byte
 
 Set Sh = ThisWorkbook.Worksheets("Sheet1")
 Set Rng = Sh.Range(Sh.[B5], Sh.[B5].End(xlDown))
 Rng.Offset(1, 2).Resize(, 31).ClearContents
 For Each Cls In Range([B4], [B4].End(xlDown))
    Set sRng = Rng.Find(Cls.Value, , xlFormulas, xlWhole)
    If Not sRng Is Nothing Then
        For Each Cll In Cells(Cls.Row, "D").Resize(, 31)
            Col = Cll.Column
            If Weekday(Cells(3, Col)) <> 1 And Weekday(Cells(3, Col)) <> 7 Then
                With Sh.Cells(sRng.Row, Col)
                    If Cells(Cll.Row, Col).Value = "" Or Cells(Cll.Row, Col).Value = "LB" Then
                        .Value = "X"
                    Else
'                        .Value = Cells(Cll.Row, Col).Value '
                    End If
                End With
            Else
                If Cells(Cll.Row, Col).Value = "LB" Then _
                    Sh.Cells(sRng.Row, Col) = "X"
            End If
        Next Cll
    End If
 Next Cls
End Sub
 
Upvote 0
cảm ơn bác chanhTQ nhé
bác xem lại cho em bên sheet1 tháng 4 có 30 ngày mà lại chấm công cho cả ngày 31 thì tiền đâu em đền đây bác ơi. tháng có bao nhiêu ngày thì chấm công cho bây nhieu ngày thôi chứ bác
 
Upvote 0
Ờ hén!

cảm ơn bác & bác xem lại cho em bên sheet1 tháng 4 có 30 ngày mà lại chấm công cho cả ngày 31 thì tiền đâu em đền đây bác ơi. tháng có bao nhiêu ngày thì chấm công cho bây nhieu ngày thôi chứ bác

Vậy bạn thêm dòng lệnh dưới này vô sau dòng lệnh
PHP:
            Col = Cll.Column
Mã:
            If Month(Cells(3, Col).Value) <> Month(Cells(3, "D").Value) Then Exit For
là được.
 
Upvote 0
em them vô cũng không được bác ợ. bác xem lại cho em với nhé
 
Upvote 0
em them vô mà không được bác ơi. bác em lại hộ em với nhé
 
Upvote 0
[ThongBao]em them vô mà không được bác ơi. bác em lại hộ em với nhé[/ThongBao]
 

File đính kèm

Upvote 0
[ThongBao]em them vô mà không được bác ơi. bác em lại hộ em với nhé[/ThongBao]
- Trường hợp nếu ngày nghỉ mà có làm việc (làmthêm) thì tại sheet2 mình sẽ đánh dấu vào ngày làm thêm ví dụ đánh dấu"LT" thì sheet1 sẽ tự động chấm công cho người đó vào ngày làm thêmtương ứng <--- Bạn xem lại mục này hình như chưa hoạt động thì phải bạn ạ.

Và cho mình hỏi thêm nếu mình muốn in luôn cả phần cột tổng phía sau thì mình sửa chỗ nào, mình đã sửa đoạn
PHP:
Range("A1:AH28").Select
thành
PHP:
Range("A1:AI28").Select
mà không được.
Thêm nữa khi mình insert thêm nhân viên thì dòng tổng phía dưới cũng bị clear mất công thức luôn.
 
Lần chỉnh sửa cuối:
Upvote 0
- Trường hợp nếu ngày nghỉ mà có làm việc (làmthêm) thì tại sheet2 mình sẽ đánh dấu vào ngày làm thêm ví dụ đánh dấu"LT" thì sheet1 sẽ tự động chấm công cho người đó vào ngày làm thêmtương ứng <--- Bạn xem lại mục này hình như chưa hoạt động thì phải bạn ạ.
Ở bài #7 chủ đề tài có nói rằng :
[thongBao]Tóm lại bên sheet2 có ký tự cho cell nào (trừ ký tự là LB có nghĩa là làm them) thì bên sheet1 không chấm công cho cell tương ứng (để trống cell tương ứng bên sheet1)
[/thongbao]
Như vậy làm thêm qui ước là LB chứ không fải là "LT" như bạn tưởng!


Và cho mình hỏi thêm nếu mình muốn in luôn cả phần cột tổng phía sau thì mình sửa chỗ nào, mình đã sửa đoạn
PHP:
Range("A1:AH28").Select
thành
PHP:
Range("A1:AI28").Select
mà không được.
Cái này mình không có máy in, bạn fải chờ hay nhờ người khác đi vậy


Thêm nữa khi mình insert thêm nhân viên thì dòng tổng phía dưới cũng bị clear mất công thức luôn.
Công thức viết tổng đã được cài sẵn bỡi tác giả của bài đăng; Bạn hỏi bạn í xem sao(?)
 
Lần chỉnh sửa cuối:
Upvote 0

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

Back
Top Bottom