|
本帖最后由 zgwei050 于 2011-2-26 00:03 编辑
具体问题见:http://www.excelpx.com/thread-162318-1-1.html
这是检查缺勤情况的代码(数组+字典),供初学者参考。检查加班情况的代码见:
http://www.excelpx.com/forum.php?mod=viewthread&tid=162765&extra=
- Sub 检查缺勤情况()
- Dim WSa As Worksheet, WSb As Worksheet '定义各种变量
- Dim d(1 To 2) As Object
- Dim i As Long, j As Long, n As Long, m As Long
- Dim LastRowA As Long, LastRowB As Long
- Dim arr1, arr2, arr, brr()
- Dim Myname
- On Error Resume Next '容错处理
- Set d(1) = CreateObject("Scripting.Dictionary") '定义2个字典d(1)和d(2)
- Set d(2) = CreateObject("Scripting.Dictionary")
- 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)
- d(1)(arr2(i, 1) & arr2(i, 2)) = ""
- '产生"现工作日期"工作表每一行的“姓名&日期”不重复组合数据——意味着现有记录的员工出勤情况
- d(2)(arr2(i, 1)) = "" '提取"现工作日期"工作表C列不重复“姓名”数据
- Next i
- '下面定义arr数组,其中第一维的上标为“应工作日期”工作表中A列数据数×不重复姓名数
- ReDim arr(1 To UBound(arr1) * d(2).Count, 1 To 2)
- For Each Myname In d(2).keys '对于每个姓名而言,
- For j = 1 To UBound(arr1) '将与"应工作日期"工作表中A列数据区数据组合——产生一个过渡数组arr
- m = m + 1 '计数
- arr(m, 1) = Myname '记录姓名(重复记录)
- arr(m, 2) = arr1(j, 1) '及对应的应出勤日期
- Next j
- Next
- '以上就产生了一个过渡数组arr——记录每个员工必须出勤的情况
- '下面比较应出勤情况(arr数组)与现有记录的员工出勤情况d(1)
- For i = 1 To UBound(arr)
- If Not d(1).exists(arr(i, 1) & arr(i, 2)) Then '如果在“现有记录”中没有找到“应出勤记录”——就是缺勤记录
- n = n + 1 '计数
- ReDim Preserve brr(1 To 2, 1 To n) '动态定义数组brr——记录相应的缺勤记录
- brr(1, n) = arr(i, 1) '缺勤姓名记录
- brr(2, n) = arr(i, 2) '缺勤日期记录
- End If
- Next i
- WSb.Range("F2:G" & Rows.Count) = "" '清空原来的记录
- WSb.Range("F2").Resize(UBound(brr, 2), 2) = Application.Transpose(brr) '显示缺勤记录
- Set d(1) = Nothing
- Set d(2) = Nothing
- End Sub
复制代码
|
|