/-(àm tự tạo để tổng hợp các loại công dị thường.

  • Thread starter Thread starter SA_DQ
  • Ngày gửi Ngày gửi
Liên hệ QC

SA_DQ

/(hông là gì!
Thành viên danh dự
Tham gia
8/6/06
Bài viết
14,577
Được thích
22,898
Nghề nghiệp
U80
Thường thì các cơ sở sản xuất kinh doanh tự đề ra qui chế lương thưởng nhằm khuyến khích người lao động hăng say trong công tác lao động sản xuất;

Thực hiện loại qui chế như vậy, thường có những loại công như nghĩ fép F (hay P), công ốm O, nghỉ thai sản TS, hay công học, họp H . . . . ta có thể dùng hàm COUNTIF() để tổng hợp công lúc cuối tháng.

Nhưng cũng có khi do đặc thù công việc, mà cơ sở nọ quy định như sau:

(1)

TT | Loại công | Cách chấm
01|Làm nguyên ngày|X
02|Làm nữa ngày|1/2
03|Làm tăng ca n giờ|Xn
04|. . . |. .

(2) Làm ngày chủ nhựt tách ra tính lương có thưởng riêng

Gặp những bảng chấm công như vậy, nếu ta áp dụng hàm COUNTIF() không fải là không được, nhưng sẽ khó vô chừng.

Sau đây là một hàm tự tạo đỡ đần ta vượt qua ải nhọc nhằn:

PHP:
Option Explicit
Function THCong(Cong As Range, LCg As String) As Variant
 Dim Cls As Range:                              Const DC As String = "/"
   
 For Each Cls In Cong
    Select Case UCase(LCg)
    Case "X"
        If Weekday(Cells(7, Cls.Column).Value) > 1 Then
            If UCase(Left(Cls.Value, 1)) = "X" Then
                THCong = THCong + 1
            ElseIf Cls.Value = "1/2" Then
                THCong = THCong + 0.5
            End If
        End If
    Case "P", "KP", "O", "L"
13        If UCase(Cls.Value) = "P" And LCg = "P" Then THCong = THCong + 1
        If UCase(Cls.Value) = "KP" And LCg = "KP" Then THCong = THCong + 1
15        If UCase(Cls.Value) = "O" And LCg = "O" Then THCong = THCong + 1
        If UCase(Cls.Value) = "L" And LCg = "L" Then THCong = THCong + 1
    Case "TG"
        If Weekday(Cells(7, Cls.Column).Value) = 1 Then
            If UCase(Cls.Value) = "X" Then
                THCong = THCong + 1
            ElseIf Cls.Value = "1/2" Then
                THCong = THCong + 0.5
            End If
        End If
    Case "TC"
        On Error Resume Next
        If Len(Cls.Value) >= 2 And InStr(Cls.Value, DC) < 1 Then
            THCong = THCong + CDbl(Right(Cls.Value, 1))
        End If
    End Select
 Next Cls
End Function
 

File đính kèm

Lần chỉnh sửa cuối:
Em có 1 bảng tính lương như thế này: thứ 2, thứ 3, thứ 4 , thứ 5, thứ 6, thứ 7.
Trong đó số ngày làm tương ứng với mỗi ô là X , X/2, Y , A , A, X7
Có nghĩa là: X là làm nguyên cả ngày, x/2 là làm nữa ngày, nữa ngày còn lại xin phép, A là làm nữa buổi nửa buổi không xin phép, Y là ngày nghĩ nhưng có phép năm, x7 là làm nữa ngày vào thứ 7.

Vấn đề là em dùng hàm Countif để lọc những giá trị ra để tính trong excel để trả về là tổng số ngày làm, như vd của em là 4 ngày thực làm, nhưng mà công thức nó quá dài,các anh chi biết về vba có thể giúp em được ko a. Em cảm ơn

PHP:
Option Explicit
Function THCong(NCong As Range, Loai As String)
 Dim Cls As Range
 
 For Each Cls In NCong
    Select Case UCase$(Loai)
    Case "X"
        If UCase$(Cls.Value) = "A" Or UCase$(Cls.Value) = "X/2" Then
            THCong = THCong + 0.5
        ElseIf UCase$(Cls.Value) = "X" Then
            THCong = THCong + 1
        End If
    Case "X7", "P", "L"
        If UCase(Cls.Value) = "Y" And Loai = "P" Then THCong = THCong + 1
        If UCase(Cls.Value) = "L" And Loai = "L" Then THCong = THCong + 1
        If UCase(Cls.Value) = "X7" And Loai = "X7" Then THCong = THCong + 1
    Case "KP"
        If UCase$(Cls.Value) = "A" Then THCong = THCong + 0.5
        If UCase(Cls.Value) = "K" Then THCong = THCong + 1
    End Select
 Next Cls
End Function
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Bác Sa ơi, nếu hàm tự tạo chấm công, dạng x (x thường) là 8 tiếng, dạng X (X HOA) là 12 tiếng, thì hàm phải Count là làm sao?
 
Upvote 0
Các bạn ơi, mình muốn xin công thức chấm công nhân viên với nội dung như vầy nè:

1 tháng có 26 ngày,nếu làm chủ nhật sẽ tính tiền lương cao hơn,nhưng phải đảm bảo trong 1 tháng có 26 ngày công mới tính chủ nhật,còn làm không đủ dù cho có làm hết các ngày chủ nhật trong tháng cũng không được tính

PHP:
Option Explicit
Function CongTH(NgCg As Range, Optional CN As Boolean = True)
 Dim Cls As Range, cT As Byte, cCN As Byte, GPE As String
 
 For Each Cls In NgCg
    GPE = UCase$(Cls.Value)
    If GPE = "X" Then
        cT = 1 + cT
        If CN And Cells(9, Cls.Column).Value = "CN" Then cCN = 1 + cCN
    End If
 Next Cls
 
 If CN And cT >= 26 Then
    CongTH = cCN
 ElseIf CN = False Then
    CongTH = cT
End If
End Function
http://www.giaiphapexcel.com/forum/showthread.php?39056-Bảng-chấm-công-bảng-lương-mẫu/#27

Bác Sa ơi, nếu hàm tự tạo chấm công, dạng x (x thường) là 8 tiếng, dạng X (X HOA) là 12 tiếng, thì hàm phải Count là làm sao?
Trong VBA có hàm UCase$() mà
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Ở cơ quan nọ có một bảng chấm công ngược, chắc ai đi làm ngày nào & bao nhiêu ca/giờ thì được chấm như hình dưới đây:

BCCong.GIF

Có nghĩa là nhiệm vụ đề ra cho chúng ta chỉ là tổng hợp các chữ số 0 liên tục, sau đó đến số các số khác 0 liên tục; Tiếp nữa sẽ là các số 0 liên tục. . . cứ vậy cho đến hết tháng.

Kết quả được ghi sau cột 'AG' như trên hình;

Đây là hàm mảng tự tạo để hoàn thành nhiệm vụ đề ra:

PHP:
Option Explicit:           Option Base 1
Function DemCong(LookUpRange As Range)
 Dim Clls As Range, Jj As Integer, bD As Integer, Ww As Integer
  
 bD = LookUpRange.Count
 ReDim MDL(bD)
 If LookUpRange.Cells(1, 1).Value = "0" Then Jj = 2 Else Jj = 1
 For Each Clls In LookUpRange
   If Clls.Value <> "" Then MDL(Jj) = MDL(Jj) + 1
   With Clls.Offset(, 1)
      If (Jj Mod 2 = 1 And .Value = "0") _
         Or (Jj Mod 2 = 0 And .Value <> "0") Then
         Jj = Jj + 1
      End If
   End With
 Next Clls
'Khu Các So Không Trong Ma?ng:'
 For Ww = Jj + 1 To bD
   MDL(Ww) = ""
 Next Ww
 DemCong = MDL
End Function

Cú f áp hàm tại các ô 'AH9:AQ9'=DemCong(B9:AF9)
 
Upvote 0
Một đơn vị khác có bảng chấm công thêm giờ cho công nhân viên như dưới đây. Trong đó đã có ghi luôn iêu cầu tính số ngày làm thêm giờ ở ba khoảng

DemCong.GIF

Sau đây là nội dung của hàm
PHP:
Option Explicit
Function DemCong(LookUpRange As Range, Loai As String)
 Dim Clls As Range, Thu As Byte
  
 For Each Clls In LookUpRange
   With Clls
      Thu = Weekday(Range("Ngay").Offset(, .Column - 1).Value)
      If (.Value <= 2.5 And .Value >= 2) And Loai = "T2" And Thu <> 1 Then
         DemCong = 1 + DemCong
      ElseIf .Value >= 3 And Loai = "T3" And Thu <> 1 Then
         DemCong = 1 + DemCong
      ElseIf .Value >= 8 And Loai = "T8" And Thu = 1 Then
         DemCong = 1 + DemCong
      End If
   End With
 Next Clls
End Function

Cú fáp hàm tại [AH6] sẽ là =DemCong($C6:$AG6, AH5)

Tham khảo: http://webkinhte.com/forum/showthread.php?t=2986#6
 
Lần chỉnh sửa cuối:
Upvote 0
PHP:
Option Explicit
Function THCong(NCong As Range, Loai As String)
 Dim Cls As Range
 
 For Each Cls In NCong
    Select Case UCase$(Loai)
    Case "X"
        If UCase$(Cls.Value) = "A" Or UCase$(Cls.Value) = "X/2" Then
            THCong = THCong + 0.5
        ElseIf UCase$(Cls.Value) = "X" Then
            THCong = THCong + 1
        End If
    Case "X7", "P", "L"
        If UCase(Cls.Value) = "Y" And Loai = "P" Then THCong = THCong + 1
        If UCase(Cls.Value) = "L" And Loai = "L" Then THCong = THCong + 1
        If UCase(Cls.Value) = "X7" And Loai = "X7" Then THCong = THCong + 1
    Case "KP"
        If UCase$(Cls.Value) = "A" Then THCong = THCong + 0.5
        If UCase(Cls.Value) = "K" Then THCong = THCong + 1
    End Select
 Next Cls
End Function

Bác sửa lại một tí, để hàm này sẽ tính dựa trên loại người dùng đưa vào.
Ví dụ:
Mã:
THCong(Range("B1:B31"),"nghile")
 
Upvote 0
Web KT

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

Back
Top Bottom