这次评教的所有数据存放在两个数据库中,比如说给某教师评论的学生有100个,可是结果有40个的数据在数据库A中,另外60人的数据在数据库B中。那么,如何将两个库中的数据整合,最后得到教师的准确成绩成为了本次数据整理的首要任务。具体的整合过程是这样的,就拿教师的最终得分来说吧。假设库A学生给教师评价的平均分为90分,而库

B学生评价的平均分为95分。那么首先需要分别计算出库A、库B中学生评价的总分,库A总分 = 90*40 ,库B总分 = 95*60,教师所得总平均分 = (库A总分 + 库B总分)/ 两个库中学生总数。这仅仅是总分一项,之后的各小项得分都需要如此计算。一共大概有300多教师,每个教师都需要如此计算一遍。如果手动计算的话,估计得整理到猴年马月。于是乎,我决定写一个小程序来整理数据,使用的工具就是office里自带的VBA,下面是具体的代码:

  1. '''作 者:王海涛
  2. ''' 间:201362910:10:51
  3. '''过程说明:此过程为多个库中评教数据合并专用过程。主要功能是计算某教师、某课程在多个库中学生评分
  4. ''' 的平均值。
  5. '''使用说明:处理的Excel必须是直接从评教系统导出的Excel,不得更换Excel中列的顺序。
  6.  
  7. Sub formatting()
  8. 'On Error Resume Next '出现错误继续执行下一句
  9. Dim rowCount As Integer '总行数
  10. Dim colCount As Integer '总列数
  11. Dim tempRowCount As Integer '临时行数
  12. Dim tempColumnCount As Integer '临时列数
  13. Dim arrResult(100) As String '存放临时结果
  14. Dim strSheetName As String '存放原工作表名
  15. Dim sheetResult As Worksheet '自定义的工作表
  16. Dim newSheetName As String '新工作表名
  17.  
  18. strSheetName = ActiveSheet.Name '取得当前Sheet的名字
  19.  
  20. '=======================判断工作表的名称是否存在,如果存在,将其删除===============
  21. For Each tempSheet In Sheets '遍历所有的Sheet
  22. '判断工作表的名称是否存在,如果存在,将其删除
  23. If tempSheet.Name = "mySheet" Or tempSheet.Name = strSheetName + "整理结果" Then
  24. Application.DisplayAlerts = False
  25. tempSheet.Delete
  26. Application.DisplayAlerts = True
  27. End If
  28. Next
  29. '=================================================================================
  30.  
  31. newSheetName = "mySheet" '指定工作表名
  32. Set sheetResult = Worksheets.Add '增加工作表
  33. sheetResult.Name = newSheetName
  34.  
  35. Sheets(strSheetName).Activate '将原始表设为当前活动表
  36.  
  37. '操作原始表
  38. With Sheets(strSheetName)
  39. 'rowCount = [b65536].End(xlUp).Row 获得当前工作表总行数
  40. rowCount = UsedRange.Rows.Count '获得当前工作表总行数
  41. colCount = UsedRange.Columns.Count '获得当前工作表总列数
  42.  
  43. Sheets("mySheet").Rows.Insert '新工作表中添加行
  44. Rows(1).Copy Sheets("mySheet").Cells(1, 1) '将原始表中的第一行内容复制到目标工作表中
  45.  
  46. '==================================以下For循环说明===============================
  47. '从第二行开始遍历以后所有行,遍历到每一行时,执行如下操作
  48. '重新遍历所有行,找到与当前行老师、课程一样的数据(说明在多个库中都有这个老师的数据),
  49. '然后将其合并。具体合并过程为:首先算出所有学生评论的总分数、各项的总分数,然后分别用
  50. '总分数除以总评估人数,得到所有学生评论的平均分。
  51.  
  52. '比如:同一老师、同一课程有两行数据,那么
  53. '第一行学生评论总分数 = 第一行已评估人数 * 第一行平均分(这里是总分字段)
  54. '第二行学生评论总分数 = 第二行已评估人数 * 第二行平均分(这里是总分字段)
  55. '学生评论总分数 = 第一行学生评论总分数 + 第二行学生评论总分数
  56. '总评估人数 = 第一行已评估人数 + 第二行已评估人数
  57. '教师最终得分 = 学生评论总分数 / 总评估人数
  58.  
  59. '其余各项得分算法与总分算法一样。
  60. '====================================================================================
  61. For i = 2 To rowCount '从第二行开始遍历以后所有行
  62.  
  63. '=====================给数组赋值,将当前遍历行的数据存到数组里=========================
  64. '1到6分别存学院、教师、课程类型、课程、已评估人数、参评人数
  65. For tempColumnCount = 1 To 6
  66. arrResult(tempColumnCount) = Cells(i, tempColumnCount).Value
  67. Next tempColumnCount
  68. '从总分开始,以后的数组存学生给对应列分数的总和。比如:所有学生评论总分 = 已评估人数 * 平均分数(这里指的是总分)
  69. For tempColumnCount = 7 To colCount
  70. 'Cells(i, 5).Value中的数据为已评估人数
  71. arrResult(tempColumnCount) = Val(Cells(i, tempColumnCount).Value) * Val(Cells(i, 5).Value)
  72. Next tempColumnCount
  73. '=================================数组赋值结束=========================================
  74.  
  75. '开始寻找与当前老师、课程一样的数据(多个库中有的数据),并计算总分数==================
  76. For tempRowCount = 2 To rowCount '所在行的内容和所有行的内容比较
  77. If tempRowCount <> i Then '有效数据是不同与所选行的数据
  78. Dim flag As Boolean '用来标记是否为同一老师同一门课程
  79. flag = True
  80.  
  81. '前四列和第六列,只要有一列与目标数据不一样,说明此条数据不是和目标数据一样的数据,不需要合并
  82. For tempColumnCount = 1 To 6 '比较前六列的值
  83. If tempColumnCount <> 5 Then
  84. If Cells(tempRowCount, tempColumnCount).Value <> Cells(i, tempColumnCount).Value Then
  85. flag = False
  86. End If
  87. End If
  88. Next tempColumnCount
  89.  
  90. '如果是同一老师同一门课程
  91. If flag Then
  92. '评估总人数 = 之前的评估人数 + 本行中的评估人数
  93. arrResult(5) = Val(arrResult(5)) + Val(Cells(tempRowCount, 5).Value)
  94.  
  95. '从总分开始,数组值等于当前总值加上当前行对应的总值。比如:所有学生评论总分 = 之前学生评论总分 + 本行已评估人数 * 本行平均分数(这里指的是总分)
  96. For tempColumnCount = 7 To colCount
  97. arrResult(tempColumnCount) = Val(arrResult(tempColumnCount)) + Val(Cells(tempRowCount, tempColumnCount).Value) * Val(Cells(tempRowCount, 5).Value)
  98. Next tempColumnCount
  99. End If
  100. End If
  101. Next tempRowCount
  102. '===============================计算总分数结束===============================================
  103.  
  104. '将整理结果写到新的工作表中
  105.  
  106. For tempColumnCount = 1 To 6
  107. Sheets("mySheet").Cells(i, tempColumnCount).Value = arrResult(tempColumnCount)
  108. Next tempColumnCount
  109. '从总分开始,以后的值等于数组中对应的数值除以总已评估人数。比如:总分 = 数组中对应的总分值 / 已评估人数
  110. For tempColumnCount = 7 To colCount
  111. Sheets("mySheet").Cells(i, tempColumnCount).Value = Val(arrResult(tempColumnCount)) / Val(arrResult(5))
  112. Next tempColumnCount
  113.  
  114. '如果评估总人数超过参评人数,则评估人数等于参评人数
  115. If Val(Sheets("mySheet").Cells(i, 5).Value) > Val(Sheets("mySheet").Cells(i, 6).Value) Then
  116. Sheets("mySheet").Cells(i, 5).Value = Sheets("mySheet").Cells(i, 6).Value
  117. End If
  118. Next i
  119. '====================================数据计算结束=======================================================
  120.  
  121. '更改新建的工作表名
  122. sheetResult.Name = strSheetName + "整理结果"
  123. End With
  124. End Sub

有了这个小程序,之前可能花费几天时间整理的数据,现在只需几分钟即可。再一次感受到了微软office的强大之处,只有你想不到,没有它做不到!

评教数据整理专用VBA小程序的更多相关文章

  1. 小程序开发-7-访问api数据与ES6在小程序中的应用

    访问API数据与ES6在小程序中的应用 看待组件的两种观点 组件复用 代码分离-(特别重要) 不能在一个页面写所有的代码,代码分离具有很强的可读性.可维护性 Blink Api 介绍与测试API ur ...

  2. 手把手教你写一个RN小程序!

    时间过得真快,眨眼已经快3年了! 1.我的第一个App 还记得我14年初写的第一个iOS小程序,当时是给别人写的一个单机的相册,也是我开发的第一个完整的app,虽然功能挺少,但是耐不住心中的激动啊,现 ...

  3. 聚合数据董铭彦:小程序开发的兴起将带火API数据交易

    2016中关村大数据日活动近日在京举办,今年新进驻北京的聚合数据受邀参与,在13日举行的大数据交易专场论坛上,聚合数据副总裁董铭彦与参会嘉宾以"共筑数据交易产业生态,共享大数据时代红利&qu ...

  4. 微信小程序中在swiper-item中遍历循环添加多个数据内容(微信小程序交流群:604788754)

    在小程序中为了实现一个<swiper-item>中添加多个内容重复的标签,那就需要使用wx:for循环.如果按小程序的简易教程,循环加在block中,而swiper-item放在里面.所有 ...

  5. 教你如何实现微信小程序与.net core应用服务端的无状态身份验证

    随着.net core2的发布,越来越多人使用.net core2开发各种应用服务端,下面我就结合自己最近开发的一款小程序,给大家分享下,怎么使用小程序登录后,小程序与服务端交互的权限控制. .net ...

  6. 微信小程序——手把手教你写一个微信小程序

    前言 微信小程序年前的跳一跳确实是火了一把,然后呢一直没有时间去实践项目,一直想搞但是工作上不需要所以,嗯嗯嗯嗯嗯emmmmm..... 需求 小程序语音识别,全景图片观看,登录授权,获取个人基本信息 ...

  7. 微信小程序官方指南手册,教你如何使用微信小程序!

    2017年1月9日,小程序如约而至.程序员们都讨论的热火朝天,但是真正使用过微信小程序的又有几个呢?下面今天我们给大家介绍下微信小程序到底应该如何使用? 首先,你的微信必须是最新版本的,微信官方是从要 ...

  8. 教你制作挂件头像 | 小程序七十二变之 canvas 绘制国旗头像

    昨天朋友圈被「请给我一面国旗@微信官方」刷屏,虽然知道是假的,但是从另一个角度来看,弄清楚如何实现更有趣. 1.canvas 这就不得不提到小程序中的 API canvas,H5 中也是有 canva ...

  9. 处理后台传过来的json数据-显示到微信小程序的富文本里

    解析数据: JSON.parse(); 获取 加密的文章内容, 将解密文章内容, 将解密后的img标签的路径换成绝对地址(服务器) 调整图片的大小,

随机推荐

  1. IOS 用drawRect 画表格

    自定义一个View DrawLine DrawLine.h #import <UIKit/UIKit.h> @protocol gridTouchDelete <NSObject&g ...

  2. [Java 并发] Java并发编程实践 思维导图 - 第一章 简单介绍

    阅读<Java并发编程实践>一书后整理的思维导图.

  3. Spring项目的建立-移植流程(非入门教程)

    Creat by Zhou yong in 2016/4/15/19:00 jar包 java 1.7 tomcat的两个jar包 2个文件上传的jar包 json支持的jar包 hibernate- ...

  4. AngularJs学习(1)

    以下是学习过程中的笔记,有些是网上摘录 <!DOCTYPE HTML> <html lang="zh-cn"> <head> <meta ...

  5. libxml两种换行方法

    好久没上来留下一些记录了,可能是太忙,又或者是过于慵懒便疏于整理. libxml是一个开源的库,linux下解析xml文件经常用到,进行一些创读增删的操作. 最开始接触的时候,看到了一个简明易懂的&l ...

  6. hdu1020Encoding

    Problem Description Given a string containing only 'A' - 'Z', we could encode it using the following ...

  7. ES6 let和const命令

    一.let定义变量 { let a = 1;} console.log(a);只在let所在的代码块有效,console的结果是a is not defined,报错. 不存在var的变量提升,即使用 ...

  8. String.format Tutorial

    String format(String format, Object... args) The format specifiers for general, character, and numer ...

  9. C++程序中不同变量、函数在内存中内存中的分布情况

    一.一个C++编译的程序占用的内存分为以下几个部分 1.栈区:由编译器自动分配 存放函数的参数值,局部变量的值等,操作方式类似于数据结构中的栈. 2.堆区:一般由程序员分配释放,若程序员不释放,程序结 ...

  10. [Leetcode] Container With Most Water ( C++)

    题目: Given n non-negative integers a1, a2, ..., an, where each represents a point at coordinate (i, a ...