调查报告怎么写三年级:如何对工作簿中的工作表排序?

来源:百度文库 编辑:九乡新闻网 时间:2024/03/29 19:31:19

 

 

如何对工作簿中的工作表排序?

       如何才能对工作簿中的工作表排序呢?嗯,说实话,对工作簿中的工作表排序并不像我们原想的那样容易。这并不意味着无法做到,只是指该过程稍微有点复杂。正因如此,如果您没有完全理解我们即将谈论的所有内容,请不要灰心,因为就连我们自己都不确定是否完全理解了。不过该脚本似乎奏效,毕竟,这才是我们所关心的。

假定我们有一个含有下面一组工作表的工作簿:


如何按字母顺序对这些工作表进行排序呢?方法如下:

On Error Resume NextDim arrNames()intSize = 0Set objExcel = CreateObject("Excel.Application")objExcel.Visible = TrueSet objWorkbook = objExcel.Workbooks.Open("C:\Scripts\Inventory.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:\Scripts\Inventory.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

诚然,这一方法并不十分简单明了,可它确实有效。

所有工作完成之后,我们最终将得到一个如下所示的工作簿:


如果您不完全确定我们是如何做到这一点的,那也不必担心。有时只要相信就足够了,不用刨根问底。