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
CurrentPos = 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)
IPos = 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
If 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
Bạn đặt tên Class Module là ClsString
Tương tự bạn vào Insert/Module và đưa nội dung hàm Chamcong vào và đặt tên Module là Chamcong
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
Dim BGiatri
On Error Resume Next
Application.Volatile 'Nham tinh lai gia tri khi cac o co thay doi
'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
'Ban co the sua lai tuy theo yeu cau cua ban
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)
Bchucnang = 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
Điều quan trọng là ở cột MSNV, dựa vào mã số nhân viên này mà chúng ta có thể lấy dữ liệu từ bảng HSNV trong sheet HSNV. Chúng ta cũng dựa vào MSNV này mà lấy dữ liệu từ bảng MSNV trong sheet MSNV. Việc bố trí dữ liệu trong bảng HSNV làm sao để dễ hiểu và dễ trích rút dữ liệu thì tùy bạn. Tôi muốn nhấn mạnh ở chỗ sử dụng hàm chamcong như thế nào mà thôi.
Như bạn biết hàm chấm công có hai tham số. Tham số thứ nhất là kiểu Range, tức là tập họp các ô. Ví dụ như E6:AI6 (thường khỏang này trong bảng chấm công sẽ tương ứng với khỏang thể hiện việc chấm công ứng với từng nhân viên, tức là một dãy các ô cùng một hàng). Tham số thứ hai là là kiểu String (kiểu chuỗi) thể hiện chức năng cần chấm. Ví dụ như TCL là tăng ca ngày lễ...vv...
Ví dụ trong ngày 2 nhân viên A, tăng ca 2 tiếng (ngày thường), làm đủ công (tức là 8 tiếng) thì ở cột thể hiện ngày thứ 2 trong tháng bạn nhập vào NC1; TCT2, điều chú ý quan trọng ở đây là các chức năng sẽ cách nhau bởi ";". Bạn có thể thay đổi điều này trong hàm chấm công ở trên. Vậy là bạn cứ theo nguyên tắc này để chấm công các ngày còn lại.
Vậy ở cột ngày công (AR), bạn lập công thức như sau, với giả sử rằng nhân viên A được chấm công ở hàng thứ sáu
=chamcong(E6:AI6,"NC")
hay bạn cũng có thể lập công thức như sau, với chú ý ở ô AR5 có giá trị NC
=chamcong(E6:AI6, $AR$5), sở dĩ chúng ta sử dụng địa chỉ tuyệt đối nhằm việc sao chép công thức được dễ dàng.
Bây giờ bạn hãy thử nhập số liệu vào các ô trong khỏang E6:AI6 và thử xem hàm chấm công làm việc như thế nào!
Cuối cùng mục đích của hàm chấm công nhằm tách rời các số ra theo từng chuỗi ký tự đưa vào, và trong nhiều ô. Trong ví dụ trên là số nằm liền sau chữ NC. Ví dụ NC1, thì hàm chấm công sẽ có giá trị là 1. Chú ý quan trọng như đã nói ở trên là phải cách nhau bởi ";". Như vậy chúng ta không chỉ có thể sử dụng hàm chấm công để chấm công mà còn có thể sử dụng vào các mục đích tách số ra khỏi chuỗi ký tự.
Việc hiểu mục đích của hàm sẽ giúp bạn rất nhiều trong việc áp dụng hàm vào mục đích của bạn.
Như đã nói ở trên mục đích của bài viết này một lần nữa tôi muốn hướng dẫn các bạn chức năng của hàm chấm công để các bạn có thể áp dụng vào các mục đích khác.
Việc thiết lập các bảng khác các bạn có thể tham khảo trong tài liệu tôi có đề cập ở trên.
Chúc các bạn thành công.
Lê Văn Duyệt
levanduyet@gmail.com