通过PowerShell在工作簿中的多个工作表上运行宏
问题描述:
我正在使用以下Powershell脚本在工作簿中的工作表上运行某些宏。我想要做的是打开工作簿,在特定的工作表上运行特定的宏,然后将工作簿保存到其他位置。出于测试目的,我只是在所有工作表上运行它。通过PowerShell在工作簿中的多个工作表上运行宏
这是我到目前为止有:
$excel = New-Object -ComObject excel.application
$xlfileformat = [Microsoft.Office.Interop.Excel.XlFileFormat]::xlOpenXMLWorkbook
$workbook = $excel.Workbooks.Open($(join-path -path R:\TestOutput\Nick -childpath tmp.xlsm))
$worksheets = $Workbook.Worksheets | ForEach-Object {$_.name}
ForEach ($Worksheet in $Worksheets) {
$WS = $Workbook.Worksheets.Item($Worksheet)
$excel.Run("RunMacro")
$workbook.save()
} #End ForEach
$workbook.saveas($(join-path -path "R:\TestOutput\Nick" -childpath "Test_Output-post"), $xlfileformat)
$excel.quit()
有了这个剧本我希望宏在工作簿中的所有工作表上运行,但只有最后一个工作表中应用了宏。起初,我没有$workbook.save()
在那里。我添加了它,因为我每次加载新工作表时都会重新初始化工作簿,因此会丢失上次运行的更改。尽管如此,这并没有解决问题。
我知道我可以修改VBA脚本本身,但我想最终把它变成一个函数,宏和工作表作为变量输入。
答
当我输入这个,我找到了答案。问题是,我从未激活我选择的工作表。以下代码修复了此问题:
$excel = New-Object -ComObject excel.application
$excel.DisplayAlerts = $false
$xlfileformat = [Microsoft.Office.Interop.Excel.XlFileFormat]::xlOpenXMLWorkbook
$workbook = $excel.Workbooks.Open($(join-path -path R:\TestOutput\Nick -childpath tmp.xlsm))
$worksheets = $Workbook.Worksheets | ForEach-Object {$_.name}
ForEach ($Worksheet in $Worksheets) {
$WS = $Workbook.Worksheets.Item($Worksheet)
$WS.Activate()
$excel.Run("RunMacro")
} #End ForEach
$workbook.saveas($(join-path -path "R:\TestOutput\Nick" -childpath "Test_Output-post"), $xlfileformat)
$excel.quit()
此修复程序在循环中添加了$WS.Activate()
命令。