【问题标题】:Run a macro on multiple worksheets in a workbook via powershell通过 powershell 在工作簿中的多个工作表上运行宏
【发布时间】:2013-03-08 09:21:52
【问题描述】:

我正在使用以下 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 脚本本身,但我想最终将它变成一个函数,其中宏和工作表作为变量输入。

【问题讨论】:

    标签: vba powershell excel


    【解决方案1】:

    在我打字的时候,我找到了答案。问题是,我从未激活过我选择的工作表。下面的代码解决了这个问题:

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

    【讨论】:

      猜你喜欢
      • 2022-11-09
      • 2012-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多