Xin giúp đỡ về code chấm công

Liên hệ QC

tommybull

Thành viên hoạt động
Tham gia
21/7/08
Bài viết
191
Được thích
29
Giới tính
Nam
Mình gửi file kèm theo (File này mình cũng lấy trên mạng về và chỉnh sửa theo tình hình thực tế của Công ty để áp dụng chấm công. Nhưng có một hạn chế là: từ cột "F" đến cột "AJ" mỗi ô chỉ có thể thể hiện được một vấn đề, Nhưng công ty của mình thì thường xuyên xảy ra 2 hoặc 3 vấn đề
Ví dụ như: anh A ngày 15/10/2009 đi làm trễ 2,5 tiếng, sau đó vào làm việc đến hết giờ và tiếp tục tăng ca 4 tiếng đông hồ
Chính vì thế, mình không thể hiện được hai vấn đề trên cùng một ô ví dụ như: "M5;T8" thì cột "giờ công" và cột "tăng ca thường" sẽ không hiểu và không thể chấm công được.
kính mong nhận được sự giúp đỡ của các tiền bối
Xin chân thành cảm ơn
 

File đính kèm

Lần chỉnh sửa cuối:
Ví dụ như: anh A ngày 15/10/2009 đi làm trễ 2,5 tiếng, sau đó vào làm việc đến hết giờ và tiếp tục tăng ca 4 tiếng đông hồ . . .Chính vì thế, mình không thể hiện được hai vấn đề trên cùng một ô ví dụ như: "M5;T8"
Mình mơ hồ rằng cần viết cho bạn hàm tự tạo; Nhưng trước hết cần thỏa thuận các quy ước của bạn; Như ví dụ trên cần chấm là M2,5T4 chứ như bạn thì con số 5 khó mà hiểu nó là trễ 2,5 giờ;
& con số 8 có thể hiểu là tăng ca 4 giờ tính thành 8, phải không?

Ngoài ra trong các quy ước của bạn không nên dùng chữ cái tiếng Việt ('Đ'), sẽ rất phiền sau này, một khi bạn thích hàm tự tạo mà mình sẽ viết cho bạn; Cũng là để tiện, chúng ta nên dùng F thay cho PN; Và dùng các ký tự Nhà nước đã quy ước, như RO: Riêng không lương; RC: Riêng có lương (như Tang, cưới, . . .)
Cũng cần hỏi trước bạn, là cơ quan bạn có chấm công H: Học, họp, công tác, . . . ?
Nói chung là còn những loại công nào nữa hay không?
Chuyện này phải rốt ráo đã, mới iên tâm cùng nhau đi vào hàm tự tạo được;

Ngoài ra, còn quy tròn như thế nào; Trễ 2,5 giờ coi như trễ 2,5 giờ hay 2 hoặc 4 giờ vậy?
Có nghĩa là vo tròn đến cỡ nào, 1/2 giờ, hay nữa giờ, hoặc nữa công?
Thêm giớ có quy đổ hay không & quy đổi như thế nào?

Chờ tin bạn :-=
 
Lần chỉnh sửa cuối:
Upvote 0
Các macro của bạn có thể rút gọn lại theo kiểu đặt thừa số chung

Ví dụ như sau:
PHP:
Option Explicit
Sub cmdOK_Add_NV()
Const PNh As String = "Phieu Nhap":          ReDim StrC(24) As String
Dim Rng As Range, Clls As Range:             Dim Dem As Byte
Sheets("Add_NV").Select
Set Rng = Union([E10], [L10], Range("E11:E17"), [h17], [k17], [E18], [J18], Range("E19:E28"))
StrC(0) = "Nhap ho ten Tieng Viet"
StrC(1) = "Nhap Ma Nhan Vien"
StrC(2) = "Nhap ho ten Tieng Hoa"
StrC(3) = "Nhap ngay sinh"
StrC(4) = "Nhap dan toc"
StrC(5) = "Nhap noi sinh"
StrC(6) = "nhap nguyen quan"
StrC(7) = "nhap thuong tru"
StrC(8) = "nhap CMND"
StrC(9) = "Nhap ngay cap"
StrC(10) = "Nhap noi cap"
StrC(11) = "Nhap dien thoai"
StrC(12) = "Nhap DTDT "
StrC(13) = "Nhap Ngay Vao Lam"
StrC(14) = "Nhap ngay ky HDLD"
StrC(15) = "Nhap ngay het HDLD"
StrC(16) = "Nhap luong co ban"
StrC(17) = "Nhap p.c trach nhiem"
StrC(18) = "Nhap Tien chuyen can"
StrC(19) = "Chon phong ban"
StrC(20) = "Chon Noi Lam Viec"
StrC(21) = "Chon chuc vu"
StrC(22) = "Chon gioi tinh"

For Each Clls In Rng
   If Clls.Value = "" Then
      MsgBox StrC(Dem), , PNh:        Exit Sub
   End If
   Dem = Dem + 1
Next Clls


With Sheets("DanhSach_NV").[A65500].End(xlUp).Offset(1)
   .Value = .Offset(-1).Value + 1 'stt
   
1   .Offset(, 2).Value = Cells(10, 5).Value   'hoten viet
2   .Offset(, 3).Value = Cells(11, 5).Value   'hoten hoa
   
   .Offset(, 1).Value = Cells(10, 12).Value  'manhanvien
   .Offset(j, 4).Value = Cells(12, 5).Value  'ngaysinh
   .Offset(j, 5).Value = Cells(28, 5).Value  'gioitinh
   .Offset(j, 6).Value = Cells(25, 5).Value  'phongban
   .Offset(j, 7).Value = Cells(27, 5).Value  'chucvu
   .Offset(j, 8).Value = Cells(26, 5).Value  'noilamviec
   .Offset(j, 9).Value = Cells(19, 5).Value  'ngayvao
   
3   .Offset(j, 10).Value = Cells(13, 5).Value   'dantoc
   .Offset(j, 11).Value = Cells(14, 5).Value  'noisinh
   .Offset(j, 12).Value = Cells(15, 5).Value  'nguyenquan
   .Offset(j, 13).Value = Cells(16, 5).Value  'thuongtru
4   .Offset(j, 14).Value = Cells(17, 5).Value  'cmnd
   
   .Offset(j, 15).Value = Cells(17, 8).Value  'ngaycap
   .Offset(j, 16).Value = Cells(17, 11).Value  'noicap
   .Offset(j, 22).Value = Cells(18, 5).Value   'dienthoai
   .Offset(j, 23).Value = Cells(18, 10).Value  'dtdd
   
5   .Offset(j, 17).Value = Cells(20, 5).Value  'ngaykyhdld
   .Offset(j, 18).Value = Cells(21, 5).Value  'ngayhethdld
   .Offset(j, 19).Value = Cells(22, 5).Value  'luongcoban
6   .Offset(j, 20).Value = Cells(23, 5).Value  'pc.trachnhiem
   
   .Offset(j, 22).Value = Cells(24, 5).Value  'chuyencan
End With


MsgBox "Added Successful!", vbOKOnly, "Add Employee"
Call cmdCancel_Add_NV
End Sub
Thực ra các dòng lệnh 1-2 có thể viết thành 1 dòng lệnh; Tương tự như vậy các dòng từ 3 -4 viết thành 1 dòng; 5-6 viết thành 1 dòng; (Bằng phương thức Resize( x, y)

:-= --=0 :-=
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Rất cảm ơn bạn đã và đang giúp đỡ mình

Mình không phải là dân VBA chuyên nghiệp, nên bạn làm như thế khi minh áp dung theo code bạn viết thì đều không được
Nói chung mình chỉ cần rất đơn gian là làm sao phải thể thể hiện được 2 vấn đề trong một ô (ví dụ như: đi trễ 2,5giờ, vào làm đến hết giờ thì tiếp tục tăng ca 3 tiếng (M5;T6))
Ở đây có nghĩa là mình lấy đơn vị thời gian nhỏ nhất là 0.5giờ nên:
Đi trễ M5 = 5 x 0.5 = 2.5 giờ
Tăng ca T6 = 6 x 0.5 = 3 giờ
và tương ứng với điều kiện trên thì cột AO=2.5 và AS=3

Mình cần bạn giúp đỡ thể hiện 2 hoặc 3 vấn đề cùng một ô, phân biệt giữa các vấn đề bằng một ký tự nào đó

XIn chân thành biết ơn
 
Upvote 0
Nói chung mình chỉ cần rất đơn gian là làm sao phải thể thể hiện được 2 vấn đề trong một ô (ví dụ như: đi trễ 2,5giờ, vào làm đến hết giờ thì tiếp tục tăng ca 3 tiếng (M5;T6))
và tương ứng với điều kiện trên thì cột AO=2.5 và AS=3

Mình cần bạn giúp đỡ thể hiện 2 hoặc 3 vấn đề cùng một ô, phân biệt giữa các vấn đề bằng một ký tự nào đó

Bạn nên nêu những trường hợp 1 ô chấm 2 hay ba loại công đang & tương lai sẽ có (vì trong quy định của đơn vị bạn)

Như Ca đêm bạn chấm sao? xD hay 4D
Có khi nào chấm M3DT4 không?
Có khi nào đi 1/2 ngày phép không? Có chế độ cho con bú không?
Có nóng độc hại không?

Viết hàm sẽ không khó, nhưng cần đủ dữ liệu ngay từ đầu để khỏi phải việt đi viết lại nhiều lần; Vấn đề quan trọng ở đây là quy ước cơ quan bạn & lớn hơn là chính sách chấm công của bạn ra sao?
(Ví dụ thêm giờ quy đổi ra sao; = công hành chính hay hơn?. . .)

Bạn đừng cho đây là những đòi hỏi quá đáng, nha!
 
Upvote 0
Tất cả thời gian trong bảng chấm công đều tính theo số giờ thực tế, số giờ theo hệ số quy định của NN mình làm bên bảng chấm công rồi

Các quy ước của mình như sau:

Phép năm: PN
Chế độ (Cưới, tang, lễ, vợ sanh, con bú): CD
Hai trường hợp này không trừ vào giờ công nên minh không cần liệt kê trong hàm

Thai sản: TS
Ốm: O
Muộn: M
Việc riêng: VR
Không phép: KP

Tăng ca ngày thường: T
Tăng ca chủ nhật: CN
Tăng ca đêm: TD
Tăng ca ngày lễ: DB
Tăng ca đêm chủ nhật: TN
Đi làm ca đêm: D
Trường hợp trên xem như là các "điều kiện" có thể xay ra trong cùng 1 ô (có thể xay ra 2 hoặc 3 hoặc hơn nữa)
VD1: M5;T6 --> lúc này cột AR=205.5 và AS=3
VD2: M5;T6;TD6 --> lúc này AR=205.5 ; AS=3 ; AV=3
Nói chung bạn không cần chú ý đến các cột từ AK đến AY vì mình đã làm xong, tất cả thời gian mình tính theo thực tế, không nhân với bất kỳ hệ số nào, vì hệ số mình sẽ tính bên bảng chấm công.
Bạn chỉ cần giúp mình tạo một đoạn code quy định về dấu phân cách (có thể dùng dấu chấm phẩy ";" để phân cách giữa các vấn đề trong cùng 1 ô thôi
 
Upvote 0
Bạn xem đúng như ý chưa nha! Hàm tự tạo tính cho 1 số loại công

PHP:
Option Explicit
Function TinhCong(LookUpRange As Range, Loai As Range)
 Const PC As String = ";"
 Dim Clls As Range:                 Dim Cg As String
 Dim VTr As Byte, VTr0 As Byte, DDai As Byte
 
 Cg = UCase$(Trim(Loai.Value)):        DDai = Len(Cg)
 For Each Clls In LookUpRange
   VTr = InStr(Clls.Value, Cg)
   If VTr > 0 Then
      VTr0 = InStr(VTr + 1, Clls.Value, PC)
      
      If VTr0 > 0 Then
         TinhCong = TinhCong + 0.5 * CDbl(Mid(Clls.Value, VTr + DDai, VTr0 - VTr - DDai))
      ElseIf VTr0 < 1 Then
         If VTr + DDai <= Len(Clls.Value) Then
            TinhCong = TinhCong + 0.5 * CDbl(Mid(Clls.Value, VTr + DDai))
         Else
            TinhCong = TinhCong + 8
         End If
      End If
   End If
 Next Clls
End Function
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Hì hì!!!
mình không biết đoạn code bạn viết có thể dùng trong file mình gửi đính kèm không.
Mình thử coppy vào module trong file chấm công nhưng hình như không thấy nó chạy được.
Khi mình đánh 2 vấn đề được phân cách bởi dấu chấm phẩy (;) thì không thấy có phản ứng gì hết
Làm phiền tiền bối tiếp nha
!$@!!
 
Upvote 0
Hãy thử dùng trong file đính kèm cái đã, cho mọi phương án thực tế trong cơ quan bạn:
( Xem cú pháp & tìm hiểu tại vùng 'AI6:AO6') cũng như thêm các loại công cho các dòng dưới & cho bết ý kiến xem sao, nha!

Bạn hãy cho biết các loại công không thể lẽ, như O, VR, . . . ( còn công nào nữa ? mà đơn vị bạn chỉ xài nguyên 1 công)
 
Upvote 0
Mình xấu hổ quá!!!
1. File bạn gửi, mình hiểu, và đã xem qua, nhưng chỉ được một hàng đầu tiên, hàng thứ 2 mình ko biết kéo công thức hoặc chạy code thế nào.
2. Mình muốn lấy đoạn code bạn viết và coppy vào module trong file của mình để chạy, nhưng cũng không biết để ở đoạn nào.
3. Bạn có thể mở file của mình ra đồng thời mở code của mình ra để xem xem bạn có thể viết tiếp theo dựa trên code có sẵn của mình để quy định dấu cách giữa các vấn đề không. vì tất cả mình đã thiết lập theo quy định của công ty mình rồi, bây giờ mình chỉ cần có dấu cách ngay tại trên file này thế là xong
Làm phiện bạn một lẫn nữa nhé
Xin chân thành cảm tạ
!$@!!!$@!!!$@!!
 
Upvote 0
1. File bạn gửi, mình hiểu, và đã xem qua, nhưng chỉ được một hàng đầu tiên, hàng thứ 2 mình ko biết kéo công thức hoặc chạy code thế nào.
Với các hàng dưới liền kề, bạn thử chấm công cho lần lượt từng người & tại các cột [AI], [AK:AO] bạn Copy công thức trên xuống; xem kết quả & nếu có sai lệch hay chưa thỏa điều gì thì kêu lên để được đáp ứng tiếp.

2. Mình muốn lấy đoạn code bạn viết và coppy vào module trong file của mình để chạy, nhưng cũng không biết để ở đoạn nào.
Để trong module 1 , sao cho khi vô menu Insert-> Function -> UDF thì thấy tên cúng cơm của nó là OK.

3. Bạn có thể mở file của mình ra đồng thời mở code của mình ra để xem xem bạn có thể viết tiếp theo dựa trên code có sẵn của mình để quy định dấu cách giữa các vấn đề không. vì tất cả mình đã thiết lập theo quy định của công ty mình rồi, bây giờ mình chỉ cần có dấu cách ngay tại trên file này thế là xong
Làm phiện bạn một lẫn nữa nhé
Xem trong file đính kèm mới đưa lên :-= --=0 :-=
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Mình gửi lại file nhé
Bạn mở file mình ra, sau đó click vào nút "Update List" code sẽ tự chạy những công thức mà mình cài trong "Module2"
Đồng thời bạn chiếu đến từng cột từ "AK" đến "AY" các công thức sẽ lần lượt cho ta thấy:
- Phép năm= PN
- Ốm = O
- Không phép= KP
3 loại phép trên nghỉ 4 hoặc 8 tiếng

- Chế độ-= CD
- Thai sản=TS
- Ca đêm=D
3 Loại trên nghỉ 1 lần ít nhất là 8 tiếng

- Bù tăng ca=B: Nghỉ 1 lần là 1 hoặc 2 tiếng

Ngoài ra:
- Ca đêm (D), Ốm (O), Đi muộn(M), Việc riêng(VR), Không phép(KP) thì trừ vào giờ công (cột AR)
- Bù tăng ca (B) thì trừ vào tăng ca thương (cột AS)

Bạn giúp mình xem có thể giữ nguyên những mặc định của mình và bạn chỉ cần làm thêm dâu phân cách không
Còn nếu không thì bạn giúp mình chuyển những công thức của bạn thành code để khi bên "sheet Danhsach_VN" của mình có bao nhiêu nhân viên thì khi mình Lick vào nút Update List ở "sheet Chamcong" danh sách và công thức sẽ cùng chạy một lúc

Xin chân thành cảm tạ
Không biết bạn có mệt lắm chưa, nhưng mình thấy cũng làm phiện bạn tương đối rồi đấy!
!$@!!!$@!!
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Mình gửi lại file nhé
Bạn mở file mình ra, sau đó click vào nút "Update List" code sẽ tự chạy những công thức mà mình cài trong "Module2"
Đồng thời bạn chiếu đến từng cột từ "AK" đến "AY" các công thức sẽ lần lượt cho ta thấy:
- Phép năm= PN
- Ốm = O
- Không phép= KP
3 loại phép trên nghỉ 4 hoặc 8 tiếng

- Chế độ-= CD
- Thai sản=TS
- Ca đêm=D
3 Loại trên nghỉ 1 lần ít nhất là 8 tiếng
- Bù tăng ca=B: Nghỉ 1 lần là 1 hoặc 2 tiếng

Ngoài ra:
- Ca đêm (D), Ốm (O), Đi muộn(M), Việc riêng(VR), Không phép(KP) thì trừ vào giờ công (cột AR)
- Bù tăng ca (B) thì trừ vào tăng ca thương (cột AS)




Bạn giúp mình xem có thể giữ nguyên những mặc định của mình và bạn chỉ cần làm thêm dâu phân cách không

Còn nếu không thì bạn giúp mình chuyển những công thức của bạn thành code để khi bên "sheet Danhsach_VN" của mình có bao nhiêu nhân viên thì khi mình Lick vào nút Update List ở "sheet Chamcong" danh sách và công thức sẽ cùng chạy một lúc

Xin chân thành cảm tạ

(1) Hàm người dùng sẽ không dễ phân biệt giữa công chế độ & công ca đêm như vậy!
Gỡ rối chổ này, ta nên đổi lại mã hiệu của 1 trong 2 loại công trên;
Nên là Rc cho công chế độ & D cho đêm;
(Bạn hãy tự rà lại các trường hợp khác & khử trùng hết mới tiện lập hàm tự tạo được;
Nói thêm: B - công bù & DB công thêm giờ ngày lễ cũng không ôn
Nhưng BB cho công nghĩ bù & DB cho công thêm giờ ngày lễ thì OK!)

(2) Hàm tự tạo có trong module1 - Bạn xem & thử chưa.
 
Upvote 0
Vấn đề là khi mình click vào nút "update list" thì các hàm tự tạo không chạy vào bảng chấm công

Hơn nữa, bạn kiểm tra xem, tất cả các hàm mình cài trong "Module2" khi click "update list" và áp dụng thì đều rất mỹ mãn các điều kiện mình cần, chỉ có điều mình không thể thể hiện 2 vấn đề trở lên, nên mình muốn bạn giúp mình làm sao có thể thể hiện 2 vấn đề trở lên trong cùng 1 ô là như thế.

bạn kiểm tra giúp nhé
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Lần đầu tiên luôn!

Vấn đề là khi mình click vào nút "update list" thì các hàm tự tạo không chạy vào bảng chấm công

Thường mình chỉ thầy người ta nhập bằng tay các hàm tự tạo này để nó tình & đưa ra kết quả; Bạn lại nạp nó bằng macro, thật ngạc nhiên vô chừng luôn!

Bạn kiểm tra xem, tất cả các hàm mình cài trong "Module2" khi click "update list" và áp dụng thì đều rất mỹ mãn các điều kiện mình cần, chỉ có điều mình không thể thể hiện 2 vấn đề trở lên, nên mình muốn bạn giúp mình làm sao có thể thể hiện 2 vấn đề trở lên trong cùng 1 ô là như thế.
bạn kiểm tra giúp nhé

Cách này hơi mới, nên mình xin không có í kiến, thông cảm! :-= --=0 :-=
 
Upvote 0
Chào buổi sáng,

Huhuhu....
Bây giờ phải làm sao đây
Bạn cố gắng giúp mình một lần nữa đi
không lẽ đến đây phải bỏ ngang thế sao
 
Upvote 0
xin giúp đỡ hoàn thiện bảng chấm công

đề tài này, thực sự là mình bị bế tắc rồi, có ai giúp mình với
 
Upvote 0
Coi như bảng chấm công thường là vầy:

A|B|C|D|. . . .
TT|HoTen|DVi|N1|. . .
01|Nguyễn Việt Hồng|ĐN|8
02|Lê Thị Thơm|KA|F

Như vậy 30 cột sau cột 'D' sẽ để chấm công cụ thể; Vùng này ghi các ký hiệu công mà đơn vị quy định;

Sau các cột này sẽ là một số cột để tổng hợp công;
Vùng tổng hợp công này người ta cài sẵn các công thức của excel & 1 số hàm tự tạo (Một khi các hàm của excel không thỏa mãn để tính toán). Nhưng mình nhấn mạnh là cài sẵn, chứ không như bạn dùng macrro nạp vô đó rồi không rõ lỗi do đâu)
Tóm lại, nói hơi nặng là bạn làm không giống ai sất!
 
Upvote 0
Web KT

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

Back
Top Bottom