博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[Powershell / VBA] 把excel中的表分离成独立的excel文件
阅读量:4679 次
发布时间:2019-06-09

本文共 2045 字,大约阅读时间需要 6 分钟。

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

转载于:https://www.cnblogs.com/LarryAtCNBlog/p/4442658.html

你可能感兴趣的文章
vue项目首页形成原理
查看>>
nginx 安装
查看>>
演示使用string对象
查看>>
UVa 133 The Dole Queue
查看>>
spring(一)IOC & AOP
查看>>
codefroces 911G Mass Change Queries
查看>>
BZOJ 1010: [HNOI2008]玩具装箱toy(dp+斜率优化)
查看>>
HTTP错误500.22 检测到在集成的托管管道模式ixan不适用的ASP.NET设置
查看>>
flattern
查看>>
02 CSS和DIV对界面优化
查看>>
通过 监听器获取sessionId
查看>>
电影推荐之《哈里波特与凤凰社》 隐私策略(Privacy policy)
查看>>
2016级算法期末模拟练习赛-A.wuli51和京导的毕业旅行
查看>>
第二周 day2 python学习笔记
查看>>
android选项卡1
查看>>
JavaScript中数组的排序方法:1.冒泡排序 2.选择排序
查看>>
Codeforces Round #277.5 (Div. 2) B. BerSU Ball【贪心/双指针/每两个跳舞的人可以配对,并且他们两个的绝对值只差小于等于1,求最多匹配多少对】...
查看>>
loj 6053 简单的函数 —— min_25筛
查看>>
bzoj2809 [Apio2012]dispatching——左偏树(可并堆)
查看>>
python day7
查看>>