
Tạo hàm chấm công
. Ở một số công ty, nhà máy nhỏ việc
chấm công thông thường được thực hiện
trên Excel. Qua trao đổi tôi thấy rằng đa số
khi nhân viên có đi làm thì sẽ được chấm
là X , nghĩ phép là P , ...vv. Sau đó sẽ sử
dụng một số hàm trong Excel để tính số
ngày công trong một tháng của nhân viên.
Tôi nghĩ rằng thông thường số ngày làm
việc sẽ nhiều hơn số ngày nghĩ, nếu chấm
công như trên nghĩa là bạn phải nhập vào
bảng tính Excel nhiều hơn nếu bạn chỉ
nhập vào những ngày nghĩ của nhân viên
ấy. Giả sử rằng tro
Hoặc có những ngày thì tính công nhật (công thời gian), có những ngày tính theo năng suất...thì
bạn phải làm như thế nào. Tôi nghĩ ở một số công ty việc chấm công sẽ rắc rối hơn như trên vì
hiện nay ở một số công ty có cả công nhân thời vụ và công nhân chính thức,...!
Vâng, vấn đề chắc chắn là rắc rối. Ở đây tôi không có tham vọng giải quyết tất cả các vấn đề
trên. Tôi chỉ muốn đưa ra hàm chấm công để cho công việc chấm công dễ dàng hơn.
Cấu trúc của hàm chấm công như sau:
Public Function Chamcong(ByVal Khoang As Range, ByVal Chucnang As String) As Single
_ Khoang: là khoảng (Thông thường là một hàng từ cột...đến cột...) tương ứng với hàng hay
khoảng mà bạn chấm công cho một nhân viên.
_ Chucnang: là chuổi hay ký tự đại diện cho một chức năng chấm công của bạn.
Giả sử ở đây tôi quy định:
ü Nghĩ phép là: A
ü Nghĩ bệnh là: S
ü Nghĩ ma chay là: C
ü Nghĩ không lương là: U
ü Tăng ca ngày thường (tính nhân cho 1.5) là: N

ü Tăng ca ngày nghĩ (tính nhân cho 2) là: D
Vậy nếu trong một ngày nhân viên đó nghĩ phép ½ ngày, tăng ca (ngày thường) 3 tiếng thì tôi sẽ
chấm như sau: (Giả sử tên nhân viên là Triệu Nhất Đông, ngày áp dụng là 27/02/2002)
Ở đây việc chấm công cho nghĩ phép và tăng ca sẽ được cách nhau bởi “ ; “ (dấu chấm phẩy,
nếu bạn muốn bạn cũng có thể thay đổi ký tự trên khi bạn khai báo để xử lý trong hàm chấm
công).
Trong hàm chấm công của tôi, tôi có sử dụng một Class tên clsString của Thấy Lê Đức Hồng
(HTTP: www.vovisoft.com). Bạn chỉ việc copy đoạn mã sau và đưa vào class module trong cửa
sổ VBE của bạn.

'Author: Le Duc Hong http://www.vovisoft.com
Option Explicit
Private SText As String
Private SDelimiter As String
Private IPos As Integer
Private ILen As Integer
Public MaxToken As Integer
Private Tokens() As String
Public Property Get Text() As Variant
Text = SText

End Property
Public Property Let Text(ByVal vNewValue As Variant)
SText = vNewValue
ILen = Len(SText): IPos = 1
End Property
Public Property Get Delimiter() As Variant
Delimiter = SDelimiter
End Property
Public Function TokenAt(TNum) As String
If (TNum > 0) And (TNum <= MaxToken) Then
TokenAt = Tokens(TNum)
Else
TokenAt = ""
End If
End Function
Public Property Let Delimiter(ByVal vNewValue As Variant)
SDelimiter = vNewValue
Tokenise
End Property
Private Sub Tokenise()
Dim i
i = 0: IPos = 1

Do Until IPos > ILen
i = i + 1
ReDim Preserve Tokens(i)
Tokens(i) = GetToken
Loop
MaxToken = i
IPos = 1
End Sub
Public Sub ReplaceToken(TNum, NewToken)
If (TNum > 0) And (TNum <= MaxToken) Then
Tokens(TNum) = NewToken
ReconstructText
End If
End Sub
Private Sub ReconstructText()
Dim i
SText = ""
For i = 1 To MaxToken
SText = SText & Tokens(i)
If i < MaxToken Then SText = SText & SDelimiter
Next
End Sub

