评教数据整理专用VBA小程序
这次评教的所有数据存放在两个数据库中,比如说给某教师评论的学生有100个,可是结果有40个的数据在数据库A中,另外60人的数据在数据库B中。那么,如何将两个库中的数据整合,最后得到教师的准确成绩成为了本次数据整理的首要任务。具体的整合过程是这样的,就拿教师的最终得分来说吧。假设库A学生给教师评价的平均分为90分,而库
B学生评价的平均分为95分。那么首先需要分别计算出库A、库B中学生评价的总分,库A总分 = 90*40 ,库B总分 = 95*60,教师所得总平均分 = (库A总分 + 库B总分)/ 两个库中学生总数。这仅仅是总分一项,之后的各小项得分都需要如此计算。一共大概有300多教师,每个教师都需要如此计算一遍。如果手动计算的话,估计得整理到猴年马月。于是乎,我决定写一个小程序来整理数据,使用的工具就是office里自带的VBA,下面是具体的代码:
- '''作 者:王海涛
- '''时 间:2013年6月29日10:10:51
- '''过程说明:此过程为多个库中评教数据合并专用过程。主要功能是计算某教师、某课程在多个库中学生评分
- ''' 的平均值。
- '''使用说明:处理的Excel必须是直接从评教系统导出的Excel,不得更换Excel中列的顺序。
- Sub formatting()
- 'On Error Resume Next '出现错误继续执行下一句
- Dim rowCount As Integer '总行数
- Dim colCount As Integer '总列数
- Dim tempRowCount As Integer '临时行数
- Dim tempColumnCount As Integer '临时列数
- Dim arrResult(100) As String '存放临时结果
- Dim strSheetName As String '存放原工作表名
- Dim sheetResult As Worksheet '自定义的工作表
- Dim newSheetName As String '新工作表名
- strSheetName = ActiveSheet.Name '取得当前Sheet的名字
- '=======================判断工作表的名称是否存在,如果存在,将其删除===============
- For Each tempSheet In Sheets '遍历所有的Sheet
- '判断工作表的名称是否存在,如果存在,将其删除
- If tempSheet.Name = "mySheet" Or tempSheet.Name = strSheetName + "整理结果" Then
- Application.DisplayAlerts = False
- tempSheet.Delete
- Application.DisplayAlerts = True
- End If
- Next
- '=================================================================================
- newSheetName = "mySheet" '指定工作表名
- Set sheetResult = Worksheets.Add '增加工作表
- sheetResult.Name = newSheetName
- Sheets(strSheetName).Activate '将原始表设为当前活动表
- '操作原始表
- With Sheets(strSheetName)
- 'rowCount = [b65536].End(xlUp).Row 获得当前工作表总行数
- rowCount = UsedRange.Rows.Count '获得当前工作表总行数
- colCount = UsedRange.Columns.Count '获得当前工作表总列数
- Sheets("mySheet").Rows.Insert '新工作表中添加行
- Rows(1).Copy Sheets("mySheet").Cells(1, 1) '将原始表中的第一行内容复制到目标工作表中
- '==================================以下For循环说明===============================
- '从第二行开始遍历以后所有行,遍历到每一行时,执行如下操作
- '重新遍历所有行,找到与当前行老师、课程一样的数据(说明在多个库中都有这个老师的数据),
- '然后将其合并。具体合并过程为:首先算出所有学生评论的总分数、各项的总分数,然后分别用
- '总分数除以总评估人数,得到所有学生评论的平均分。
- '比如:同一老师、同一课程有两行数据,那么
- '第一行学生评论总分数 = 第一行已评估人数 * 第一行平均分(这里是总分字段)
- '第二行学生评论总分数 = 第二行已评估人数 * 第二行平均分(这里是总分字段)
- '学生评论总分数 = 第一行学生评论总分数 + 第二行学生评论总分数
- '总评估人数 = 第一行已评估人数 + 第二行已评估人数
- '教师最终得分 = 学生评论总分数 / 总评估人数
- '其余各项得分算法与总分算法一样。
- '====================================================================================
- For i = 2 To rowCount '从第二行开始遍历以后所有行
- '=====================给数组赋值,将当前遍历行的数据存到数组里=========================
- '1到6分别存学院、教师、课程类型、课程、已评估人数、参评人数
- For tempColumnCount = 1 To 6
- arrResult(tempColumnCount) = Cells(i, tempColumnCount).Value
- Next tempColumnCount
- '从总分开始,以后的数组存学生给对应列分数的总和。比如:所有学生评论总分 = 已评估人数 * 平均分数(这里指的是总分)
- For tempColumnCount = 7 To colCount
- 'Cells(i, 5).Value中的数据为已评估人数
- arrResult(tempColumnCount) = Val(Cells(i, tempColumnCount).Value) * Val(Cells(i, 5).Value)
- Next tempColumnCount
- '=================================数组赋值结束=========================================
- '开始寻找与当前老师、课程一样的数据(多个库中有的数据),并计算总分数==================
- For tempRowCount = 2 To rowCount '所在行的内容和所有行的内容比较
- If tempRowCount <> i Then '有效数据是不同与所选行的数据
- Dim flag As Boolean '用来标记是否为同一老师同一门课程
- flag = True
- '前四列和第六列,只要有一列与目标数据不一样,说明此条数据不是和目标数据一样的数据,不需要合并
- For tempColumnCount = 1 To 6 '比较前六列的值
- If tempColumnCount <> 5 Then
- If Cells(tempRowCount, tempColumnCount).Value <> Cells(i, tempColumnCount).Value Then
- flag = False
- End If
- End If
- Next tempColumnCount
- '如果是同一老师同一门课程
- If flag Then
- '评估总人数 = 之前的评估人数 + 本行中的评估人数
- arrResult(5) = Val(arrResult(5)) + Val(Cells(tempRowCount, 5).Value)
- '从总分开始,数组值等于当前总值加上当前行对应的总值。比如:所有学生评论总分 = 之前学生评论总分 + 本行已评估人数 * 本行平均分数(这里指的是总分)
- For tempColumnCount = 7 To colCount
- arrResult(tempColumnCount) = Val(arrResult(tempColumnCount)) + Val(Cells(tempRowCount, tempColumnCount).Value) * Val(Cells(tempRowCount, 5).Value)
- Next tempColumnCount
- End If
- End If
- Next tempRowCount
- '===============================计算总分数结束===============================================
- '将整理结果写到新的工作表中
- For tempColumnCount = 1 To 6
- Sheets("mySheet").Cells(i, tempColumnCount).Value = arrResult(tempColumnCount)
- Next tempColumnCount
- '从总分开始,以后的值等于数组中对应的数值除以总已评估人数。比如:总分 = 数组中对应的总分值 / 已评估人数
- For tempColumnCount = 7 To colCount
- Sheets("mySheet").Cells(i, tempColumnCount).Value = Val(arrResult(tempColumnCount)) / Val(arrResult(5))
- Next tempColumnCount
- '如果评估总人数超过参评人数,则评估人数等于参评人数
- If Val(Sheets("mySheet").Cells(i, 5).Value) > Val(Sheets("mySheet").Cells(i, 6).Value) Then
- Sheets("mySheet").Cells(i, 5).Value = Sheets("mySheet").Cells(i, 6).Value
- End If
- Next i
- '====================================数据计算结束=======================================================
- '更改新建的工作表名
- sheetResult.Name = strSheetName + "整理结果"
- End With
- End Sub
有了这个小程序,之前可能花费几天时间整理的数据,现在只需几分钟即可。再一次感受到了微软office的强大之处,只有你想不到,没有它做不到!
评教数据整理专用VBA小程序的更多相关文章
- 小程序开发-7-访问api数据与ES6在小程序中的应用
访问API数据与ES6在小程序中的应用 看待组件的两种观点 组件复用 代码分离-(特别重要) 不能在一个页面写所有的代码,代码分离具有很强的可读性.可维护性 Blink Api 介绍与测试API ur ...
- 手把手教你写一个RN小程序!
时间过得真快,眨眼已经快3年了! 1.我的第一个App 还记得我14年初写的第一个iOS小程序,当时是给别人写的一个单机的相册,也是我开发的第一个完整的app,虽然功能挺少,但是耐不住心中的激动啊,现 ...
- 聚合数据董铭彦:小程序开发的兴起将带火API数据交易
2016中关村大数据日活动近日在京举办,今年新进驻北京的聚合数据受邀参与,在13日举行的大数据交易专场论坛上,聚合数据副总裁董铭彦与参会嘉宾以"共筑数据交易产业生态,共享大数据时代红利&qu ...
- 微信小程序中在swiper-item中遍历循环添加多个数据内容(微信小程序交流群:604788754)
在小程序中为了实现一个<swiper-item>中添加多个内容重复的标签,那就需要使用wx:for循环.如果按小程序的简易教程,循环加在block中,而swiper-item放在里面.所有 ...
- 教你如何实现微信小程序与.net core应用服务端的无状态身份验证
随着.net core2的发布,越来越多人使用.net core2开发各种应用服务端,下面我就结合自己最近开发的一款小程序,给大家分享下,怎么使用小程序登录后,小程序与服务端交互的权限控制. .net ...
- 微信小程序——手把手教你写一个微信小程序
前言 微信小程序年前的跳一跳确实是火了一把,然后呢一直没有时间去实践项目,一直想搞但是工作上不需要所以,嗯嗯嗯嗯嗯emmmmm..... 需求 小程序语音识别,全景图片观看,登录授权,获取个人基本信息 ...
- 微信小程序官方指南手册,教你如何使用微信小程序!
2017年1月9日,小程序如约而至.程序员们都讨论的热火朝天,但是真正使用过微信小程序的又有几个呢?下面今天我们给大家介绍下微信小程序到底应该如何使用? 首先,你的微信必须是最新版本的,微信官方是从要 ...
- 教你制作挂件头像 | 小程序七十二变之 canvas 绘制国旗头像
昨天朋友圈被「请给我一面国旗@微信官方」刷屏,虽然知道是假的,但是从另一个角度来看,弄清楚如何实现更有趣. 1.canvas 这就不得不提到小程序中的 API canvas,H5 中也是有 canva ...
- 处理后台传过来的json数据-显示到微信小程序的富文本里
解析数据: JSON.parse(); 获取 加密的文章内容, 将解密文章内容, 将解密后的img标签的路径换成绝对地址(服务器) 调整图片的大小,
随机推荐
- IOS 用drawRect 画表格
自定义一个View DrawLine DrawLine.h #import <UIKit/UIKit.h> @protocol gridTouchDelete <NSObject&g ...
- [Java 并发] Java并发编程实践 思维导图 - 第一章 简单介绍
阅读<Java并发编程实践>一书后整理的思维导图.
- Spring项目的建立-移植流程(非入门教程)
Creat by Zhou yong in 2016/4/15/19:00 jar包 java 1.7 tomcat的两个jar包 2个文件上传的jar包 json支持的jar包 hibernate- ...
- AngularJs学习(1)
以下是学习过程中的笔记,有些是网上摘录 <!DOCTYPE HTML> <html lang="zh-cn"> <head> <meta ...
- libxml两种换行方法
好久没上来留下一些记录了,可能是太忙,又或者是过于慵懒便疏于整理. libxml是一个开源的库,linux下解析xml文件经常用到,进行一些创读增删的操作. 最开始接触的时候,看到了一个简明易懂的&l ...
- hdu1020Encoding
Problem Description Given a string containing only 'A' - 'Z', we could encode it using the following ...
- ES6 let和const命令
一.let定义变量 { let a = 1;} console.log(a);只在let所在的代码块有效,console的结果是a is not defined,报错. 不存在var的变量提升,即使用 ...
- String.format Tutorial
String format(String format, Object... args) The format specifiers for general, character, and numer ...
- C++程序中不同变量、函数在内存中内存中的分布情况
一.一个C++编译的程序占用的内存分为以下几个部分 1.栈区:由编译器自动分配 存放函数的参数值,局部变量的值等,操作方式类似于数据结构中的栈. 2.堆区:一般由程序员分配释放,若程序员不释放,程序结 ...
- [Leetcode] Container With Most Water ( C++)
题目: Given n non-negative integers a1, a2, ..., an, where each represents a point at coordinate (i, a ...