如何关闭VBA中通过GetOpenFilename打开的指定工作簿
安全关闭通过GetOpenFilename打开的源工作簿
直接修改代码,通过Workbook对象变量精准引用打开的源文件,就能避免误关其他工作簿的问题,同时补充必要的异常处理:
Sub ImportData() Application.ScreenUpdating = False Application.DisplayAlerts = False ' 清空目标区域,明确指向当前宏所在工作簿 ThisWorkbook.Worksheets("DesitnationSheet").Range("A2:AX22").ClearContents Dim strFile As Variant ' 改用Variant,兼容取消选择时返回的布尔值False strFile = Application.GetOpenFilename() ' 判断用户是否取消选择文件,避免后续报错 If strFile = False Then Application.DisplayAlerts = True Application.ScreenUpdating = True Exit Sub End If Dim srcWB As Workbook ' 打开源文件并将引用保存到变量,精准锁定目标文件 Set srcWB = Workbooks.Open(strFile) ' 通过变量引用源文件工作表,完全不依赖ActiveWorkbook srcWB.Worksheets("xSheetFromSalesFilex").Range("A2:AX22").Copy _ ThisWorkbook.Worksheets("DesitnationSheet").Range("A2:AX22") ' 关闭源文件,按需设置是否保存(此处为不保存) srcWB.Close SaveChanges:=False ' 恢复Excel默认设置,避免影响后续操作 Application.DisplayAlerts = True Application.ScreenUpdating = True End Sub
关键改动说明:
- 新增Workbook变量
srcWB:打开源文件时直接赋值给变量,后续所有操作都通过这个变量指向目标文件,彻底摆脱对ActiveWorkbook的依赖,杜绝误关其他工作簿的风险 - 改用
Variant类型存储路径:GetOpenFilename在用户取消选择时返回布尔值False,String类型会报错,Variant可兼容两种返回值 - 明确使用
ThisWorkbook:指代当前运行宏的工作簿(即xWorkingWB.xlsm),比硬写文件名更可靠,防止文件名修改后代码失效 - 补充取消选择判断:避免用户取消后代码继续执行引发错误
- 恢复
DisplayAlerts设置:原代码关闭了提示但未恢复,可能影响后续Excel操作
内容的提问来源于stack exchange,提问作者David Snyder
相关产品推荐
相关产品推荐

