如何不打开工作簿复制工作表?ScreenUpdating代码失效问题
如何在VBA中不打开外部工作簿就复制其最后一张工作表
嘿,我来帮你捋清楚问题所在:
你代码里用了With otherwb,这说明otherwb这个工作簿对象已经处于打开状态了——ScreenUpdating = False只是屏蔽了界面刷新动画,但没法让已经打开的工作簿“隐身”。另外,哪怕你之前没打开它,直接用Sheets.Copy操作未打开的工作簿时,Excel默认也会先打开它,这就是你看到工作簿弹出的原因。
要实现「不显示打开界面就复制工作表」的需求,得换个思路,用GetObject在后台加载工作簿,再配合屏蔽提示和刷新的设置。下面是完整的可行代码:
Sub CopyLastSheetSilently() Dim sourceFile As String Dim sourceWB As Workbook Dim targetWB As Workbook ' 替换成你的源工作簿完整路径 sourceFile = "D:\Documents\YourSourceFile.xlsx" ' 关闭屏幕刷新和系统提示,避免弹窗和界面闪烁 Application.ScreenUpdating = False Application.DisplayAlerts = False ' 后台加载源工作簿,不会在界面显示打开窗口 Set sourceWB = GetObject(sourceFile) ' 复制源工作簿的最后一张表到当前工作簿的末尾 sourceWB.Sheets(sourceWB.Sheets.Count).Copy After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count) ' 关闭源工作簿,不保存(我们只是复制,没修改它) sourceWB.Close SaveChanges:=False ' 恢复Excel的正常显示和提示,这一步很重要! Application.ScreenUpdating = True Application.DisplayAlerts = True End Sub
关键细节说明:
GetObject(sourceFile):这个方法是核心,它会在后台加载指定的工作簿,完全不会在界面上显示打开的窗口,正好满足你的需求。Application.DisplayAlerts = False:必须加上,不然复制时如果遇到同名工作表会弹出确认框,关闭工作簿时也会弹出保存提示,破坏“静默操作”的效果。- 操作完成后一定要恢复
ScreenUpdating和DisplayAlerts,不然Excel会一直处于无刷新、无提示的状态,影响后续操作。
回到你原来的代码:你之前的写法默认已经打开了otherwb,所以不管怎么设置ScreenUpdating,都没法让已经显示的工作簿消失——这就是为什么你的代码没达到预期效果。
内容的提问来源于stack exchange,提问作者JanAlb
相关产品推荐
相关产品推荐

