gpt4 book ai didi

excel - 导出的文件在宏完成后打开 - 不需要

转载 作者:行者123 更新时间:2023-12-03 02:33:52 24 4
gpt4 key购买 nike

我有一些 VBA 代码,可将 SAP 数据导出到 .XLSX 文件,然后将该文件导入到 Excel 中。导入文件后,我有执行许多其他操作的代码(例如解析和组织数据、计算单元格等)。宏完成后,导出的 SAP .XLSX 文件将打开,但我不希望它打开。

我尝试过使用 Kill 函数,它成功执行了,但在宏末尾,它没有打开文件,而是显示一条有关未找到文件的消息,这是有道理的。

我尝试在宏完成之前关闭文件,但这也会导致错误,因为文件实际上并未打开。

我尝试在宏完成之前打开然后关闭文件,它成功地完成了此操作,但在宏结束时,文件再次打开。

但是,当我破坏代码并单步执行时,文件最终不会打开。

我尝试了其他一些不同的计时器函数、DoEvents 等,但仍然没有成功。

有谁知道如何:1. 防止导出的文件在代码末尾打开或2. 防止显示“文件未找到”消息,以便在宏期间杀死文件。

示例代码

'Opens SAP connection
Dim SAPGUI
Dim Applic
Dim connection
Dim Session
Dim WSHShell

Application.DisplayAlerts = False

Shell "C:\Program Files (x86)\SAP\FrontEnd\SAPgui\saplogon.exe", vbNormalFocus

Set WSHShell = CreateObject("WScript.Shell")
Do Until WSHShell.AppActivate("SAP Logon ")
Application.Wait Now + TimeValue("0:00:01")
Loop

Set WSHShell = Nothing
Set SAPGUI = GetObject("SAPGUI")
Set Applic = SAPGUI.GetScriptingEngine
Set connection = Applic.OpenConnection("04. R3 PRD []", True)
Set Session = connection.Children(0)
' Session.findById("wnd[0]").iconify
Session.findById("wnd[0]/usr/txtRSYST-MANDT").Text = "100"
Session.findById("wnd[0]/usr/txtRSYST-BNAME").Text = Environ("Username")
Session.findById("wnd[0]/usr/pwdRSYST-BCODE").Text = sysstart.psswrd
Session.findById("wnd[0]").sendVKey 0

Session.findById("wnd[0]").maximize
Session.findById("wnd[0]/tbar[0]/okcd").Text = "/nZUI_SELECTION"
Session.findById("wnd[0]").sendVKey 0

''Performs some filters and opens data

' Export from SAP to .xlsx file.
Session.findById("wnd[0]/usr/cntlGRID1/shellcont/shell").contextMenu
Session.findById("wnd[0]/usr/cntlGRID1/shellcont/shell").selectContextMenuItem "&XXL"
Session.findById("wnd[1]/tbar[0]/btn[0]").press
Session.findById("wnd[1]/usr/ctxt[0]").Text = "C:\Users\" & Environ("Username") & "\Downloads"
Session.findById("wnd[1]/usr/ctxt[1]").Text = "SAP_export.XLSX"
Session.findById("wnd[1]/tbar[0]/btn[11]").press

'Closes SAP connection
Set Session = Nothing
connection.CloseSession ("ses[0]")
Set connection = Nothing


'Clear table from SMS Input
ThisWorkbook.Worksheets("SMS Input").Select
Cells.Select
Selection.ClearContents

'Insert .xlsx file data
Cells.Select
Selection.Delete Shift:=xlUp
Range("A6").Select
With ActiveSheet.ListObjects.Add(SourceType:=0, Source:=Array( _
"OLEDB;Provider=Microsoft.ACE.OLEDB.12.0;Password="""";User ID=Admin;Data Source=C:\Users\" & Environ("Username") & "\Downloads\SAP_export.XLSX;Mode=Share Deny None" _
, _
";Extended Properties=""HDR=YES;"";Jet OLEDB:System database="""";Jet OLEDB:Registry Path="""";Jet OLEDB:Database Password="""";Jet OL" _
, _
"EDB:Engine Type=37;Jet OLEDB:Database Locking Mode=0;Jet OLEDB:Global Partial Bulk Ops=2;Jet OLEDB:Global Bulk Transactions=1;Je" _
, _
"t OLEDB:New Database Password="""";Jet OLEDB:Create System Database=False;Jet OLEDB:Encrypt Database=False;Jet OLEDB:Don't Copy Lo" _
, _
"cale on Compact=False;Jet OLEDB:Compact Without Replica Repair=False;Jet OLEDB:SFP=False;Jet OLEDB:Support Complex Data=False;Je" _
, "t OLEDB:Bypass UserInfo Validation=False"), Destination:=Range("$A$6")). _
QueryTable
.CommandType = xlCmdTable
.CommandText = Array("Sheet1$")
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.BackgroundQuery = True
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.PreserveColumnInfo = True
.SourceDataFile = "C:\Users\" & Environ("Username") & "\Downloads\SAP_export.XLSX"
.ListObject.DisplayName = "Table_export3"
.Refresh BackgroundQuery:=False
.MaintainConnection = False
End With

导入文件后,我会解析一些列并组织工作表中的信息。

在代码末尾,我尝试了上面提到的不同变体。

'Open the export and then close to avoid it opening at end of macro.
Workbooks.Open Filename:="C:\Users\" & Environ("Username") & _
"\Downloads\SAP_export.XLSX"
Workbooks("SAP_export.XLSX").Close savechanges:=False
Application.Wait Now + TimeValue("0:00:01")
Kill "C:\Users\" & Environ("Username") & "\Downloads\SAP_export.XLSX"

起初,我认为这是使用 OLEDB 导入 .XLSX 部分的问题,但事实并非如此。如果我在 SAP 连接关闭后结束代码,文件将在最后自动打开。我看过其他帖子也有同样的问题,但没有可靠的答案。希望这一点是清楚的...

预先感谢您的任何反馈,

最佳答案

进一步建议:

在 VBA 程序结束时(无需更改),运行下面的脚本。

例如:

. . .
'Open the export and then close to avoid it opening at end of macro.
set Wshell = CreateObject("WScript.Shell")
Wshell.run "c:\tmp\SAP_Workbook_Close.vbs",1,false
End Sub

SAP_Workbook_Close.vbs:

SAP_Workbook = "SAP_export.xlsx" 
on error resume next
do
err.clear
Set xclApp = GetObject(, "Excel.Application")
If Err.Number = 0 Then exit do
'msgbox "Wait for Excel session"
wscript.sleep 2000
loop

do
err.clear
Set xclwbk = xclApp.Workbooks.Item(SAP_Workbook)
If Err.Number = 0 Then exit do
'msgbox "Wait for SAP workbook"
wscript.sleep 2000
loop

on error goto 0
Set xclSheet = xclwbk.Worksheets(1)

xclApp.Visible = True
xclapp.DisplayAlerts = false

xclapp.ActiveWorkbook.Close


Set xclwbk = Nothing
Set xclsheet = Nothing
'xclapp.Quit
set xclapp = Nothing

问候,脚本人

关于excel - 导出的文件在宏完成后打开 - 不需要,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40729968/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com