通过PowerShell在工作簿中的多个工作表上运行一个macros

我正在使用下面的Powershell脚本在工作簿中的工作表上运行一些macros。 我想要做的是打开工作簿,在特定的工作表上运行特定的macros,并将工作簿保存到不同的位置。 出于testing目的,我只是在所有的工作表上运行它。

这是我到目前为止:

$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() 

有了这个脚本,我希望macros可以在工作簿中的所有工作表上运行,但是只有最后一个工作表才会应用macros。 起初,我没有$workbook.save()在那里。 我添加了它,因为我每次加载新工作表时都会重新初始化工作簿,因此会丢失上次运行的更改。 这虽然没有解决这个问题。

我知道我可以修改VBA脚本本身,但是我想最终把它变成一个函数,macros和工作表作为variablesinput。

当我打字的时候,我find了答案。 问题是,我从未激活我select的工作表。 下面的代码解决了这个问题:

 $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()命令。