2013-03-08 66 views
0

我正在使用以下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腳本本身,但我想最終把它變成一個函數,宏和工作表作爲變量輸入。

回答

3

當我輸入這個,我找到了答案。問題是,我從未激活我選擇的工作表。以下代碼修復了此問題:

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

相關問題