码迷,mamicode.com
首页 > 编程语言 > 详细

[Powershell / VBA] 把excel中的表分离成独立的excel文件

时间:2015-04-20 22:34:45      阅读:291      评论:0      收藏:0      [点我收藏+]

标签:

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

[Powershell / VBA] 把excel中的表分离成独立的excel文件

标签:

原文地址:http://www.cnblogs.com/LarryAtCNBlog/p/4442658.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!