使用VBA/VBS打开带只读密码的加密XLSX并另存为无密码文件的问题求助
解决加密XLSX文件在VBA中打开时卡住的问题
你遇到的核心问题是参数传递语法错误,导致密码没有被正确传入Workbooks.Open方法,Excel依然弹出密码输入框,程序因此卡住等待用户操作,进而触发了"Excel正在等待另一个应用程序完成OLE操作"的提示。另外你的代码里还有几处拼写和语法小问题,我帮你修正并优化了方案:
修正后的完整代码
Sub OpenXlsx() Dim objExcel As Object Dim wb As Object Dim wb1 As Object Dim path As String Dim newpath As String ' 初始化Excel应用对象,注意是CreateObject(没有点) Set objExcel = CreateObject("Excel.Application") ' 后台运行Excel,不显示界面避免干扰 objExcel.Visible = False ' 关闭不必要的弹窗提示,确保流程自动化 objExcel.DisplayAlerts = False path = "C:/myfilepath.xlsx" newpath = "C:/12myfilepath.xlsx" ' 正确传递密码参数:VBA中命名参数必须用:=关联参数名和值 Set wb = objExcel.Workbooks.Open(Filename:=path, Password:="123") ' 创建新工作簿,修正拼写错误Wookbooks→Workbooks Set wb1 = objExcel.Workbooks.Add() ' 直接赋值比复制粘贴更高效,还能避免剪贴板依赖 wb1.Sheets(1).Cells.Value = wb.Sheets(1).Cells.Value ' 保存新工作簿 wb1.SaveAs Filename:=newpath ' 关闭原工作簿,不保存更改 wb.Close SaveChanges:=False ' 关闭新工作簿 wb1.Close SaveChanges:=False ' 清理对象并退出Excel,避免进程残留 Set wb = Nothing Set wb1 = Nothing Set objExcel = Nothing End Sub
关键修改点说明
- 参数传递修正:把
Password = "123"改成Password:="123",之前的写法只是创建了一个局部变量,根本没把密码传给打开方法,这是导致密码弹窗卡住的核心原因。 - 拼写错误修复:
Create.Object→CreateObject,Wookbooks→Workbooks,这些小错误会直接导致对象创建失败。 - 后台运行优化:设置
objExcel.Visible = False让Excel在后台静默运行;DisplayAlerts = False关闭保存、覆盖等提示弹窗,确保流程全程自动化。 - 复制方式优化:用直接赋值
Cells.Value = Cells.Value替代复制粘贴,不仅运行效率更高,还避免了剪贴板占用和格式粘贴的冗余问题。
额外注意事项
- 如果你的密码是修改权限密码(不是打开文件的密码),需要把
Password:="123"换成WriteResPassword:="123"。 - 可以添加错误捕获逻辑,避免密码错误或文件不存在时程序崩溃:
On Error Resume Next Set wb = objExcel.Workbooks.Open(Filename:=path, Password:="123") If Err.Number <> 0 Then MsgBox "操作失败:" & Err.Description objExcel.Quit Set objExcel = Nothing Exit Sub End If On Error GoTo 0
内容的提问来源于stack exchange,提问作者Hawk Hao
相关产品推荐
相关产品推荐

