来自:Excel不加班(ID:Excelbujiaban)
作者:卢子
考勤表,既然你要,我就总结一些我用过的考勤表。考勤表比较特殊,每个公司都略有差异,仅供参考。
1、手工记录考勤明细
借助手工输入简称,比如Z就表示正常上班。
员工考勤表
统计表
在员工考勤表内使用简称,而统计表又使用全称,也就是说需要将统计表的全程用公式转换成简称,这样才能实现统计。
可借助VLOOKUP函数实现转换。
=VLOOKUP(B$1,员工考勤表!$B$17:$C$22,2,0)
因为姓名都是按原来顺序的,直接就用单条件计数函数COUNTIF就可以。在B2输入公式,并向右拉到G2,然后向下拉。
=COUNTIF(员工考勤表!5:5,VLOOKUP(B$1,员工考勤表!$B$17:$C$22,2,0))
实际上班天数,在H2输入公式并向下拉。
=SUM(E2:G2)
2、系统导出考勤表并实现格式转换
系统里面可以自定义内容,比如开会休息等,每天只打2次卡,公司比较人性化,对迟到这些不做任何处罚。
考勤明细
现在要将考勤数据导入到另外一个表格模板。
转换表
接下来就是见证奇迹的时刻!
只需点一下导入考勤,瞬间就将数据实现转换。如果你眼神比较好,就知道这是我们公司的考勤表。
附源代码:
Sub Kaoqin()
Dim MxSht, MxsR As Long, MxNRng As Range, NameArr
Dim MaxR As Long, MaxC As Byte, KaoQ() As String
Dim NBoot As Boolean, StaR As Long, TemRng, Cou As Long
Dim iR As Long, iC As Byte, MxR As Long, MxC As Byte
Sheet1.Range("D5:AI104").UnMerge
With Sheet2
Rem
MxsR = .Cells(1, 1).End(xlDown).Row
' MxSht = .Cells(1, 1).Resize(MxsR, 6).Value
Set MxNRng = .Cells(1, 2).Resize(MxsR)
MaxR = Me.Cells(5, 3).End(xlDown).Row - 4
MaxC = Me.Cells(4, Columns.Count).End(xlToLeft).Column - 4
ReDim KaoQ(1 To MaxR, 1 To MaxC)
NameArr = Me.Cells(5, 2).Resize(MaxR).Value
For iR = 1 To MaxR Step 2
Rem 姓名存在否
NBoot = WorksheetFunction.CountIf(MxNRng, NameArr(iR, 1))
Rem 存在时处理考勤数据
If NBoot Then
StaR = WorksheetFunction.Match(NameArr(iR, 1), MxNRng, 0)
Cou = WorksheetFunction.CountIf(MxNRng, NameArr(iR, 1))
TemRng = .Cells(StaR, 2).Resize(Cou, 5).Value
Rem 日期核对数据写入,上班下班的数据
For MxR = 1 To Cou
KaoQ(iR, Day(TemRng(MxR, 3))) = TemRng(MxR, 4) '对应日期上班时间数据
KaoQ(iR + 1, Day(TemRng(MxR, 3))) = TemRng(MxR, 5) '对应日期下班时间数据
Next MxR
End If
Next iR
End With
Me.Cells(5.1).Resize(MaxR) = NameArr
Me.Cells(5, 4).Resize(MaxR, MaxC) = KaoQ
End Sub
3、系统导出考勤表并实现统计工资
这也是我以前公司使用过的考勤表。
系统考勤明细
先通过分列,将内容显示在3列。
因为我们打卡的时候,有的时候会打不止一次,比如50秒打完卡,51秒又不小心按了一次,这就出现了2条记录。对于这种需要重新处理,判断是否为首次出现。
在E2输入公式,并向下填充。首次出现的显示1,否则显示空白。
=IF(COUNTIFS(A$2:A2,A2,B$2:B2,B2,C$2:C2,C2)=1,1,"")
这边采用的是日薪的方法统计工资的,日薪采用随机数,你懂的!