国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項超值服

開通VIP
如何對工作簿中的工作表排序?

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

問:

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

-- FS

答:

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

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


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

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

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

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

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

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

For Each objWorksheet in objWorkbook.SheetsReDim Preserve arrNames(intSize)arrNames(intSize) = objWorksheet.NameintSize = intSize + 1Next

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

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

arrNames(intSize) = objWorksheet.Name

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

Sheet2caSheet1b

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

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

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

Sheet2c

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

cSheet2

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

abcSheet1Sheet2

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

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

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

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

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

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

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

objSheet2.Move objSheet1

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

objSheet2.Move objSheet1

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

objSheet2.Move, objSheet1

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

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


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

本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
完全手冊Excel VBA典型實(shí)例大全:通過368個例子掌握
用DLL實(shí)現(xiàn)把數(shù)據(jù)庫的記錄導(dǎo)出到EXCEL中(VB) - 應(yīng)用程序 - VB教程
多個文件夾中的Excel工作簿匯總到一個表中 | VBA實(shí)例教程
再獻(xiàn)我的自學(xué)收集資料第二部份
VBA獲取工作簿所有工作表名稱
excel跨工作簿引用數(shù)據(jù)
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服