[Powershell / VBA] 把excel中的表分離成獨立的excel文件

This article also published in Eng @ http://www.cnblogs.com/LarryAtCNBlog/p/4441201.html

今天在兩個地方看到了這樣一個問題:把一個excel中的表複製出來另存爲一個獨立的excel文件。其中一個是cnblog,另一個想不起來了。想到自己將來也可能遇到這樣的問題,於是用powershell做了一個腳本以備不時之需。

 

Powershell

當然,首先要有一個excel文件包括了一堆表。

用腳本自動化excel最常用的是COM object,下面的語句就是新建一個excel.application實例並把DisplayAlerts置爲false,這樣可以避開excel的告警。

$Excel = New-Object -ComObject Excel.Application
$Excel.DisplayAlerts = $false

這其實就相當於我們雙擊了一下excel.exe,如果想把它顯示出來只需要把$Excel.Visible屬性置爲true即可。

下面的語句就是打開目標excel文件,該open方法僅接受絕對路徑。

$WorkBook = $Excel.Workbooks.Open("$PWD\all.xlsx")

現在我們已經有了workbook的對象,我們只需要對其中的Sheets做循環複製到一個新的Workbook即可。

$WorkBook.Sheets | %{
    # 設置新的workbook的路徑
    $NewWorkBookPath = "$PWD\$($WorkBook.Name)_$($_.Name).xlsx"
    # 新建一個workbook
    $NewWorkBook = $Excel.Workbooks.Add()
    # 把當前的sheet複製到這個新的workbook裏面
    $_.Copy($NewWorkBook.Sheets.Item(1))
    # 默認新建一個workbook是有3個空的sheet,下面的語句是刪掉這幾個空的表
    2..$NewWorkBook.Sheets.Count | %{
        $NewWorkBook.Sheets.Item(2).Delete()
    }
    # 把該新的workbook另存爲
    $NewWorkBook.SaveAs($NewWorkBookPath)
    # close new workbook
    $NewWorkBook.Close()
}

At last, close old workbook and excel.

最後,調用close方法關閉原來的workbook和excel

$WorkBook.Close()
$Excel.Quit()

到這裏可能有人注意到任務管理器裏依然有一個excel.exe存在,實際上在其它的程序語言中也會遇到同樣的問題,對於該問題的答案MS已經給出瞭解決辦法。

 https://technet.microsoft.com/en-us/library/ff730962.aspx

[System.Runtime.Interopservices.Marshal]::ReleaseComObject($Excel) | Out-Null

到這裏工作就完成了,改良腳本就是之後的事了。

 

VBA

另一個方法是用office自帶的宏來做這件事,打開excel按Alt + F11之後就能調用VBA editor,如果你不能的話可能是最開始安裝office的時候沒有選擇宏組件。

VBA中的方法非常類似,只不過操作的對象不同罷了。

Sub SplitSheets()
    Application.DisplayAlerts = False
    For Each Sheet In Sheets
        NewWorkBookPath = ActiveWorkbook.FullName & "_" & Sheet.Name & ".xlsx"
        Set w = Workbooks.Add
        Sheet.Copy w.Sheets.Item(1)
        For i = 2 To w.Sheets.Count
            w.Sheets.Item(2).Delete
        Next
        w.SaveAs NewWorkBookPath
        w.Close
        Set w = Nothing
    Next
End Sub

這其實就是建了一個宏而已,在workbook界面用Alt + F8可以調用出宏界面執行它,或者在VBA editor界面按F5執行宏即可。

 - Larry

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章