VBA根据日常记录反推出勤状况

VBA根据日常记录反推出勤状况_第1张图片
image.png

这个实例是在日常工作中碰到的问题,就是说在日常记录中并没有单独对出勤状况进行记录,而时常有人问到出勤状况,那么通过对日常记录的分析可以反推出出勤状况。
思路是这样的:

  1. 以姓名为基准,同一天出现无论多少次都是1次记录,记为1天。
    2.通过对记录次数进行累加得出出勤天数。
    3.统计出的出勤记录只是在岗状况的出勤,对于外派、出差记录统计不到。
Sub 出勤统计()
Dim arr, ar, d As Object, i%, ar1, n, d1
Set d = CreateObject("scripting.dictionary")
Set d1 = CreateObject("scripting.dictionary")
arr = Range("a2:c" & Cells(Rows.Count, 1).End(xlUp).Row)

For i = 1 To UBound(arr)
    d(arr(i, 1) & " " & arr(i, 3)) = ""
Next
Range("H2:J" & d.Count).ClearContents
For Each ar In d.keys
    n = n + 1
    ar1 = Split(ar, " ")
    d1(ar1(1)) = d1(ar1(1)) + 1
Next
[H1] = "姓名"
[I1] = "出勤合计"
[H2].Resize(d1.Count) = Application.Transpose(d1.keys)
[I2].Resize(d1.Count) = Application.Transpose(d1.items)
End Sub

代码很短,用了两个字典,第一个字典用于清洗数据,构造以日期和姓名为基础的键,清洗出当天只有1次姓名的记录,第二个字典用于将记录累加。从而统计出出勤天数。
当然这个例子还是有些特殊的,但拓展了些逻辑方面的思维方式。
我们想从A到达B很难,中间隔着很多困难,那么通过架桥C,从A 到达C,再从C到达B就很容易了。


VBA根据日常记录反推出勤状况_第2张图片
image.png

结果:

VBA根据日常记录反推出勤状况_第3张图片
image.png

你可能感兴趣的:(VBA根据日常记录反推出勤状况)