关于按班号提取工作表的再次改进
2013-11-28 10:07
204 查看
改进说明:以前的时候太依赖于for循环,造成必对班号有特别要求,如果原始数据表不是连续的,还要先进行手动调整,一直感觉很别扭,虽然知道可以通过逐个单元格进行判断,但那样的话就对程序运行的过程无法做到掌控,所以一直处于抵触状态.今天通过看VBA的程序设计一书,完美的解决了这个问题,而且对循环的另两种表达形式:for each 和do while语句有了全新的认识,更重要的是对VBA中的对象概念有了初步的认识,第一次认识到VBA中的对象完全可以解决以前全过程性的程序设计.
今天这个程序是对按班号提取工作表进行改进,而且专门对班号的排列进行了混编,保证班号无序/班号不连续,这样就可以基本保证无法用for循环来实现提取.
闲话不说了,直接上源代码:
下一篇文章将解决如何对工作表或工作进行合并至同一张表,有来有去嘛,光分不合也不行啊.
今天这个程序是对按班号提取工作表进行改进,而且专门对班号的排列进行了混编,保证班号无序/班号不连续,这样就可以基本保证无法用for循环来实现提取.
闲话不说了,直接上源代码:
Option Explicit Sub 将指定工作簿中的数据分班提取到不同工作簿中() '1:按工作簿中的班级号生成工作表(以班号为工作表标签) '2:处理完毕后,将各个班级工作表分至班级工作簿中 '3:注意保存并退出 '4:此程序最好的一点是即使是班号不连续,也可以一样按班提取,并且对班号的排列也 '没有特殊要求了. Dim Sht As Worksheet, i As Integer '清除掉除成绩工作表外的所有其他工作表 Application.DisplayAlerts = False For Each Sht In Worksheets If Sht.Name <> "成绩" Then Sht.Delete End If Next Sht Application.DisplayAlerts = True '按班级号生成工作表,并以班号为工作表标签 Set Sht = Worksheets("成绩") i = 2 Do While Sht.Cells(i, "A").Value <> "" On Error Resume Next If Worksheets("" & Sht.Cells(i, "A").Value & "") Is Nothing Then Worksheets.Add after:=Worksheets(Worksheets.Count) ActiveSheet.Name = Sht.Cells(i, "A").Value Worksheets("成绩").Rows(1).Copy ActiveSheet.Range("A1") End If i = i + 1 Loop On Error GoTo 0 '如果没有这句话,程序好像陷入了死循环,最长时间一个下午还没有运行完!! '将成绩工作表中的每行数据复制到各班工作表中 Worksheets("成绩").Activate Dim myRng As Range, bj As String '班级虽然实际上数值型,但由于需要用来作工作表的标签名,所以必须弄成字符串型. i = 2 bj = Cells(i, "A").Value Do While bj <> "" Set myRng = Worksheets(bj).Range("A65536").End(xlUp).Offset(1, 0) Rows(i).Copy myRng 'myRng中已经包含单元格的绝对地址,所以会自动复制到相应工作表中的准确位置. 'Range(Cells(i, 1), Cells(i, Range("IV256").End(xlToLeft).Column)).Copy myRng i = i + 1 bj = Cells(i, "A").Value Loop '将列宽调整到合适的列宽 For Each Sht In Worksheets Sht.Cells.Columns.AutoFit Next Sht '将班级工作表另存为工作簿 Rem=首先需要建立一个文件夹用于存储班级成绩表 Dim fileFolder As String fileFolder = ThisWorkbook.Path & "\班级成绩表" If Len(Dir(fileFolder, vbDirectory)) = 0 Then MkDir fileFolder Else If Len(Dir(fileFolder & "\*.*")) <> 0 Then Kill fileFolder & "\*.*" End If End If Rem=开始将工作表另存为相应的工作簿 Application.DisplayAlerts = False For Each Sht In Worksheets If Sht.Name <> "成绩" Then Sht.Copy ActiveWorkbook.SaveAs fileFolder & "\" & Sht.Name & ".xls" ActiveWorkbook.Close savechanges:=True Sht.Delete End If Next Sht Application.DisplayAlerts = True Set Sht = Nothing End Sub
下一篇文章将解决如何对工作表或工作进行合并至同一张表,有来有去嘛,光分不合也不行啊.
相关文章推荐
- 单例模式
- 《黑客防线》《黑客X档案》《非安全-黑客手册》电子刊下载(最全版)
- 多媒体处理AVAudioPlayer
- Linux线程属性总结
- 利用python包(xlrd和xlwt)处理excel
- C++作业:n只猴子围成一圈,顺时针方向从1到n编号
- Installation error: INSTALL_PARSE_FAILED_MANIFEST_MALFORMED 错误
- mysql数据类型总结
- 代理模式
- Spring mvc Interceptor 解决Session超时跳转
- C++作业:用节点node表示多项式的系数和次数,编程合并两个链式表达的多项式
- 天王盖地虎~糗百电脑桌面客户端(精简版)
- smarkfoxserver 一个事件只能添加一个监听
- 代理模式和装饰模式的区别
- Dreamweaver技巧50问
- iOS 中的Certificate,Provisioning Profile 等在code singing中用到的信息
- SQL%ROWCOUNT
- HttpClient4模拟带文件上传的表单提交
- 多种电脑密码破解
- VS2010打不开VS2012 .NET MVC 工程,及打开后部分模块加载不正确的解决办法