复制SAP导出数据后Excel工作簿无法关闭问题求助
问题分析与修复方案
核心问题
- 从SAP导出的
retornos pendentes.xlsx始终无法关闭 - 完成数据粘贴后,运行宏的初始工作簿(
file2.xlsm)意外关闭
问题根源
- 变量逻辑混乱:原代码中
wbkretorno先被赋值为文件路径(字符串类型),后又被Set为Workbook对象,导致后续依赖ActiveWorkbook的操作不可靠——复制数据后焦点会切换到ThisWorkbook,此时ActiveWorkbook指向的是运行宏的文件,而非导出的xlsx。 - 错误关闭工作簿:当焦点切换到
ThisWorkbook后,执行ActiveWorkbook.Close会错误关闭运行宏的初始工作簿,而非目标xlsx文件。
修复后的宏代码
Sub atualizarretornos() Set SapGuiAuto = GetObject("SAPGUI") Set objGui = SapGuiAuto.GetScriptingEngine Set objConn = objGui.Children(0) Set session = objConn.Children(0) session.findById("wnd[0]").maximize session.findById("wnd[0]/tbar[0]/okcd").Text = "/n" session.findById("wnd[0]").sendVKey 0 session.findById("wnd[0]/tbar[0]/okcd").Text = "vl06o" session.findById("wnd[0]").sendVKey 0 session.findById("wnd[0]/usr/btnBUTTON6").press session.findById("wnd[0]").sendVKey 17 session.findById("wnd[1]").sendVKey 8 session.findById("wnd[0]").sendVKey 8 session.findById("wnd[0]").sendVKey 43 session.findById("wnd[1]/usr/ctxtDY_FILENAME").Text = "retornos pendentes.xlsx" session.findById("wnd[1]/usr/ctxtDY_FILENAME").caretPosition = 23 session.findById("wnd[1]/tbar[0]/btn[11]").press Application.ScreenUpdating = False ' 拆分路径与工作簿变量,明确类型 Dim wbkRetornoPath As String Dim wbkRetorno As Workbook wbkRetornoPath = "C:\Users\lopesa04\Desktop\retornos pendentes.xlsx" ' 直接将打开的工作簿赋值给变量,避免依赖ActiveWorkbook Set wbkRetorno = Workbooks.Open(wbkRetornoPath) ' 复制数据到目标工作表 wbkRetorno.Worksheets(1).Range("A:P").Copy With ThisWorkbook.Sheets("retornos pendentes") .Range("A:P").PasteSpecial Paste:=xlPasteValues End With ' 通过变量直接关闭导出的工作簿,无需保存(无修改操作) wbkRetorno.Close SaveChanges:=False ' 明确激活当前工作簿的Sheet1 ThisWorkbook.Sheets("Sheet1").Activate Application.ScreenUpdating = True End Sub
关键修改说明
- 变量拆分:将文件路径和Workbook对象分开定义,避免类型混淆,代码逻辑更清晰。
- 直接引用工作簿:全程使用
wbkRetorno变量操作导出的xlsx文件,彻底摆脱对ActiveWorkbook的依赖,避免焦点切换引发的错误。 - 关闭时跳过保存:导出的文件仅作为数据中转,无需保存修改,指定
SaveChanges:=False可跳过保存提示并快速关闭。 - 明确激活目标工作表:通过
ThisWorkbook指定运行宏的工作簿,确保激活的是正确的工作表。
内容的提问来源于stack exchange,提问作者André Lopes
相关产品推荐
相关产品推荐

