您的位置:首页 > 其它

关于按班号提取工作表的再次改进

2013-11-28 10:07 204 查看
改进说明:以前的时候太依赖于for循环,造成必对班号有特别要求,如果原始数据表不是连续的,还要先进行手动调整,一直感觉很别扭,虽然知道可以通过逐个单元格进行判断,但那样的话就对程序运行的过程无法做到掌控,所以一直处于抵触状态.今天通过看VBA的程序设计一书,完美的解决了这个问题,而且对循环的另两种表达形式:for each 和do while语句有了全新的认识,更重要的是对VBA中的对象概念有了初步的认识,第一次认识到VBA中的对象完全可以解决以前全过程性的程序设计.

今天这个程序是对按班号提取工作表进行改进,而且专门对班号的排列进行了混编,保证班号无序/班号不连续,这样就可以基本保证无法用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


下一篇文章将解决如何对工作表或工作进行合并至同一张表,有来有去嘛,光分不合也不行啊.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: