|
- Sub test()
- Dim r%, i%
- Dim arr, brr
- Dim d As Object
- Dim flg As Boolean
- Application.ScreenUpdating = False
- Application.DisplayAlerts = False
- Set d = CreateObject("scripting.dictionary")
- Set d1 = CreateObject("scripting.dictionary")
-
- With Worksheets("设置")
- r = .Cells(.Rows.Count, 2).End(xlUp).Row
- arr = .Range("a3:e" & r)
- ksmc = .Range("b1")
- For i = 2 To UBound(arr)
- Set d1(arr(i, 1)) = CreateObject("scripting.dictionary")
- For j = 2 To UBound(arr, 2)
- d1(arr(i, 1))(arr(1, j)) = arr(i, j)
- Next
- Next
- zf = Application.Sum(Application.Index(arr, 0, 3))
- End With
-
- ls = d1.Count + 4
- With Worksheets("源作业")
- r = .Cells(.Rows.Count, 1).End(xlUp).Row
- c = .Cells(1, .Columns.Count).End(xlToLeft).Column
- arr = .Range("a1").Resize(r, c)
- j0 = -1
- j1 = -1
- For j = 1 To UBound(arr, 2)
- If InStr(arr(1, j), "姓名") <> 0 Then
- j0 = j
- ElseIf InStr(arr(1, j), "班级") <> 0 Then
- j1 = j
- End If
- Next
- If j0 = -1 Then
- MsgBox "源作业表格数据有误!"
- Exit Sub
- End If
-
- ReDim brr(1 To UBound(arr) + 2, 1 To ls)
- ReDim crr(1 To UBound(arr) + 2, 1 To ls)
- brr(1, 1) = "姓名"
- brr(1, 2) = "班级"
- brr(1, ls - 1) = "总分"
- brr(1, ls) = "得分率"
- n = 3
- For Each aa In d1.keys
- brr(1, n) = aa
- brr(2, n) = d1(aa)("答案")
- n = n + 1
- Next
-
- For i = 2 To UBound(arr)
- brr(i + 2, 1) = arr(i, j0)
- If j1 <> -1 Then
- brr(i + 2, 2) = arr(i, j1)
- End If
- For j = 1 To UBound(arr, 2)
- If InStr(arr(i, j), ".") <> 0 Then
- n = Val(Split(arr(1, j), ".")(0))
- If d1.exists(n) Then
- brr(i + 2, n + 2) = brr(i + 2, n + 2) & Split(arr(i, j), ".")(1)
- End If
- End If
- Next
- Next
- End With
-
- For j = 3 To ls - 2
- For i = 4 To UBound(brr)
- If Len(brr(i, j)) <> 0 Then
- If Len(brr(i, j)) = Len(brr(2, j)) Then
- If brr(i, j) = brr(2, j) Then
- brr(i, j) = d1(brr(1, j))("全对得分") & "|" & brr(i, j)
- crr(i, j) = 1
- Else
- brr(i, j) = d1(brr(1, j))("错选得分") & "|" & brr(i, j)
- crr(i, j) = -1
- End If
- ElseIf Len(brr(i, j)) > Len(brr(2, j)) Then
- brr(i, j) = d1(brr(1, j))("错选得分") & "|" & brr(i, j)
- crr(i, j) = -1
- Else
- flg = True
- For k = 1 To Len(brr(i, j))
- ch = Mid(brr(i, j), k, 1)
- If InStr(brr(2, j), ch) = 0 Then
- flg = False
- Exit For
- End If
- Next
- If flg Then
- brr(i, j) = d1(brr(1, j))("漏选得分") & "|" & brr(i, j)
- crr(i, j) = 0
- Else
- brr(i, j) = d1(brr(1, j))("错选得分") & "|" & brr(i, j)
- crr(i, j) = -1
- End If
- End If
- End If
- Next
- Next
- For i = 4 To UBound(brr)
- For j = 3 To ls - 2
- brr(i, ls - 1) = brr(i, ls - 1) + Val(brr(i, j))
- Next
- brr(i, ls) = Round(brr(i, ls - 1) / zf, 4)
- Next
- For j = 3 To ls - 1
- For i = 4 To UBound(brr)
- brr(3, j) = brr(3, j) + Val(brr(i, j))
- Next
- Next
- For j = 3 To ls - 1
- brr(3, j) = Round(brr(3, j) / (UBound(brr) - 3), 2)
- Next
- brr(3, ls) = Round(brr(3, ls - 1) / zf, 4)
- With Worksheets("评分")
- .Cells.Clear
- With .Range("a1")
- .Value = ksmc
- .Resize(1, ls).Merge
- With .Font
- .Name = "微软雅黑"
- .Size = 16
- End With
- End With
- .Columns(UBound(brr, 2)).NumberFormatLocal = "0.00%"
- .Range("a2").Resize(UBound(brr), UBound(brr, 2)) = brr
- .Range("c2").Resize(1, ls - 4).NumberFormatLocal = "0题"
- For i = 4 To UBound(crr)
- For j = 3 To ls - 2
- If Len(crr(i, j)) <> 0 Then
- Select Case crr(i, j)
- Case 1
- .Cells(i + 1, j).Interior.ColorIndex = 4
- Case 0
- .Cells(i + 1, j).Interior.ColorIndex = 6
- Case -1
- .Cells(i + 1, j).Interior.ColorIndex = 3
- End Select
- End If
- Next
- Next
- For j = 1 To 2
- .Cells(2, j).Resize(3, 1).Merge
- Next
- For j = ls - 1 To ls
- .Cells(2, j).Resize(2, 1).Merge
- Next
- With .Range("a2").Resize(UBound(brr), UBound(brr, 2))
- .Borders.LineStyle = xlContinuous
- End With
- With .UsedRange
- .HorizontalAlignment = xlCenter
- .VerticalAlignment = xlCenter
- End With
- End With
- Application.ScreenUpdating = True
- MsgBox "成绩统计完毕!"
- End Sub
复制代码 |
|