VBA创建临时工作簿后,用户关闭时代码终止运行的问题
问题分析与解决方案
问题根源
当用户关闭宏创建的临时工作簿时,Excel会默认终止当前运行的宏进程,导致后续代码无法执行。同时原代码中依赖遍历Workbooks集合的WorkbookIsOpen函数,在工作簿关闭瞬间可能无法及时触发循环退出,进一步加剧了这个问题。
修复后的代码
Sub Test() ' 设置临时工作簿的路径和文件名 Dim Temp_Dir As String, Temp_WB_Name As String, Temp_WB_Path As String Temp_Dir = IIf(Environ$("tmp") <> "", Environ$("tmp"), Environ$("temp")) Temp_WB_Name = "temp_input_wb.xlsx" Temp_WB_Path = Temp_Dir & "\" & Temp_WB_Name ' 创建临时工作簿 Dim Temp_WB As Workbook Set Temp_WB = Workbooks.Add ' 保存并激活工作簿,确保用户可见可操作 Application.DisplayAlerts = False Temp_WB.SaveAs Temp_WB_Path Application.DisplayAlerts = True Temp_WB.Activate ' 提示用户操作 MsgBox "可在临时工作簿中增删改数据,完成后关闭即可继续后续流程。" ' 等待用户关闭临时工作簿 Do While Not Temp_WB Is Nothing DoEvents ' 重新获取工作簿引用,检测是否已关闭 On Error Resume Next Set Temp_WB = Workbooks(Temp_WB_Name) On Error GoTo 0 Loop Debug.Print "工作簿已关闭" ' 重新打开临时工作簿读取更新后的数据 Set Temp_WB = Workbooks.Open(Temp_WB_Path) ' 后续业务逻辑写在这里 ' ... ' 可选:处理完成后删除临时文件 ' Application.DisplayAlerts = False ' Temp_WB.Close SaveChanges:=False ' Kill Temp_WB_Path ' Application.DisplayAlerts = True End Sub
关键修改说明
- 工作簿可见性激活:添加
Temp_WB.Activate确保临时工作簿处于前台,用户能直接操作。 - 循环检测逻辑优化:不再依赖遍历
Workbooks集合的函数,而是直接检查Temp_WB对象是否存在。每次循环内重新获取工作簿引用,确保能准确捕捉到工作簿关闭的状态。 - 错误处理:使用
On Error Resume Next避免获取已关闭工作簿引用时触发错误,保证循环平稳退出。
内容的提问来源于stack exchange,提问作者Steve
相关产品推荐
相关产品推荐

