使用PowerShell打开Excel文件时缺lessmacros

我试图写的PowerShell脚本的目的是 – 打开一个Excel文档并运行一个macros。 (该macros存储在个人工作簿文件personal.xlsb ,并成功运行)

问题 – 当通过PowerShell代码打开excel文件时,它打开正常,但是通过调用Run("NameOfMacro")macros时,出现错误,指出未findmacros。 我试图find打开的Excel文件中的macros,它不会出现在macros列表中。 这似乎是因为personal.xlsb文件不加载。

所以我closures了excel文件,手动打开它,但macros仍然丢失。 然后,我手动打开personal.xlsb文件,并注意到该macros存在,但是macros仍然不会出现在Excel文件或任何其他Excel我打开文件。
试图了解为什么personal.xlsb文件突然停止加载后,一个令人沮丧的小时。 我注意到另一件事情 – 如果我杀了由PowerShell代码(通过任务pipe理器窗口)启动的excel.exe进程,然后打开任何Excel文档,macros可用!

所以我已经缩小了这个问题 – macros不可用,因为Personal.xlsb不打开/加载当我通过PowerShell打开Excel文件。

有没有人有一个想法为什么会发生这种情况,我需要做什么来解决这个问题?

代码参考

 $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”参数调用“运行”的exception:“无法运行macros”SelectDataFromReport“macros可能在此工作簿中不可用,或者所有macros都可能被禁用。
在行:18 char:11 + $ excel.Run <<<<(“SelectDataFromReport”)+ CategoryInfo:NotSpecified:(:) [],MethodInvocationException + FullyQualifiedErrorId:DotNetMethodException

顺便说一句,我默认使用64位PowerShell控制台,但我也尝试使用32位控制台运行代码,但没有什么区别。 在Excel中,我已经添加了位置作为一个值得信赖的位置,我已经允许在编辑模式下默认打开excel文件。

你可以像这样在personal.xlsb中调用macros:

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