To hàm chm công
. mt s công ty, nhà máy nh vic
chm công thông thường được thc hin
trên Excel. Qua trao đổi tôi thy rng đa s
khi nhân viên có đi làm thì s được chm
là X , nghĩ phép là P , ...vv. Sau đó s s
dng mt s hàm trong Excel để tính s
ngày công trong mt tháng ca nhân viên.
Tôi nghĩ rng thông thường s ngày làm
vic s nhiu hơn s ngày nghĩ, nếu chm
công như trên nghĩa là bn phi nhp vào
bng tính Excel nhiu hơn nếu bn ch
nhp vào nhng ngày nghĩ ca nhân viên
y. Gi s rng tro
Hoc có nhng ngày thì tính công nht (công thi gian), có nhng ngày tính theo năng sut...thì
bn phi làm như thế nào. Tôi nghĩ mt s công ty vic chm công s rc ri hơn như trên vì
hin nay mt s công ty có c công nhân thi v và công nhân chính thc,...!
Vâng, vn đề chc chn là rc ri. đây tôi không có tham vng gii quyết tt c các vn đề
trên. Tôi ch mun đưa ra hàm chm công để cho công vic chm công d dàng hơn.
Cu trúc ca hàm chm công như sau:
Public Function Chamcong(ByVal Khoang As Range, ByVal Chucnang As String) As Single
_ Khoang: là khong (Thông thường là mt hàng t ct...đến ct...) tương ng vi hàng hay
khong mà bn chm công cho mt nhân viên.
_ Chucnang: là chui hay ký t đại din cho mt chc năng chm công ca bn.
Gi s đây tôi quy định:
ü Nghĩ phép là: A
ü Nghĩ bnh 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
Vy nếu trong mt 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
chm như sau: (Gi s tên nhân viên là Triu Nht Đông, ngày áp dng là 27/02/2002)
đây vic chm công cho nghĩ phép và tăng ca s được cách nhau bi “ ; “ (du chm phy,
nếu bn mun bn cũng có th thay đổi ký t trên khi bn khai báo để x lý trong hàm chm
công).
Trong hàm chm công ca tôi, tôi có s dng mt Class tên clsString ca Thy Đức Hng
(HTTP: www.vovisoft.com). Bn ch vic copy đon mã sau và đưa vào class module trong ca
s VBE ca bn.
'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