久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

如何對(duì)工作簿中的工作表排序,?

 星爺 2006-04-28

如何對(duì)工作簿中的工作表排序?

問:

您好,腳本專家,!如何對(duì)工作簿中的工作表排序,?

-- FS

答:

您好,F(xiàn)S,。如何才能對(duì)工作簿中的工作表排序呢,?嗯,說實(shí)話,,對(duì)工作簿中的工作表排序并不像我們原想的那樣容易,。這并不意味著無法做到,只是指該過程稍微有點(diǎn)復(fù)雜,。正因如此,,如果您沒有完全理解我們即將談?wù)摰乃袃?nèi)容,請不要灰心,,因?yàn)榫瓦B我們自己都不確定是否完全理解了,。不過該腳本似乎奏效,畢竟,,這才是我們所關(guān)心的,。

假定我們有一個(gè)含有下面一組工作表的工作簿:

Microsoft Excel


如何按字母順序?qū)@些工作表進(jìn)行排序呢?方法如下:

On Error Resume Next
Dim arrNames()
intSize = 0
Set objExcel = CreateObject("Excel.Application")
objExcel.Visible = True
Set objWorkbook = objExcel.Workbooks.Open("C:\Scripts\Inventory.xls")
For Each objWorksheet in objWorkbook.Sheets
ReDim Preserve arrNames(intSize)
arrNames(intSize) = objWorksheet.Name
intSize = intSize + 1
Next
For i = (UBound(arrNames) - 1) to 0 Step -1
For j= 0 to i
If UCase(arrNames(j)) > UCase(arrNames(j+1)) Then
strHolder = arrNames(j+1)
arrNames(j+1) = arrNames(j)
arrNames(j) = strHolder
End If
Next
Next
For i = UBound(arrNames) to 1 Step -1
Set objSheet1 = objWorkbook.Sheets(arrNames(i))
Set objSheet2 = objWorkbook.Sheets(arrNames(i-1))
objSheet2.Move objSheet1
Next

是的,,是的,,我們知道。但我們只能盡最大努力對(duì)其進(jìn)行解釋,。

該腳本開頭其實(shí)非常簡單,。首先,我們創(chuàng)建了一個(gè)名為 arrNames() 的動(dòng)態(tài)數(shù)組,。為什么呢,?是這樣,雖然 Excel 中內(nèi)置了大量的功能,,但它至少遺漏了一件事情:用于對(duì)工作表進(jìn)行排序的命令,。由于 Excel 沒有內(nèi)置的工作表排序方法,所以我們就得親自來處理了,。我們即將采取的做法是,,獲取所有工作表的名稱,將這些名稱存儲(chǔ)在一個(gè)動(dòng)態(tài)數(shù)組中,,然后對(duì)該數(shù)組中的項(xiàng)進(jìn)行排序,。對(duì)數(shù)組進(jìn)行排序后,我們就會(huì)知道所有工作表的正確順序,;此時(shí)便可以使用 Excel 的 Move 方法,,將每個(gè)工作表移動(dòng)到所需的位置。

因此,創(chuàng)建該數(shù)組之后,,我們使用一些標(biāo)準(zhǔn)的樣板代碼創(chuàng)建了 Excel.Application 對(duì)象的一個(gè)實(shí)例,,將 Visible 屬性設(shè)置為 True,然后使用 Open 方法打開文件 C:\Scripts\Inventory.xls?,F(xiàn)在,,我們準(zhǔn)備要卷起袖子開始工作了。

我們需要做的第一件事情就是獲取所有工作表的名稱并將它們放入動(dòng)態(tài)數(shù)組中,。這是通過下面這塊代碼實(shí)現(xiàn)的:

For Each objWorksheet in objWorkbook.Sheets
ReDim Preserve arrNames(intSize)
arrNames(intSize) = objWorksheet.Name
intSize = intSize + 1
Next

在此,,我們所做的只是設(shè)置一個(gè) For Each 循環(huán)來遍歷 Sheets 集合;正如其名稱所示,,此集合包括工作簿中存在的所有工作表,。對(duì)于集合中的每個(gè)工作表,我們使用 ReDim Preserve 命令調(diào)整動(dòng)態(tài)數(shù)組的大小,。該數(shù)組的大小最初為 0,,表示數(shù)組中只有一項(xiàng)。(數(shù)組大小始終為數(shù)組中的項(xiàng)數(shù)減 1,。)我們是如何得知已將數(shù)組大小設(shè)置為 0 的呢?這是因?yàn)槲覀儗⒁粋€(gè)名為 intSize 的計(jì)數(shù)器變量的值賦給了它,,而在腳本開頭我們將該變量設(shè)置為 0,。

然后,我們將集合中第一個(gè)工作表的名稱賦值給數(shù)組中的第一項(xiàng),,具體做法如下:

arrNames(intSize) = objWorksheet.Name

我們將計(jì)數(shù)器變量增加 1,,然后進(jìn)入下一個(gè)循環(huán)并對(duì)集合中的第二個(gè)工作表重復(fù)該過程,第二個(gè)工作表的名稱將成為數(shù)組中的第二項(xiàng),。全部完成之后,,我們將擁有一個(gè)依次包括以下各項(xiàng)的數(shù)組:

Sheet2
c
a
Sheet1
b

是的,這不算太糟,。然而,,對(duì)于下一部分就不一定是這樣了。在此,,我們使用了一個(gè)“簡單的”冒泡排序,,按字母順序?qū)?shù)組中的各項(xiàng)進(jìn)行排序:

For i = (UBound(arrNames) - 1) to 0 Step -1
For j= 0 to i
If UCase(arrNames(j)) > UCase(arrNames(j+1)) Then
strHolder = arrNames(j+1)
arrNames(j+1) = arrNames(j)
arrNames(j) = strHolder
End If
Next
Next

在今天的專欄中,我們不想對(duì)冒泡排序的細(xì)節(jié)進(jìn)行解釋,;您可以在“腳本編寫第 2 周”網(wǎng)絡(luò)廣播的 Things the Scripting Guys Never Told You(英文)中找到對(duì)其工作原理的相當(dāng)不錯(cuò)的解釋,。簡而言之,冒泡排序的過程就是將數(shù)組中的每項(xiàng)與數(shù)組中的其他各項(xiàng)進(jìn)行比較,,然后在需要時(shí)交換它們在該數(shù)組中的位置,。例如,我們數(shù)組中的前兩項(xiàng)是:

Sheet2
c

按字母順序來說,c 在 Sheet2 之前,。因此,,冒泡排序?qū)⒔粨Q這兩個(gè)名稱的位置,這意味著數(shù)組中的前兩項(xiàng)會(huì)變成這樣

c
Sheet2

此過程將一直繼續(xù),,直到每項(xiàng)都與其他各項(xiàng)進(jìn)行了比較為止,。最終結(jié)果如何呢?將會(huì)得到一個(gè)按字母順序排序的數(shù)組:

a
b
c
Sheet1
Sheet2

幸運(yùn)地,,此正好也是我們想要的電子表格順序,。既然我們知道了哪個(gè)電子表格應(yīng)排第一,哪個(gè)電子表格應(yīng)排第二,,依此類推,,我們便可以使用這塊代碼重新排列工作簿中的電子表格:

For i = UBound(arrNames) to 1 Step -1
Set objSheet1 = objWorkbook.Sheets(arrNames(i))
Set objSheet2 = objWorkbook.Sheets(arrNames(i-1))
objSheet2.Move objSheet1
Next

這里我們要做的就是從數(shù)組的末尾開始(UBound 可確定數(shù)組的最后一項(xiàng),本例中即為 Sheet2),,然后一直往下進(jìn)行(這正是 Step -1 的作用),。鑒于我們已對(duì)數(shù)組進(jìn)行了排序,我們知道數(shù)組中的最后一項(xiàng) - Sheet2 - 也應(yīng)是工作簿中的最后一個(gè)工作表,。我們還知道數(shù)組中的倒數(shù)第二項(xiàng) - Sheet1 - 應(yīng)是工作簿中的倒數(shù)第二個(gè)工作表,。因此,我們使用以下代碼創(chuàng)建了一個(gè)指向 Sheet 2 的對(duì)象引用:

Set objSheet1 = objWorkbook.Sheets(arrNames(i))

然后,,我們使用以下代碼創(chuàng)建了一個(gè)指向 Sheet 1 的對(duì)象引用:

Set objSheet2 = objWorkbook.Sheets(arrNames(i-1))

最后,,我們調(diào)用 Move 方法,,將 Sheet1 移到 Sheet2 前面(之前):

objSheet2.Move objSheet1

我們是如何得知 Sheet1 將被移到 Sheet2 前面呢?很簡單:在 Move 方法之后沒有逗號(hào):

objSheet2.Move objSheet1

如果要將 Sheet1 移到 Sheet2 后面(之后),則應(yīng)在 Move 方法之后放一個(gè)逗號(hào):

objSheet2.Move, objSheet1

誠然,,這一方法并不十分簡單明了,,可它確實(shí)有效,。

所有工作完成之后,,我們最終將得到一個(gè)如下所示的工作簿:

Microsoft Excel


如果您不完全確定我們是如何做到這一點(diǎn)的,那也不必?fù)?dān)心,。有時(shí)只要相信就足夠了,,不用刨根問底。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購買等信息,,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請遵守用戶 評(píng)論公約

    類似文章 更多