如何在VBA中读取启用宏的工作簿并处理数据而不终止当前程序?
批量把XLSM转成XLSX的VBA解决办法
问题根源
你遇到的情况是因为待打开的XLSM文件里有自动运行的宏(比如Workbook_Open事件),Excel 2021对宏的运行隔离做得更严,打开文件时会直接切换到新文件执行它的宏,导致你当前的程序终止。以前的Excel版本(比如2016)管控没这么严,所以当时能正常运行。
解决代码
下面这个宏会批量处理指定文件夹里的所有XLSM文件,转成XLSX,还能避免被外部文件的宏打断:
Sub BatchConvertXLSMtoXLSX() Dim srcPath As String Dim destPath As String Dim srcFile As String Dim wb As Workbook Dim autoExecState As Boolean ' 这里改成你的源文件夹和目标文件夹路径 srcPath = "C:\你的源文件路径\" destPath = "C:\你的目标文件路径\" ' 先保存当前自动宏的状态,然后禁用自动执行 autoExecState = Application.EnableEvents Application.EnableEvents = False ' 遍历所有XLSM文件 srcFile = Dir(srcPath & "*.xlsm") Do While srcFile <> "" ' 打开XLSM文件(此时不会触发它的自动宏) Set wb = Workbooks.Open(srcPath & srcFile) ' 另存为XLSX,自动覆盖已存在的文件 wb.SaveAs Filename:=destPath & Replace(srcFile, ".xlsm", ".xlsx"), _ FileFormat:=xlOpenXMLWorkbook, _ ConflictResolution:=xlLocalSessionChanges ' 关闭原文件,不保存修改 wb.Close SaveChanges:=False srcFile = Dir Loop ' 恢复自动宏的执行状态 Application.EnableEvents = autoExecState MsgBox "批量转换搞定!" End Sub
额外提示
- 如果目标文件夹不存在,运行时会报错,你可以加一段代码自动创建文件夹,放在设置路径之后:
If Dir(destPath, vbDirectory) = "" Then MkDir destPath - 如果要转换的文件有密码保护,得先在代码里添加解锁逻辑,不然会打不开。
- 运行前要确保Excel允许运行宏:打开「文件」→「选项」→「信任中心」→「信任中心设置」→「宏设置」,选「启用所有宏」(或者根据你的安全需求调整)。
内容的提问来源于stack exchange,提问作者WarwickW
相关产品推荐
相关产品推荐

