一次小小的 Excel 的 VBA 尝试
2006-10-21 15:39
302 查看
最近学校要评奖学金,所以系里面的学生工作办公室就去校教务处拿了全部学生的上学期成绩回来。学校要求是没有挂科的同学才有资格评奖学金,所以我就打算把拿回来的这些学生成绩导入 Access 里面,然后写一些查询就可以找出符合要求的学生并且排名了。
从教务处拿回来的学生成绩 Excel 格式的,本来稍做修改就可以导进数据库里面去了。没想到仔细看了之后发现没那么简单。
这些学生成绩里面不仅包含了正常考试的成绩,也包含了补考的成绩。而正考成绩和补考成绩在这个 Excel 文件里面没有任何区分的标志(都不知道教务处的人是怎么想的),这两行数据里面,除了成绩不同之外,其他的课程号、学号等都相同。这样导入数据库的话,就难区分哪个成绩是补考的哪个是正考的了。
于是,只能在 Excel 里面多建一列“考试性质”,是正考的就赋“1”,是补考的就赋“2”。人工一行一行的看下去,只要有一科是考过两次试的,那么不及格那次肯定是正考的,及格那次就是补考的。如果两次都是不及格的话,不论哪次是正考或者补考的都无所谓了。这样,问题又来了,几千条成绩,一行一行的看要看到什么时候去啊。
没办法,只能编个程序让计算机来帮我干了。幸好某一科的正考成绩和补考成绩是连着的两行,而且不及格的成绩的字是红色的,那么情况就简单多了。代码如下:
Sub FindSomeCourse()
Application.ScreenUpdating = False '禁止程序执行时实时刷新屏幕
i = 2
While i < 1655'这个是成绩的行数
first = Sheet1.Cells(i, 3).Value
second = Sheet1.Cells(i + 1, 3).Value
If first = second Then
'如果两行的课程号相同……我这里的课程号是在第 3 列的
'课程成绩是第 5 列,“考试性质”是第 6 列
If Sheet1.Cells(i, 5).Font.ColorIndex = 3 Then
If Sheet1.Cells(i + 1, 5).Font.ColorIndex = 3 Then
Sheet1.Cells(i, 6).Value = 2
Sheet1.Cells(i + 1, 6).Value = 1
Else
Sheet1.Cells(i, 6).Value = 1
Sheet1.Cells(i + 1, 6).Value = 2
End If
Else
If Sheet1.Cells(i + 1, 5).Font.ColorIndex = 3 Then
Sheet1.Cells(i + 1, 6).Value = 1
Sheet1.Cells(i, 6).Value = 2
End If
End If
i = i + 2
Else
Sheet1.Cells(i, 6).Value = 1
i = i + 1
End If
Debug.Print i '看看进行到第几行了
Wend
MsgBox "ok"
End Sub
第一次写 VBA 程序,程序也没做什么优化,算法很简单,就当做是一次小练笔吧^_^
从教务处拿回来的学生成绩 Excel 格式的,本来稍做修改就可以导进数据库里面去了。没想到仔细看了之后发现没那么简单。
这些学生成绩里面不仅包含了正常考试的成绩,也包含了补考的成绩。而正考成绩和补考成绩在这个 Excel 文件里面没有任何区分的标志(都不知道教务处的人是怎么想的),这两行数据里面,除了成绩不同之外,其他的课程号、学号等都相同。这样导入数据库的话,就难区分哪个成绩是补考的哪个是正考的了。
于是,只能在 Excel 里面多建一列“考试性质”,是正考的就赋“1”,是补考的就赋“2”。人工一行一行的看下去,只要有一科是考过两次试的,那么不及格那次肯定是正考的,及格那次就是补考的。如果两次都是不及格的话,不论哪次是正考或者补考的都无所谓了。这样,问题又来了,几千条成绩,一行一行的看要看到什么时候去啊。
没办法,只能编个程序让计算机来帮我干了。幸好某一科的正考成绩和补考成绩是连着的两行,而且不及格的成绩的字是红色的,那么情况就简单多了。代码如下:
Sub FindSomeCourse()
Application.ScreenUpdating = False '禁止程序执行时实时刷新屏幕
i = 2
While i < 1655'这个是成绩的行数
first = Sheet1.Cells(i, 3).Value
second = Sheet1.Cells(i + 1, 3).Value
If first = second Then
'如果两行的课程号相同……我这里的课程号是在第 3 列的
'课程成绩是第 5 列,“考试性质”是第 6 列
If Sheet1.Cells(i, 5).Font.ColorIndex = 3 Then
If Sheet1.Cells(i + 1, 5).Font.ColorIndex = 3 Then
Sheet1.Cells(i, 6).Value = 2
Sheet1.Cells(i + 1, 6).Value = 1
Else
Sheet1.Cells(i, 6).Value = 1
Sheet1.Cells(i + 1, 6).Value = 2
End If
Else
If Sheet1.Cells(i + 1, 5).Font.ColorIndex = 3 Then
Sheet1.Cells(i + 1, 6).Value = 1
Sheet1.Cells(i, 6).Value = 2
End If
End If
i = i + 2
Else
Sheet1.Cells(i, 6).Value = 1
i = i + 1
End If
Debug.Print i '看看进行到第几行了
Wend
MsgBox "ok"
End Sub
第一次写 VBA 程序,程序也没做什么优化,算法很简单,就当做是一次小练笔吧^_^
相关文章推荐
- 用VBA生成的EXCEL,打开报如下错误:您尝试打开的文件"1.xls"的格式与文件拓展名指定的格式不一致。。。。
- 使用VBA尝试操作Excel数据
- 一次小小的模板尝试
- VBA学习2_教你快速入门Excel-宏与VBA(下)
- 利用Excel的VBA来处理XML
- 来吧!带你玩转 Excel VBA
- 使用VBA合并多个EXCEL文件到一个EXCEL文件
- 利用快捷方式打开妹子心门的一次尝试
- 解决打开Excel时提示“您尝试打开的文件.xls的格式与文件扩展名指定的格式不一致
- 创意、实现和合作:一次原创H5的尝试
- MVC中将上一次导出的EXCEL文件导入验证并保存到数据库中
- VBA将Excel数据导入到数据库
- Excel中的VBA常量和编码值所代表的标准图表类型
- ExcelVBA设置文件属性
- 各种Excel VBA的命令
- Access 、Excel、Word中的VBA引用C#或VB.Net创建的DLL
- 模式的一次简单尝试
- Excel VBA Dir
- 编写登录接口,输入用户名密码,认证成功后显示欢迎界面,输错三次后锁定(1.超过三次直接锁定待实现 2.锁定后只能尝试一次)
- VBA - Excel编程概念之:【单元格和区域】一、如何引用单元格和区域