ExcelTip.Net留存知识帖 ---【注:附件之前被网盘供应商清空后,现已修复-现已修复-现已修复为本地下载!】
现在位置:首页 > E问E答 > Excel VBA > 如何用vba代码统计乱序的学生成绩中各班级的科目最低分信息?

如何用vba代码统计乱序的学生成绩中各班级的科目最低分信息?

作者:绿色风 分类: 时间:2022-08-17 浏览:78
楼主
kevinchengcw
Q: 如何用vba代码统计乱序的学生成绩中各班级的科目最低分信息?
A: 代码如下:
  1. Sub test()
  2. Dim Dic As Object, Arr, Result, Rng As Range, N&, I&, Str$
  3. Set Dic = CreateObject("scripting.dictionary")  '创建字典项目
  4. ReDim Result(1 To 9, 1 To 1)  '重定义结果数组
  5. Arr = Split("a,b,c,d,e,f,g,q,u,y", ",")  '赋值要提取内容的列的数组
  6. For N = LBound(Arr) To UBound(Arr) - 3  '循环写入信息标题
  7.     Result(N + 1, 1) = Cells(1, Arr(N)).Value
  8. Next N
  9. Result(8, 1) = "最低分科目"  '写入科目及分数信息标题
  10. Result(9, 1) = "分数"
  11. For Each Rng In Range("F3:F" & Cells(Rows.Count, "F").End(3).Row)  '循环姓名列各单元格
  12.     For N = UBound(Arr) - 2 To UBound(Arr)  '循环科目列标
  13.         If Cells(Rng.Row, Arr(N)) <> "" Then  '如果分数不为空,则
  14.             Str = Cells(Rng.Row, "C").Value & vbTab & Cells(Rng.Row, "D").Value & vbTab & Cells(1, Arr(N))  '组合年班及科目信息字符串
  15.             If Dic.exists(Str) Then  '如果已经存在该字项目,则
  16.                 If Cells(Rng.Row, Arr(N)) < Result(UBound(Result), Dic(Str)) Then  '如果当前行科目分数小于已存数据,则循环更新结果数据为当前行数据
  17.                     For I = LBound(Arr) To UBound(Arr) - 3
  18.                         Result(I + 1, Dic(Str)) = Cells(Rng.Row, Arr(I))
  19.                     Next I
  20.                     Result(9, Dic(Str)) = Cells(Rng.Row, Arr(N))
  21.                 End If
  22.             Else
  23.                 ReDim Preserve Result(1 To 9, 1 To UBound(Result, 2) + 1)  '如果未存在该字典项目,则为结果数组添加一列,并在字典中添加该项目,记录下在结果数组中的列号,并循环将数据写入对应位置
  24.                 Dic.Add Str, UBound(Result, 2)
  25.                 For I = LBound(Arr) To UBound(Arr) - 3
  26.                     Result(I + 1, Dic(Str)) = Cells(Rng.Row, Arr(I))
  27.                 Next I
  28.                 Result(8, Dic(Str)) = Cells(1, Arr(N))
  29.                 Result(9, Dic(Str)) = Cells(Rng.Row, Arr(N))
  30.             End If
  31.         End If
  32.     Next N
  33. Next Rng
  34. With [ah2].Resize(UBound(Result, 2), UBound(Result))  '将结果写入以ah2为左上角的区域(先清空整列再写入数组数据)
  35.     .EntireColumn.ClearContents
  36.     .Value = Application.Transpose(Result)
  37. End With
  38. Set Dic = Nothing  '清空字典项目
  39. End Sub
详见二楼附件及素材源帖.
2楼
Zaezhong
附件请参见此楼
学生数据库2011春.rar

免责声明

有感于原ExcelTip.Net留存知识的价值及部分知识具有的时间限定性因素, 经与ExcelTip.Net站长Apolloh商议并征得其同意, 现将原属ExcelTip.Net的知识帖采集资料于本站点进行展示, 供有需要的人士查询使用,也慰缅曾经的论坛时代。 所示各个帖子的原作者如对版权有异议, 可与本人沟通提出,或于本站点留言,我们会尽快处理。 在此,感谢ExcelTip.Net站长Apolloh的支持,感谢本站点所有人**绿色风(QQ:79664738)**的支持与奉献,特此鸣谢!
------本人网名**KevinChengCW(QQ:1210618015)**原ExcelTip.Net总版主之一

评论列表
sitemap