如何对工作簿中的工作表排序? 工作表和工作簿的区别
您好,脚本专家!如何对工作簿中的工作表排序?
-- FS
答:
您好,FS。如何才能对工作簿中的工作表排序呢?嗯,说实话,对工作簿中的工作表排序并不像我们原想的那样容易。这并不意味着无法做到,只是指该过程稍微有点复杂。正因如此,如果您没有完全理解我们即将谈论的所有内容,请不要灰心,因为就连我们自己都不确定是否完全理解了。不过该脚本似乎奏效,毕竟,这才是我们所关心的。
假定我们有一个含有下面一组工作表的工作簿:
如何按字母顺序对这些工作表进行排序呢?方法如下:
On Error Resume NextDim arrNames()intSize = 0Set objExcel = CreateObject("Excel.Application")objExcel.Visible = TrueSet objWorkbook = objExcel.Workbooks.Open("C:ScriptsInventory.xls")For Each objWorksheet in objWorkbook.SheetsReDim Preserve arrNames(intSize)arrNames(intSize) = objWorksheet.NameintSize = intSize + 1NextFor i = (UBound(arrNames) - 1) to 0 Step -1For j= 0 to iIf UCase(arrNames(j)) > UCase(arrNames(j+1)) ThenstrHolder = arrNames(j+1)arrNames(j+1) = arrNames(j)arrNames(j) = strHolderEnd IfNextNextFor i = UBound(arrNames) to 1 Step -1Set objSheet1 = objWorkbook.Sheets(arrNames(i))Set objSheet2 = objWorkbook.Sheets(arrNames(i-1))objSheet2.Move objSheet1Next
是的,是的,我们知道。但我们只能尽最大努力对其进行解释。
该脚本开头其实非常简单。首先,我们创建了一个名为 arrNames() 的动态数组。为什么呢?是这样,虽然 Excel 中内置了大量的功能,但它至少遗漏了一件事情:用于对工作表进行排序的命令。由于 Excel 没有内置的工作表排序方法,所以我们就得亲自来处理了。我们即将采取的做法是,获取所有工作表的名称,将这些名称存储在一个动态数组中,然后对该数组中的项进行排序。对数组进行排序后,我们就会知道所有工作表的正确顺序;此时便可以使用 Excel 的 Move 方法,将每个工作表移动到所需的位置。
因此,创建该数组之后,我们使用一些标准的样板代码创建了 Excel.Application 对象的一个实例,将 Visible 属性设置为 True,然后使用 Open 方法打开文件 C:ScriptsInventory.xls。现在,我们准备要卷起袖子开始工作了。
我们需要做的第一件事情就是获取所有工作表的名称并将它们放入动态数组中。这是通过下面这块代码实现的:
For Each objWorksheet in objWorkbook.SheetsReDim Preserve arrNames(intSize)arrNames(intSize) = objWorksheet.NameintSize = intSize + 1Next
在此,我们所做的只是设置一个 For Each 循环来遍历 Sheets 集合;正如其名称所示,此集合包括工作簿中存在的所有工作表。对于集合中的每个工作表,我们使用 ReDim Preserve 命令调整动态数组的大小。该数组的大小最初为 0,表示数组中只有一项。(数组大小始终为数组中的项数减 1。)我们是如何得知已将数组大小设置为 0 的呢?这是因为我们将一个名为 intSize 的计数器变量的值赋给了它,而在脚本开头我们将该变量设置为 0。
然后,我们将集合中第一个工作表的名称赋值给数组中的第一项,具体做法如下:
arrNames(intSize) = objWorksheet.Name
我们将计数器变量增加 1,然后进入下一个循环并对集合中的第二个工作表重复该过程,第二个工作表的名称将成为数组中的第二项。全部完成之后,我们将拥有一个依次包括以下各项的数组:
Sheet2caSheet1b
是的,这不算太糟。然而,对于下一部分就不一定是这样了。在此,我们使用了一个“简单的”冒泡排序,按字母顺序对数组中的各项进行排序:
For i = (UBound(arrNames) - 1) to 0 Step -1For j= 0 to iIf UCase(arrNames(j)) > UCase(arrNames(j+1)) ThenstrHolder = arrNames(j+1)arrNames(j+1) = arrNames(j)arrNames(j) = strHolderEnd IfNextNext
在今天的专栏中,我们不想对冒泡排序的细节进行解释;您可以在“脚本编写第 2 周”网络广播的 Things the Scripting Guys Never Told You(英文)中找到对其工作原理的相当不错的解释。简而言之,冒泡排序的过程就是将数组中的每项与数组中的其他各项进行比较,然后在需要时交换它们在该数组中的位置。例如,我们数组中的前两项是:
Sheet2c
按字母顺序来说,c 在 Sheet2 之前。因此,冒泡排序将交换这两个名称的位置,这意味着数组中的前两项会变成这样:
cSheet2
此过程将一直继续,直到每项都与其他各项进行了比较为止。最终结果如何呢?将会得到一个按字母顺序排序的数组:
abcSheet1Sheet2
幸运地,此正好也是我们想要的电子表格顺序。既然我们知道了哪个电子表格应排第一,哪个电子表格应排第二,依此类推,我们便可以使用这块代码重新排列工作簿中的电子表格:
For i = UBound(arrNames) to 1 Step -1Set objSheet1 = objWorkbook.Sheets(arrNames(i))Set objSheet2 = objWorkbook.Sheets(arrNames(i-1))objSheet2.Move objSheet1Next
这里我们要做的就是从数组的末尾开始(UBound 可确定数组的最后一项,本例中即为 Sheet2),然后一直往下进行(这正是 Step -1 的作用)。鉴于我们已对数组进行了排序,我们知道数组中的最后一项 - Sheet2 - 也应是工作簿中的最后一个工作表。我们还知道数组中的倒数第二项 - Sheet1 - 应是工作簿中的倒数第二个工作表。因此,我们使用以下代码创建了一个指向 Sheet 2 的对象引用:
Set objSheet1 = objWorkbook.Sheets(arrNames(i))
然后,我们使用以下代码创建了一个指向 Sheet 1 的对象引用:
Set objSheet2 = objWorkbook.Sheets(arrNames(i-1))
最后,我们调用 Move 方法,将 Sheet1 移到 Sheet2 前面(之前):
objSheet2.Move objSheet1
我们是如何得知 Sheet1 将被移到 Sheet2 前面呢?很简单:在 Move 方法之后没有逗号:
objSheet2.Move objSheet1
如果要将 Sheet1 移到 Sheet2 后面(之后),则应在 Move 方法之后放一个逗号:
objSheet2.Move, objSheet1
诚然,这一方法并不十分简单明了,可它确实有效。
所有工作完成之后,我们最终将得到一个如下所示的工作簿:
如果您不完全确定我们是如何做到这一点的,那也不必担心。有时只要相信就足够了,不用刨根问底。
更多阅读
如何删除双系统中的一个系统 双系统有一个无法显示
如何删除双系统中的一个系统——简介很多时候我们都会安装双系统,一个工作一个学习,因为有时候系统安装的软件过多导致开机、运行等变得很慢,所以在我们不实用这些软件的时候就可以登录另一个系统,这样既节约了时间,又能体验不同的系统带
如何保存网页中的文字 如何抓取图片中的文字
如何保存网页中的文字1、点击文件—另存为,保存类型选择文本文件*txt就好了。2、使用网页编辑软件:浏览器有默认的网页编辑软件(一般为frontpage或者word),只要在快捷工具栏中点击相应的按钮,或者依次选择“文件”→“使用MicrosoftFront
如何对工作簿中的工作表排序? 工作表和工作簿的区别
问:您好,脚本专家!如何对工作簿中的工作表排序?-- FS答:您好,FS。如何才能对工作簿中的工作表排序呢?嗯,说实话,对工作簿中的工作表排序并不像我们原想的那样容易。这并不意味着无法做到,只是指该过程稍微有点复杂。正因如此,如果您没有完全理
wordpress更换域名空间以后如何批量替换文章中的链接地址 wordpress更换域名
wordpress真不愧为一款世界级的程序,真的实在是太方便了,不管是设置301也好,还是设置伪静态也好,都是十分的方便。关于wordpress页面存在哪里啊这个问题我前面文章中都有介绍,关于wordpress能否生成真静态我前面也有介绍,今天主要给大家讲
如何找到淘宝中的“秒杀”产品 淘宝秒杀如何抢
如何找到淘宝中的“秒杀”产品?一般情况下,我们找商品会在淘宝主页的搜索栏里输入要找的产品名类目,如要找“丝袜”,就在搜索栏内输“丝袜”搜索,再加上“秒杀”在搜索栏内,是不是就可以搜到秒杀的丝袜呢?答案是:否。搜索栏内的秒杀只是字面