|
具体问题见:http://www.excelpx.com/thread-162318-1-1.html
这是检查加班情况的代码(数组+字典),相对简单一些,供初学者参考。附件见检查缺勤情况的代码:
http://www.excelpx.com/forum.php?mod=viewthread&tid=162751&page=1#pid2495143
- Sub 检查加班情况()
- Dim WSa As Worksheet, WSb As Worksheet '定义各种变量
- Dim d As Object
- Dim i As Long, j As Long, n As Long
- Dim LastRowA As Long, LastRowB As Long
- Dim arr1, arr2, brr()
- Dim Myname
- On Error Resume Next '容错处理
- Set d = CreateObject("Scripting.Dictionary") '定义字典d
- Set WSa = Sheets("应工作日期") '设置WSa为"应工作日期"工作表
- Set WSb = Sheets("现工作日期") '设置WSb为"现工作日期"工作表
- LastRowA = WSa.Cells(Rows.Count, 1).End(xlUp).Row '计算"应工作日期"工作表中A列数据最后一行行数
- LastRowB = WSb.Cells(Rows.Count, 3).End(xlUp).Row '计算"现工作日期"工作表中A列数据最后一行行数
- arr1 = WSa.Range("A2:A" & LastRowA) '定义"应工作日期"工作表中A列数据区为arr1数组
- arr2 = WSb.Range("C2:D" & LastRowB) '定义"现工作日期"工作表中C和D列数据区为arr2数组
- For i = 1 To UBound(arr2) '提取"现工作日期"工作表C列不重复“姓名”数据
- d(arr2(i, 1)) = ""
- Next i
- For Each Myname In d.keys '对于每个姓名而言,
- For j = 1 To UBound(arr1)
- d(Myname & arr1(j, 1)) = ""
- '与"应工作日期"工作表中A列数据区数据一一组合——
- '产生一个“姓名&日期”不重复组合数据——记录每个员工必须出勤的情况
- Next j
- Next
- '下面比较应出勤情况(d)与现有记录的员工出勤情况
- For i = 1 To UBound(arr2)
- If Not d.exists(arr2(i, 1) & arr2(i, 2)) Then '如果“现有记录”中有记录,但“应出勤记录”中并没有找到——这就是加班记录
- n = n + 1 '计数
- ReDim Preserve brr(1 To 2, 1 To n) '动态定义数组brr——记录相应的加班记录
- brr(1, n) = arr2(i, 1) '加班姓名记录
- brr(2, n) = arr2(i, 2) '加班日期记录
- End If
- Next i
- WSb.Range("I2:J" & Rows.Count) = "" '清空原来的记录
- WSb.Range("I2").Resize(UBound(brr, 2), 2) = Application.Transpose(brr) '显示加班记录
- Set d = Nothing
- End Sub
复制代码
|
|