使用PowerShell打开Excel文件时丢失的宏

时间:2013-08-30 14:54:20

标签: excel powershell-v2.0

我想写的PowerShell脚本的目的是 - 打开一个excel文档并运行一个宏。 (宏存储在个人工作簿文件中 - personal.xlsb并且成功运行)

问题 - 当通过PowerShell代码打开excel文件时,它打开正常但是当通过调用Run("NameOfMacro")运行宏时,我收到一条错误,指出未找到宏。我尝试在打开的excel文件中找到宏,它不会出现在宏列表中。这似乎是因为personal.xlsb文件未加载。

所以我关闭excel文件,手动打开它,但宏仍然缺失。然后我手动打开personal.xlsb文件,注意宏存在,但宏仍然没有出现在excel文件或我之后打开的任何其他excel文件中。
经过一段令人沮丧的时间试图理解为什么personal.xlsb文件突然停止加载。我注意到另一件事 - 如果我杀死了由PowerShell代码启动的excel.exe进程(通过任务管理器窗口),然后打开任何excel文档,宏就可用!!

所以我已经将问题缩小到了这一点 - 由于Personal.xlsb未通过PowerShell打开excel文件时未打开/加载,因此宏不可用。

有没有人知道为什么会发生这种情况,我需要做些什么才能解决这个问题?

Code reference

$excel = New-Object -comobject Excel.Application
$FilePath = "D:\DailyReport.xls"
$workbook = $excel.Workbooks.Open($FilePath)
$excel.Visible = $true
$worksheet = $workbook.worksheets.item(1)
$excel.Run("SelectDataFromReport")

我得到错误 -

  

使用“31”参数调用“Run”的异常:“无法运行宏'SelectDataFromReport'。宏可能在此工作簿或所有宏中不可用       s可能被禁用。“
      在行:18 char:11       + $ excel.Run<<<< ( “SelectDataFromReport”)           + CategoryInfo:NotSpecified:(:) [],MethodInvocationException           + FullyQualifiedErrorId:DotNetMethodException

顺便说一下,我默认使用64位PowerShell控制台,但我也尝试使用32位控制台运行代码,但它没有什么区别。 在excel中,我已将位置添加为受信任位置,并且我已允许在编辑模式下默认打开excel文件。

2 个答案:

答案 0 :(得分:2)

您可以在personal.xlsb中调用宏,如下所示:

$excel = New-Object -comobject Excel.Application
$wbPersonalXLSB = $excel.workbooks.open("$env:USERPROFILE\Application Data\Microsoft\Excel\XLSTART\PERSONAL.XLSB")
$FilePath = "D:\DailyReport.xls"
$workbook = $excel.Workbooks.Open($FilePath)
$excel.Visible = $true
$worksheet = $workbook.worksheets.item(1)
$excel.Run("PERSONAL.XLSB!SelectDataFromReport")
$wbPersonalXLSB.Close()
$workbook.save()
$workbook.close()
$excel.quit()

答案 1 :(得分:0)

$x1 = New-Object -comobject Excel.Application 
$wb = $x1.workbooks.open("$env:C:\teste\testamacro.xlsm") 
$FilePath = "c:\teste\testamacro" 
$workbook = $x1.Workbooks.Open($FilePath) 
$x1.Visible = $true 
$worksheet = $workbook.worksheets.item(1)     
$x1.Run("testamacro.xlsm!SelectDataFromReport")    
$wb.Close() $workbook.save()`

$workbook.close() 
$x1.quit()