【分享成果,随喜正能量】不管经历多少,一定要永远乐观,永远积极,永远向上,因为,下一刻,就是奇迹。。
《VBA信息获取与处理》教程(10178984)是我推出第六套教程,目前已经是第一版修订了。这套教程定位于最高级,是学完初级,中级后的教程。这部教程给大家讲解的内容有:跨应用程序信息获得、随机信息的利用、电子邮件的发送、VBA互联网数据抓取、vbA延时操作,剪贴板应用、Split函数扩展、工作表信息与其他应用交互,FSO对象的利用、工作表及文件夹信息的获取、图形信息的获取以及定制工作表信息函数等等内容。程序文件通过32位和64位两种OFFICE系统测试。是非常抽象的,更具研究的价值。
教程共两册,二十个专题。今日的内容是“专题十三 VBA如何让Excel工作表按指定的顺序排列”:VBA按名称排序各个工作表
第一节 实现工作表按名称排序大家好,我们先从按工作表名称排序讲起,先看一下下面的截图:
这个截图中,第一个工作表我称之为功能工作表页,其余的工作表从第2个到第7个是数据存储的工作表,顺序是没有规律的,我要让各个工作表自动地进行排序处理,代码该怎么写呢?
1 工作表按名称排序的实现思路我们要借助于函数来实现我们的目的,这个函数就是完成排序的工作。谈到排序,肯定会涉及到升序和降序,另外还有数字和文本的比较方案,对于错误的处理。对于工作表的排序还涉及到工作表的移动,按名称的顺序进行工作表的移动即可。
1)升序和降序就是大小比较的方案,注意在实现的时候处理的顺序
2)数字和文本的比较方案,如果是文本的比较,要设置为vbTextCompare的比较方式。
3)工作表的排序还涉及到工作表的移动,就是工作表的.Move before:语句了,根据比较的结果移动工作表的位置。
4)我们进行数字的比较,就要求工作表的名称是数字,判断数字用到IsNumeric函数。
5)对于参与排序的工作表,我们要作为参数进行录入,当然要进行必要的判断,不能超过所有工作表的范围。
思路有了,我们看看实现的过程。
2 工作表按名称排序的代码实现过程先给出我的代码:
Public Function SortWorksheetsByName(ByVal FirstToSort As Long, _
ByVal LastToSort As Long, _
ByRef ErrorText As String, _
Optional ByVal SortDescending As Boolean = False, _
Optional ByVal Numeric As Boolean = False) As Boolean
'FirstToSort:需要排序的第一个工作表
'LastToSort:需要排序的最后一个工作表
'FirstToSort与LastToSort如果都为0,那么表示所有的工作表都要参与排序
'ErrorText 为接收可能发生的任何错误的文本描述
'SortDescending 升序还是降序,默认是升序
'Numeric 按数字还是文本排序,如果按数字则要求工作表名需是数字
Dim WB As Workbook
Dim B As Boolean
'返回指定工作表对象的父对象,即工作薄
Set WB = Worksheets.Parent
ErrorText = vbNullString
'判断工作簿中的工作表是否处于保护状态,如果是则该属性值为 True。
If WB.ProtectStructure = True Then
ErrorText = "工作薄处于保护状态,无法排序"
SortWorksheetsByName = False
End If
If (FirstToSort = 0) And (LastToSort = 0) Then
FirstToSort = 1
LastToSort = WB.Worksheets.Count
Else
B = TestFirstLastSort(FirstToSort, LastToSort, ErrorText)
If B = False Then
SortWorksheetsByName = False
MsgBox ErrorText
Exit Function
End If
End If
'对工作表名称进行判断,如果有不是数字的则退出排序
If Numeric = True Then
For N = FirstToSort To LastToSort
If IsNumeric(WB.Worksheets(N).Name) = False Then
ErrorText = "有名称不为数字的工作表!"
SortWorksheetsByName = False
MsgBox ErrorText
Exit Function
End If
Next N
End If
'排序
For M = FirstToSort To LastToSort
For N = M To LastToSort
If SortDescending = True Then
If Numeric = False Then
If StrComp(WB.Worksheets(N).Name, WB.Worksheets(M).Name, vbTextCompare) > 0 Then
WB.Worksheets(N).Move before:=WB.Worksheets(M)
End If
Else
If CLng(WB.Worksheets(N).Name) > CLng(WB.Worksheets(M).Name) Then
WB.Worksheets(N).Move before:=WB.Worksheets(M)
End If
End If
Else
If Numeric = False Then
If StrComp(WB.Worksheets(N).Name, WB.Worksheets(M).Name, vbTextCompare) < 0 Then
WB.Worksheets(N).Move before:=WB.Worksheets(M)
End If
Else
If CLng(WB.Worksheets(N).Name) < CLng(WB.Worksheets(M).Name) Then
WB.Worksheets(N).Move before:=WB.Worksheets(M)
End If
End If
End If
Next
Next
SortWorksheetsByName = True
End Function
If LastToSort > Worksheets.Count Then
TestFirstLastSort = False
ErrorText = "结尾的工作数不能大于总工作表数"
MsgBox ErrorText
Exit Function
End If
If FirstToSort > LastToSort Then
TestFirstLastSort = False
ErrorText = "第一个工作表数要小于结尾的工作表数"
MsgBox ErrorText
Exit Function
End If
TestFirstLastSort = True
End Function
Sub mynz()
Sheets("SHEET1").Select
UU = SortWorksheetsByName(2, 7, "ErrorText", "TRUE", "TRUE")
If UU = True Then
MsgBox "排序完成!"
Else
MsgBox "排序错误!"
End If
Sheets("SHEET1").Select
End Sub
代码截图:
代码的讲解:
1)上述代码实现了按名称进行工作表排序的过程。整个过程中利用了两个函数,一个是SortWorksheetsByName函数,是主函数,实现排序;一个是TestFirstLastSort函数,用于验证录入的参数是否正确。
2)需要录入的参数有:
FirstToSort:需要排序的第一个工作表
LastToSort:需要排序的最后一个工作表
ErrorText为接收可能发生的任何错误的文本描述
SortDescending升序还是降序,默认是升序
Numeric 按数字还是文本排序,如果按数字则要求工作表名需是数字
3)Set WB = Worksheets.Parent'返回指定工作表对象的父对象,即工作薄。这种方法是十分方便的,我们在后续的代码中还要用到工作薄的工作表个数
4)If WB.ProtectStructure = True Then'判断工作簿中的工作表是否处于保护状态,如果是则该属性值为 True。
5)StrComp(WB.Worksheets(N).Name, WB.Worksheets(M).Name, vbTextCompare) > 0
StrComp为字符串比较的函数,返回值类型Variant (Integer)。返回值是-1,0,1
6)CLng(WB.Worksheets(N).Name) >CLng(WB.Worksheets(M).Name)
clng函数可以将字符串输出成长整型数据,用于比较。
其它的代码比较简单就不再多讲解了。
3 工作表按名称排序的代码实现效果我们点击运行按钮,看下面的排序效果: