工作簿多个工作表按名称排序,工作簿里的多个工作表名称排序

首页 > 实用技巧 > 作者:YD1662023-11-27 12:40:15

【分享成果,随喜正能量】不管经历多少,一定要永远乐观,永远积极,永远向上,因为,下一刻,就是奇迹。。

《VBA信息获取与处理》教程(10178984)是我推出第六套教程,目前已经是第一版修订了。这套教程定位于最高级,是学完初级,中级后的教程。这部教程给大家讲解的内容有:跨应用程序信息获得、随机信息的利用、电子邮件的发送、VBA互联网数据抓取、vbA延时操作,剪贴板应用、Split函数扩展、工作表信息与其他应用交互,FSO对象的利用、工作表及文件夹信息的获取、图形信息的获取以及定制工作表信息函数等等内容。程序文件通过32位和64位两种OFFICE系统测试。是非常抽象的,更具研究的价值。

教程共两册,二十个专题。今日的内容是“专题十三 VBA如何让Excel工作表按指定的顺序排列”:VBA按名称排序各个工作表

工作簿多个工作表按名称排序,工作簿里的多个工作表名称排序(1)

第一节 实现工作表按名称排序

大家好,我们先从按工作表名称排序讲起,先看一下下面的截图:

工作簿多个工作表按名称排序,工作簿里的多个工作表名称排序(2)

这个截图中,第一个工作表我称之为功能工作表页,其余的工作表从第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

代码截图:

工作簿多个工作表按名称排序,工作簿里的多个工作表名称排序(3)

代码的讲解:

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 工作表按名称排序的代码实现效果

我们点击运行按钮,看下面的排序效果:

工作簿多个工作表按名称排序,工作簿里的多个工作表名称排序(4)

首页 123下一页

栏目热文

文档排行

本站推荐

Copyright © 2018 - 2021 www.yd166.com., All Rights Reserved.