VBA跨工作簿复制数据后工作簿关闭状态异常求助
VBA跨工作簿复制数据后工作簿关闭状态异常求助
兄弟,我看了你的问题和代码,马上就发现几个小问题导致了这个反常识的结果,咱们一步步来理顺:
问题根源
- 你本来就在AUTHS.xlsm里运行代码,结果代码里又用
Workbooks.Open去打开它,这会导致重复打开(如果原文件已经处于打开状态,Excel的焦点会彻底混乱,最后反而把你正在用的AUTHS给关了) - 你依赖
Select和Selection这种靠窗口焦点的操作,Excel的激活顺序很容易搞出幺蛾子,而且这种写法效率也低 - 打开Stop Work.xlsm后没主动关闭它,反而因为焦点错位,导致出现“源文件留着、目标文件被关”的反向结果
修正后的代码
我给你重写了代码,注释写得很清楚,直接用就行:
Sub mycode() ' 声明变量,专门指代打开的源工作簿,避免搞混 Dim sourceWB As Workbook ' 打开源工作簿,同时把它赋值给变量 Set sourceWB = Workbooks.Open(Filename:="D:\Desktop\Stop Work.xlsm") ' 直接复制源工作表的已使用区域(只复制有数据的部分,比全选Cells高效) ' 直接粘贴到当前工作簿(AUTHS)的"Stop Work"工作表A1开始的位置 sourceWB.Worksheets("Sheet1").UsedRange.Copy _ Destination:=ThisWorkbook.Worksheets("Stop Work").Range("A1") ' 关闭源工作簿,因为咱们只是读取数据,没修改它,所以设为不保存更改 sourceWB.Close SaveChanges:=False ' 释放变量,养成好习惯 Set sourceWB = Nothing ' 加个提示框,告诉你操作搞定了 MsgBox "数据复制完成!" End Sub
关键修改说明
- 用
ThisWorkbook指代当前工作簿:它就是你正在运行代码的AUTHS.xlsm,完全不需要再用Workbooks.Open重复打开,从根源避免焦点混乱 - 用变量管理源工作簿:把打开的Stop Work赋值给
sourceWB,后续关闭、操作都直接用这个变量,绝不会搞混工作簿 - 避免
Select/Selection:直接操作单元格对象,既高效又不会因为窗口焦点出问题 - 主动关闭源工作簿:明确设置
SaveChanges:=False,确保复制完成后自动关掉源文件,留下你正在用的AUTHS
如果需要指定粘贴类型
要是你不需要复制全部内容,比如只想粘贴值和格式,把复制粘贴的代码改成下面这样就行:
sourceWB.Worksheets("Sheet1").UsedRange.Copy ThisWorkbook.Worksheets("Stop Work").Range("A1").PasteSpecial xlPasteAll ' 或者换成你需要的类型,比如xlPasteValuesAndNumberFormats Application.CutCopyMode = False ' 清除剪贴板的复制状态,避免Excel一直显示"复制中"的提示
备注:内容来源于stack exchange,提问作者Ramadan Moussa
相关产品推荐
相关产品推荐

