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ê
Trang 1Tạ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
Trang 2ü 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
Trang 3'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
Trang 4End 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
Trang 5Do 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
Trang 6Public Function KeepLeftPart(NumChar) As String
If ILen >= NumChar Then
SText = Left(SText, NumChar): ILen = Len(SText)
End If
KeepLeftPart = SText
End Function
Public Function KeepRightPart(NumChar) As String
If ILen >= NumChar Then
SText = Right(SText, NumChar): ILen = Len(SText)
End If
KeepRightPart = SText
End Function
Public Function KeepMidPart(SPos, NumChar) As String
If ILen >= SPos Then
SText = Mid(SText, SPos): ILen = Len(SText)
End If
If ILen >= NumChar Then
SText = Right(SText, NumChar)
End If
KeepMidPart = SText
End Function
Public Property Get CurrentPos() As Variant
Trang 7CurrentPos = IPos
End Property
Public Property Let CurrentPos(ByVal vNewValue As Variant)
IPos = vNewValue
End Property
Public Function GetToken() As String
Dim Pos
GetToken = ""
If SDelimiter = " " Then
Do While Mid(SText, IPos, 1) = " "
IPos = IPos + 1
If IPos > ILen Then
Exit Function
End If
Loop
End If
Pos = InStr(IPos, SText, SDelimiter)
If Pos > 0 Then
GetToken = Mid(SText, IPos, Pos - IPos)
IPos = Pos + Len(SDelimiter)
Else
GetToken = Mid(SText, IPos, ILen - IPos + 1)
Trang 8IPos = ILen + 1
End If
End Function
Public Sub Substitude(Param, ParamValue)
Dim Pos, PLen
PLen = Len(Param)
Pos = InStr(SText, Param)
Do While Pos > 0
SText = Left(SText, Pos - 1) & ParamValue & Mid(SText, Pos + PLen) Pos = InStr(SText, Param)
Loop
ILen = Len(SText)
End Sub
Public Function GetLastToken() As String
Dim Pos, Tlen
Tlen = Len(SDelimiter)
GetLastToken = ""
If ILen = 0 Then
Exit Function
End If
Pos = ILen - Tlen + 1
Do While Pos > 0
Trang 9If Mid(SText, Pos, Tlen) = SDelimiter Then
GetLastToken = Mid(SText, Pos + Tlen)
End If
Pos = Pos - 1
Loop
End Function
Public Property Get Length() As Integer
Length = ILen
End Property
Public Property Get TokenCount() As Variant
TokenCount = MaxToken
End Property
Sau đó bạn bạn copy đoạn mã hàm chấm công sau vào trong module của bạn
Public Function Chamcong(ByVal Khoang As Range, ByVal Chucnang As String) As Single
Dim Socot As Integer, Sohang As Integer
Dim i As Integer, j As Integer, k As Integer
Dim Btotal As Single
Dim Bgiatriso As Single
Dim Bchucnang As String
Dim SoLoai As Byte ' Bien nay nham xac dinh so loai ngay nghi, tang ca trong mot
chuoi
Dim BChuoi As clsString
Trang 10Dim BGiatri
On error resume next
'Xac dinh so cot trong bien Khoang
Socot = Khoang.Columns.Count
'Xac dinh so hang trong bien Khoang
Sohang = Khoang.Rows.Count
' Nham bao dam so sanh dung ta dung ham UCase Chucnang = UCase(Chucnang)
'Duyet qua cac cell trong bien Khoang
For i = 1 To Sohang
For j = 1 To Socot
BGiatri = Khoang.Cells(i, j).Value
BGiatri = Trim(BGiatri)
' Bat dau xu ly bgiatri qua Class clsString
Set BChuoi = New clsString
BChuoi.Text = BGiatri
'Ky tu de phan cach cac Chuc nang
BChuoi.Delimiter = ";"
'Xac dinh so Chuc nang trong 1 cell
SoLoai = BChuoi.TokenCount
For k = 1 To SoLoai
'Chuoi cua tung chuc nang
BGiatri = BChuoi.TokenAt(k)
Trang 11Bchucnang = UCase(Left(BGiatri, Len(Chucnang)))
Bgiatriso = Val(Right(BGiatri, Len(BGiatri) - len(Chucnang)))
Select Case Bchucnang
Case Chucnang
Btotal = Btotal + Bgiatriso
End Select
Next k
Next j
Next i
Chamcong = Btotal
End Function
Với hàm chấm công như trên, bạn có thể dùng các chuổi ký tự dài hơn để thể hiện chức năng mà
bạn cần (Ví dụ như: nghiphep, nghibenh, tangca, vv), hay trong công thức bạn có thể tham
chiếu đến một cell nào đó để đại diện cho chức năng bạn muốn
Trong ví dụ này, ngày 22/02 tôi chấm công nghiphep1, ngày 23/02 tôi chấm công
nghiphep0.5;tangca3 Công thức trong ô AM8, tôi sẽ nhập vào
=chamcong(G8:AH8,AM7) (ô AM7 chứa chữ Nghiphep)
Công thức trong ô AN8, tôi nhập công thức sau:
=chamcong(G8:AH8,AN7) (ô AN7 chứa chữ Tangca)
Vâng, dĩ nhiên là bạn có thể sử dụng các chuổi ký tự như trên sẽ dễ hiểu, nhưng bảng chấm công của bạn sẽ rất lượm thuộm
Hình vẽ sau minh họa ví dụ trên của tôi
Trang 12Tôi hy vọng rằng bài viết trên sẽ giúp ích các bạn phần nào trong công việc chấm công nhàm chán (nhưng không được sai) hàng ngày của bạn