Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 通过powershell在工作簿中的多个工作表上运行宏_Vba_Powershell_Excel - Fatal编程技术网

Vba 通过powershell在工作簿中的多个工作表上运行宏

Vba 通过powershell在工作簿中的多个工作表上运行宏,vba,powershell,excel,Vba,Powershell,Excel,我正在使用以下Powershell脚本在工作簿中的工作表上运行一些宏。我要做的是打开工作簿,在特定工作表上运行某个宏,然后将工作簿保存到其他位置。出于测试目的,我只是在所有工作表上运行它 以下是我到目前为止的情况: $excel = New-Object -ComObject excel.application $xlfileformat = [Microsoft.Office.Interop.Excel.XlFileFormat]::xlOpenXMLWorkbook $workbook =

我正在使用以下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()
命令。

当我键入这个时,我找到了答案。问题是,我从未激活我选择的工作表。以下代码修复了该问题:

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