ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
123
返回列表 发新帖
楼主: yus99

[求助] 如何根据EXCEL回收答案进行评分

[复制链接]

TA的精华主题

TA的得分主题

发表于 2020-3-3 15:37 | 显示全部楼层
  1. Sub test()
  2.   Dim r%, i%
  3.   Dim arr, brr, crr, drr()
  4.   Dim d As Object
  5.   Dim reg As New RegExp
  6.   Dim flg As Boolean
  7.   Set d = CreateObject("scripting.dictionary")
  8.   Set d1 = CreateObject("scripting.dictionary")
  9.   Set d_da = CreateObject("scripting.dictionary")
  10.   With reg
  11.     .Pattern = "^(\d+)\.题"
  12.   End With
  13.   
  14.   With Worksheets("设置")
  15.     r = .Cells(.Rows.Count, 2).End(xlUp).Row
  16.     arr = .Range("a3:d4")
  17.     ReDim cs(1 To 4)
  18.     cs(1) = .Columns(arr(1, 2)).Column
  19.     cs(2) = .Columns(arr(1, 4)).Column
  20.     cs(3) = .Columns(arr(2, 2)).Column
  21.     cs(4) = .Columns(arr(2, 4)).Column
  22.     arr = .Range("a5:e" & r)
  23.     For i = 2 To UBound(arr)
  24.       Set d_da(arr(i, 1)) = CreateObject("scripting.dictionary")
  25.       For j = 2 To UBound(arr, 2)
  26.         d_da(arr(i, 1))(arr(1, j)) = arr(i, j)
  27.       Next
  28.     Next
  29.     zf = Application.Sum(Application.Index(arr, 0, 3))
  30.   End With
  31.   
  32.   
  33.   With Worksheets("源作业")
  34.     r = .Cells(.Rows.Count, 1).End(xlUp).Row
  35.     c = .Cells(1, .Columns.Count).End(xlToLeft).Column
  36.     arr = .Range("a1").Resize(r, c)
  37.     ReDim brr(1 To UBound(arr) + 2, 1 To 3 + d_da.Count)
  38.     ls = UBound(brr, 2)
  39.     brr(1, 1) = "题号"
  40.     brr(1, ls - 1) = "总分"
  41.     brr(1, ls) = "得分率"
  42.     brr(2, 1) = "标准答案"
  43.     brr(3, 1) = "平均得分"
  44.     n = 2
  45.     For Each aa In d_da.keys
  46.       brr(1, n) = aa
  47.       brr(2, n) = d_da(aa)("答案")
  48.       n = n + 1
  49.     Next
  50.    
  51.     For i = 2 To UBound(arr)
  52.       brr(i + 2, 1) = arr(i, cs(3))
  53.       For j = cs(1) To cs(2)
  54.         If InStr(arr(i, j), ".") <> 0 Then
  55.           Set mh = reg.Execute(arr(1, j))
  56.           If mh.Count > 0 Then
  57.             n = Val(mh(0).SubMatches(0)) + 1
  58.             brr(i + 2, n) = brr(i + 2, n) & Split(arr(i, j), ".")(1)
  59.           End If
  60.         End If
  61.       Next
  62.     Next
  63.   End With
  64.   
  65.   For j = 2 To ls - 2
  66.     For i = 4 To UBound(brr)
  67.       If Len(brr(i, j)) <> 0 Then
  68.         If Len(brr(2, j)) = 1 Then
  69.           If brr(i, j) = brr(2, j) Then
  70.             brr(i, j) = d_da(brr(1, j))("全对得分") & "|" & brr(i, j)
  71.           Else
  72.             brr(i, j) = d_da(brr(1, j))("错选得分") & "|" & brr(i, j)
  73.           End If
  74.         Else
  75.           If Len(brr(i, j)) = Len(brr(2, j)) Then
  76.             If brr(i, j) = brr(2, j) Then
  77.               brr(i, j) = d_da(brr(1, j))("全对得分") & "|" & brr(i, j)
  78.             Else
  79.               brr(i, j) = d_da(brr(1, j))("错选得分") & "|" & brr(i, j)
  80.             End If
  81.           ElseIf Len(brr(i, j)) > Len(brr(2, j)) Then
  82.             brr(i, j) = d_da(brr(1, j))("错选得分") & "|" & brr(i, j)
  83.           Else
  84.             flg = True
  85.             For k = 1 To Len(brr(i, j))
  86.               ch = Mid(brr(i, j), k, 1)
  87.               If InStr(brr(2, j), ch) = 0 Then
  88.                 flg = False
  89.                 Exit For
  90.               End If
  91.             Next
  92.             If flg Then
  93.               brr(i, j) = d_da(brr(1, j))("漏选得分") & "|" & brr(i, j)
  94.             Else
  95.               brr(i, j) = d_da(brr(1, j))("错选得分") & "|" & brr(i, j)
  96.             End If
  97.           End If
  98.         End If
  99.       End If
  100.     Next
  101.   Next
  102.   
  103.   For i = 4 To UBound(brr)
  104.     For j = 2 To ls - 2
  105.       brr(i, ls - 1) = brr(i, ls - 1) + Val(brr(i, j))
  106.     Next
  107.     brr(i, ls) = Round(brr(i, ls - 1) / zf, 4)
  108.   Next
  109.   
  110.   For j = 2 To ls - 1
  111.     For i = 4 To UBound(brr)
  112.       brr(3, j) = brr(3, j) + Val(brr(i, j))
  113.     Next
  114.   Next
  115.   For j = 2 To ls - 1
  116.     brr(3, j) = Round(brr(3, j) / (UBound(brr) - 3), 2)
  117.   Next
  118.   brr(3, ls) = Round(brr(3, ls - 1) / zf, 4)
  119.   With Worksheets("评分")
  120.     .UsedRange.Offset(1, 0).ClearContents
  121.     .Columns(UBound(brr, 2)).NumberFormatLocal = "0.00%"
  122.     .Range("a2").Resize(UBound(brr), UBound(brr, 2)) = brr
  123.     With .Range("a2").Resize(UBound(brr), UBound(brr, 2))
  124.       .Borders.LineStyle = xlContinuous
  125.     End With
  126.     With .UsedRange
  127.       .HorizontalAlignment = xlCenter
  128.       .VerticalAlignment = xlCenter
  129.     End With
  130.   End With
  131. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2020-3-3 15:38 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
修改好了。

求助自动批阅选择题.rar

42.93 KB, 下载次数: 3

TA的精华主题

TA的得分主题

发表于 2020-3-3 16:46 | 显示全部楼层
完善了一下。

求助自动批阅选择题.rar

40.78 KB, 下载次数: 0

TA的精华主题

TA的得分主题

发表于 2020-3-3 16:58 | 显示全部楼层
感觉参数设置表里的一些参数设置是画蛇添足,取消掉由代码自动判断还是要好一些。

求助自动批阅选择题.rar

40.89 KB, 下载次数: 4

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-3-3 17:09 | 显示全部楼层
chxw68 发表于 2020-3-3 16:58
感觉参数设置表里的一些参数设置是画蛇添足,取消掉由代码自动判断还是要好一些。

非常感谢,刚才发的样表,评分 表中 B列少 一列 班级。不能能帮助完善一下。谢谢。
另外,因为其他老师要问我,这是谁做的,怎么介绍您呢?能不能私下告知下。

TA的精华主题

TA的得分主题

发表于 2020-3-3 17:38 | 显示全部楼层
修改好了。

求助自动批阅选择题.rar

41.74 KB, 下载次数: 1

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-3-3 22:04 | 显示全部楼层

非常感谢!根据代码,我想修改一下,如果得满分不显色,漏选显示浅一点颜色填充,错选深一点颜色填充。
修改好久没有实现。能不能再帮帮。都不好意思开口了。
2020-03-03_215902.png

TA的精华主题

TA的得分主题

发表于 2020-3-3 23:58 | 显示全部楼层
  1. Sub test()
  2.   Dim r%, i%
  3.   Dim arr, brr
  4.   Dim d As Object
  5.   Dim flg As Boolean
  6.   Application.ScreenUpdating = False
  7.   Application.DisplayAlerts = False
  8.   Set d = CreateObject("scripting.dictionary")
  9.   Set d1 = CreateObject("scripting.dictionary")
  10.   
  11.   With Worksheets("设置")
  12.     r = .Cells(.Rows.Count, 2).End(xlUp).Row
  13.     arr = .Range("a3:e" & r)
  14.     ksmc = .Range("b1")
  15.     For i = 2 To UBound(arr)
  16.       Set d1(arr(i, 1)) = CreateObject("scripting.dictionary")
  17.       For j = 2 To UBound(arr, 2)
  18.         d1(arr(i, 1))(arr(1, j)) = arr(i, j)
  19.       Next
  20.     Next
  21.     zf = Application.Sum(Application.Index(arr, 0, 3))
  22.   End With
  23.   
  24.   ls = d1.Count + 4
  25.   With Worksheets("源作业")
  26.     r = .Cells(.Rows.Count, 1).End(xlUp).Row
  27.     c = .Cells(1, .Columns.Count).End(xlToLeft).Column
  28.     arr = .Range("a1").Resize(r, c)
  29.     j0 = -1
  30.     j1 = -1
  31.     For j = 1 To UBound(arr, 2)
  32.       If InStr(arr(1, j), "姓名") <> 0 Then
  33.         j0 = j
  34.       ElseIf InStr(arr(1, j), "班级") <> 0 Then
  35.         j1 = j
  36.       End If
  37.     Next
  38.     If j0 = -1 Then
  39.       MsgBox "源作业表格数据有误!"
  40.       Exit Sub
  41.     End If
  42.       
  43.     ReDim brr(1 To UBound(arr) + 2, 1 To ls)
  44.     ReDim crr(1 To UBound(arr) + 2, 1 To ls)
  45.     brr(1, 1) = "姓名"
  46.     brr(1, 2) = "班级"
  47.     brr(1, ls - 1) = "总分"
  48.     brr(1, ls) = "得分率"
  49.     n = 3
  50.     For Each aa In d1.keys
  51.       brr(1, n) = aa
  52.       brr(2, n) = d1(aa)("答案")
  53.       n = n + 1
  54.     Next
  55.    
  56.     For i = 2 To UBound(arr)
  57.       brr(i + 2, 1) = arr(i, j0)
  58.       If j1 <> -1 Then
  59.         brr(i + 2, 2) = arr(i, j1)
  60.       End If
  61.       For j = 1 To UBound(arr, 2)
  62.         If InStr(arr(i, j), ".") <> 0 Then
  63.           n = Val(Split(arr(1, j), ".")(0))
  64.           If d1.exists(n) Then
  65.             brr(i + 2, n + 2) = brr(i + 2, n + 2) & Split(arr(i, j), ".")(1)
  66.           End If
  67.         End If
  68.       Next
  69.     Next
  70.   End With
  71.   
  72.   For j = 3 To ls - 2
  73.     For i = 4 To UBound(brr)
  74.       If Len(brr(i, j)) <> 0 Then
  75.         If Len(brr(i, j)) = Len(brr(2, j)) Then
  76.           If brr(i, j) = brr(2, j) Then
  77.             brr(i, j) = d1(brr(1, j))("全对得分") & "|" & brr(i, j)
  78.             crr(i, j) = 1
  79.           Else
  80.             brr(i, j) = d1(brr(1, j))("错选得分") & "|" & brr(i, j)
  81.             crr(i, j) = -1
  82.           End If
  83.         ElseIf Len(brr(i, j)) > Len(brr(2, j)) Then
  84.           brr(i, j) = d1(brr(1, j))("错选得分") & "|" & brr(i, j)
  85.           crr(i, j) = -1
  86.         Else
  87.           flg = True
  88.           For k = 1 To Len(brr(i, j))
  89.             ch = Mid(brr(i, j), k, 1)
  90.             If InStr(brr(2, j), ch) = 0 Then
  91.               flg = False
  92.               Exit For
  93.             End If
  94.           Next
  95.           If flg Then
  96.             brr(i, j) = d1(brr(1, j))("漏选得分") & "|" & brr(i, j)
  97.             crr(i, j) = 0
  98.           Else
  99.             brr(i, j) = d1(brr(1, j))("错选得分") & "|" & brr(i, j)
  100.             crr(i, j) = -1
  101.           End If
  102.         End If
  103.       End If
  104.     Next
  105.   Next

  106.   For i = 4 To UBound(brr)
  107.     For j = 3 To ls - 2
  108.       brr(i, ls - 1) = brr(i, ls - 1) + Val(brr(i, j))
  109.     Next
  110.     brr(i, ls) = Round(brr(i, ls - 1) / zf, 4)
  111.   Next

  112.   For j = 3 To ls - 1
  113.     For i = 4 To UBound(brr)
  114.       brr(3, j) = brr(3, j) + Val(brr(i, j))
  115.     Next
  116.   Next
  117.   For j = 3 To ls - 1
  118.     brr(3, j) = Round(brr(3, j) / (UBound(brr) - 3), 2)
  119.   Next
  120.   brr(3, ls) = Round(brr(3, ls - 1) / zf, 4)
  121.   With Worksheets("评分")
  122.     .Cells.Clear
  123.     With .Range("a1")
  124.       .Value = ksmc
  125.       .Resize(1, ls).Merge
  126.       With .Font
  127.         .Name = "微软雅黑"
  128.         .Size = 16
  129.       End With
  130.     End With
  131.     .Columns(UBound(brr, 2)).NumberFormatLocal = "0.00%"
  132.     .Range("a2").Resize(UBound(brr), UBound(brr, 2)) = brr
  133.     .Range("c2").Resize(1, ls - 4).NumberFormatLocal = "0题"
  134.     For i = 4 To UBound(crr)
  135.       For j = 3 To ls - 2
  136.         If Len(crr(i, j)) <> 0 Then
  137.           Select Case crr(i, j)
  138.             Case 1
  139.               .Cells(i + 1, j).Interior.ColorIndex = 4
  140.             Case 0
  141.               .Cells(i + 1, j).Interior.ColorIndex = 6
  142.             Case -1
  143.               .Cells(i + 1, j).Interior.ColorIndex = 3
  144.           End Select
  145.         End If
  146.       Next
  147.     Next
  148.     For j = 1 To 2
  149.       .Cells(2, j).Resize(3, 1).Merge
  150.     Next
  151.     For j = ls - 1 To ls
  152.       .Cells(2, j).Resize(2, 1).Merge
  153.     Next
  154.     With .Range("a2").Resize(UBound(brr), UBound(brr, 2))
  155.       .Borders.LineStyle = xlContinuous
  156.     End With
  157.     With .UsedRange
  158.       .HorizontalAlignment = xlCenter
  159.       .VerticalAlignment = xlCenter
  160.     End With
  161.   End With
  162.   Application.ScreenUpdating = True
  163.   MsgBox "成绩统计完毕!"
  164. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2020-3-3 23:59 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
修改好了!全对-绿,半对-黄,错-红。

求助自动批阅选择题.rar

42.82 KB, 下载次数: 5

您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-4-27 03:39 , Processed in 0.044306 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表