You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

关键修改说明

  1. 用ThisWorkbook指代当前工作簿:它就是你正在运行代码的AUTHS.xlsm,完全不需要再用Workbooks.Open重复打开,从根源避免焦点混乱
  2. 用变量管理源工作簿:把打开的Stop Work赋值给sourceWB,后续关闭、操作都直接用这个变量,绝不会搞混工作簿
  3. 避免Select/Selection:直接操作单元格对象,既高效又不会因为窗口焦点出问题
  4. 主动关闭源工作簿:明确设置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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.15 11:23:07