PowerShell调用Excel宏提示宏已禁用的解决方法咨询
解决方法
核心修改逻辑为:在创建Excel COM对象之后、打开工作簿之前,临时调整Excel的自动化安全级别允许宏运行,执行完成后还原默认安全配置,避免影响Excel后续的安全机制。
修正后的完整代码
# 启动Excel进程 $excel = New-Object -comobject Excel.Application # 保存原有自动化安全配置,后续还原 $originalSecurity = $excel.AutomationSecurity # 临时设置为允许所有宏运行(对应枚举值msoAutomationSecurityLow) $excel.AutomationSecurity = 1 # 打开宏工作簿 $FilePath = 'C:\Users\Username\Desktop\ExcelWorkbook.xlsm' $workbook = $excel.Workbooks.Open($FilePath) # 可视设置,调试用,生产环境可设为$false $excel.Visible = $true # 运行指定宏 $excel.Application.Run("Macro") # 还原Excel原有安全配置,必须执行避免降低系统安全等级 $excel.AutomationSecurity = $originalSecurity # 退出Excel $excel.Quit() # 释放COM对象资源,避免残留Excel后台进程 [System.Runtime.Interopservices.Marshal]::ReleaseComObject($excel) | Out-Null Remove-Variable excel -ErrorAction SilentlyContinue # 完成提示,任务计划调用场景可删除 $wshell = New-Object -ComObject Wscript.Shell $wshell.Popup("Operation Completed",0,"Done",0x1)
额外排查项
如果修改后仍存在报错,可检查以下配置:
- 右键点击对应xlsm文件,选择「属性」,如果窗口底部有「解除锁定」勾选框,勾选后保存,避免系统拦截来自网络的文件运行宏
- 打开Excel的「信任中心」-「信任中心设置」-「宏设置」,确认选中「禁用所有宏,并发出通知」,不要选择「禁用所有宏,并且不通知」
- 宏名称要和工作簿内定义的完全一致,如果宏归属指定模块,需要写全调用路径,例如
$excel.Run("Module1.Macro")
内容的提问来源于stack exchange,提问作者New Kid on the block
相关产品推荐
相关产品推荐

