VBA宏执行后无法自动保存关闭当前工作簿求助
解决VBA宏执行后无法保存关闭当前工作簿的问题
你的核心问题是宏执行过程中因窗口焦点切换、依赖Select/Activate的模糊操作,导致当前工作簿的保存关闭命令无法生效。以下是修正后的宏代码及关键改进说明:
修正后的完整代码
Sub CopyPasteToTracking() Dim wbCurrent As Workbook Dim wbInventory As Workbook Dim wsExport As Worksheet Dim wsSalesRecord As Worksheet Dim wsInventorySales As Worksheet Dim copyRange As Range ' 禁用屏幕刷新,提升效率并避免焦点干扰 Application.ScreenUpdating = False ' 绑定当前工作簿及内部工作表对象 Set wbCurrent = ThisWorkbook Set wsExport = wbCurrent.Sheets("Export Table") Set wsSalesRecord = wbCurrent.Sheets("Sales Record") ' 定义需要复制的范围(避免依赖Select) Set copyRange = wsExport.Range("$A$1:$K$" & wsExport.Range("M1").Value) ' 复制到当前工作簿的Sales Record工作表 copyRange.Copy wsSalesRecord.Range("$A$10").PasteSpecial Paste:=xlPasteValuesAndNumberFormats ' 打开库存工作簿并绑定目标工作表 Set wbInventory = Workbooks.Open(Filename:= _ "C:\Users\Michelle\Documents\Maple Inventory System\YYYY\YYYY SYRUP MANAGEMENT\test YYYY SYRUP INVENTORY TRACKING.xlsm") Set wsInventorySales = wbInventory.Sheets("Sales") ' 粘贴到库存工作簿的指定位置 copyRange.PasteSpecial Paste:=xlPasteValuesAndNumberFormats, _ Destination:=wsInventorySales.Range("$B$" & (1 + wsInventorySales.Range("Y1").Value)) ' 清理剪贴板并恢复屏幕刷新 Application.CutCopyMode = False Application.ScreenUpdating = True ' 关闭库存工作簿(依赖其Worksheet_Change自动保存,无需手动保存) wbInventory.Close SaveChanges:=False ' 保存并关闭当前工作簿 wbCurrent.Save wbCurrent.Close SaveChanges:=False End Sub
关键改进说明
- 替换
Select/Activate为对象引用:原代码依赖Select切换工作表和窗口,容易导致焦点混乱,使后续的保存关闭命令错误指向库存工作簿而非当前工作簿。用变量绑定工作簿、工作表后,所有操作都明确指向目标对象,避免焦点干扰。 - 控制屏幕刷新:执行过程中禁用屏幕刷新,既提升运行速度,也避免窗口切换带来的焦点偏移问题。
- 明确操作顺序:先完成所有数据复制粘贴操作,清理剪贴板后,先关闭库存工作簿,再执行当前工作簿的保存关闭,确保命令执行时焦点正确落在当前工作簿上。
- 利用现有自动保存逻辑:库存工作簿的
Worksheet_Change已实现自动保存,因此关闭时无需重复设置SaveChanges:=True,避免冲突。
内容的提问来源于stack exchange,提问作者Michelle Trudeau
相关产品推荐
相关产品推荐

