这个题目用VBA也不是很简单的说。
下面的VBA代码,使用了词典嵌套。(数组是当然的了)- Sub test()
- tm = Timer
- Application.ScreenUpdating = False
- Sheet2.Activate
- arr = [a1:j1765]
- Set dbz = CreateObject("Scripting.Dictionary")
- Set ddy = CreateObject("Scripting.Dictionary")
-
- For i = 2 To UBound(arr)
- If Not dbz.Exists(arr(i, 2)) Then Set dbz(arr(i, 2)) = CreateObject("Scripting.Dictionary")
- dbz(arr(i, 2))(arr(i, 3)) = arr(i, 6)
-
- If Not ddy.Exists(arr(i, 1)) Then Set ddy(arr(i, 1)) = CreateObject("Scripting.Dictionary")
- ddy(arr(i, 1))(arr(i, 3)) = arr(i, 5)
- Next
-
- cb = dbz.Count
- bz = dbz.Keys
- ReDim bzf(cb - 1, 4)
- For i = 0 To dbz.Count - 1
- bzf(i, 0) = dbz(bz(i)).Items
- bzf(i, 1) = bz(i)
- bzf(i, 2) = WorksheetFunction.Large(bzf(i, 0), 50)
- [t1].Resize(UBound(arr)) = WorksheetFunction.Transpose(bzf(i, 0))
- bzf(i, 3) = 50 - WorksheetFunction.CountIf([t1].Resize(UBound(arr)), ">" & bzf(i, 2))
- dbz(bz(i)) = i
- Next
-
- cd = ddy.Count
- dy = ddy.Keys
- ReDim dyf(cd - 1, 6)
- For i = 0 To ddy.Count - 1
- dyf(i, 0) = ddy(dy(i)).Items
- dyf(i, 1) = dy(i)
- dyf(i, 2) = WorksheetFunction.Large(ddy(dy(i)).Items, 60)
- dyf(i, 3) = WorksheetFunction.Large(ddy(dy(i)).Items, 180)
- [t1].Resize(UBound(arr)) = WorksheetFunction.Transpose(dyf(i, 0))
- dyf(i, 4) = 60 - WorksheetFunction.CountIf([t1].Resize(UBound(arr)), ">" & dyf(i, 2))
- dyf(i, 5) = 180 - WorksheetFunction.CountIf([t1].Resize(UBound(arr)), ">" & dyf(i, 3))
- ddy(dy(i)) = i
- Next
- [t1].Resize(UBound(arr)).Clear
-
- For i = 2 To UBound(arr)
- If arr(i, 6) > bzf(dbz(arr(i, 2)), 2) Then
- arr(i, 7) = 1
- bzf(dbz(arr(i, 2)), 4) = bzf(dbz(arr(i, 2)), 4) + 1
- ElseIf arr(i, 6) = bzf(dbz(arr(i, 2)), 2) Then
- If bzf(dbz(arr(i, 2)), 3) > 0 Then
- arr(i, 7) = 50 - bzf(dbz(arr(i, 2)), 3) + 1
- bzf(dbz(arr(i, 2)), 3) = bzf(dbz(arr(i, 2)), 3) - 1
- bzf(dbz(arr(i, 2)), 4) = bzf(dbz(arr(i, 2)), 4) + 1
- End If
- End If
-
- If arr(i, 5) < dyf(ddy(arr(i, 1)), 2) And arr(i, 5) > dyf(ddy(arr(i, 1)), 3) Then
- arr(i, 8) = 1
- dyf(ddy(arr(i, 1)), 6) = dyf(ddy(arr(i, 1)), 6) + 1
- ElseIf arr(i, 5) = dyf(ddy(arr(i, 1)), 2) Then
- dyf(ddy(arr(i, 1)), 4) = dyf(ddy(arr(i, 1)), 4) - 1
- If dyf(ddy(arr(i, 1)), 4) <= 0 Then
- arr(i, 8) = 60 - dyf(ddy(arr(i, 1)), 4)
- dyf(ddy(arr(i, 1)), 6) = dyf(ddy(arr(i, 1)), 6) + 1
- End If
- ElseIf arr(i, 5) = dyf(ddy(arr(i, 1)), 3) Then
- If dyf(ddy(arr(i, 1)), 5) > 0 Then
- arr(i, 8) = 180 - dyf(ddy(arr(i, 1)), 5) + 1
- dyf(ddy(arr(i, 1)), 5) = dyf(ddy(arr(i, 1)), 5) - 1
- dyf(ddy(arr(i, 1)), 6) = dyf(ddy(arr(i, 1)), 6) + 1
- End If
- End If
-
- Next
-
- ReDim brr(32, 1)
- brr(0, 0) = "班级"
- brr(0, 1) = "VBA人数"
- For i = 1 To 32
- brr(i, 0) = "'" & Right("0" & i, 2)
- Next
-
- For i = 2 To UBound(arr)
- If arr(i, 7) > 0 And arr(i, 8) > 0 Then
- arr(i, 9) = 1
- brr(Val(arr(i, 2)), 1) = brr(Val(arr(i, 2)), 1) + 1
- Else
- arr(i, 9) = ""
- End If
- Next
-
- [g1].Resize(UBound(arr)) = Application.Index(arr, , 7) 'WorksheetFunction.Transpose(arr)
- [h1].Resize(UBound(arr)) = Application.Index(arr, , 8) 'WorksheetFunction.Transpose(arr)
- [i1].Resize(UBound(arr)) = Application.Index(arr, , 9) 'WorksheetFunction.Transpose(arr)
- Sheet3.[g1].Resize(33, 2) = brr
- Application.ScreenUpdating = True
- MsgBox Format(Timer - tm, "0.00")
- End Sub
复制代码 因为里面使用了工作表函数=countif()来计算,所有工作表本身不能使用太多的函数,最好没有数组函数。否则计算时间会长到难以忍受。
|