Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 宏完成后将打开导出的文件-不需要_Excel_Vba - Fatal编程技术网

Excel 宏完成后将打开导出的文件-不需要

Excel 宏完成后将打开导出的文件-不需要,excel,vba,Excel,Vba,我有一些VBA代码,可以将SAP数据导出到.XLSX文件,然后将该文件导入excel。导入文件后,我有执行许多其他操作的代码(例如解析和组织数据、计算单元格等)。宏完成后,导出的SAP.XLSX文件将打开,我不希望它打开 我尝试过使用Kill函数,它成功地做到了,但是在宏的末尾,它没有打开文件,而是显示了一条关于找不到文件的消息,这很有意义 我尝试在宏完成之前关闭该文件,但这也会导致错误,因为该文件实际上没有打开 我尝试在宏完成之前打开并关闭文件,它成功地完成了这一操作,但在宏结束时,文件再次打

我有一些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连接关闭后结束代码,文件将在最后自动打开。 我看过其他帖子也有同样的问题,但没有确切的答案。希望这是清楚的


提前感谢您的反馈,

我已经试着按照我在评论中解释的做了。它不是很整洁,我无法测试。 我只修改了几行来整理一些东西,我认为在文件数据部分的Insert.xlsx中不需要这一行。 让我知道你怎么样了

Sub OriginalSub()
  'Opens SAP connection
  [snip as no change]

  'Closes SAP connection
  [snip as no change]

  Call ImportData()

  Kill "C:\Users\" & Environ("Username") & "\Downloads\SAP_export.XLSX"

End Sub


Sub ImportData()

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

'Insert .xlsx file data
    ThisWorkbook.Worksheets("SMS Input").Range("A6").Select
    [snip as no changes from here by me]

    Workbooks("SAP_export.XLSX").Close savechanges:=False

End Sub

今天我想多写一点,这样我的答案就不会被删除

我为这个问题提供了以下解决方法:

'old codes
. . .
Session.findById("wnd[1]/usr/ctxt[1]").Text = "SAP_export.XLSX"
Session.findById("wnd[1]/tbar[0]/btn[11]").press
'new codes
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
 session.findById("wnd[0]").iconify
 session.findById("wnd[0]").maximize
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

'old codes
'Closes SAP connection
Set Session = Nothing
connection.CloseSession ("ses[0]")
Set connection = Nothing
. . . 
问候,, 编剧

进一步建议:

在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
...
' 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:\tmp"
Session.findById("wnd[1]/usr/ctxt[1]").Text = "SAP_export.XLSX"
Session.findById("wnd[1]/tbar[0]/btn[11]").press


Dim xlApp As Object
Application.Wait Now + TimeSerial(0, 0, 5)

Set xlApp = GetObject("c:\tmp\SAP_export.XLSX").Application

xlApp.Workbooks(1).Close False
'xlApp.Quit
...
SAP_工作簿_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
问候,,
ScriptMan

如果还有人需要帮助,我的解决方案就在这里。 我创建了一个子系统,以杀死我导出的许多文件。 thx编剧


所以我读了很多关于这个问题的书,很多人都想知道为什么。。。 我终于说到点子上了!!是SAP配置中的一项功能。 去右上角看看。。。单击电视>设置>交互>快速信息并使用访问模式。就在那里!设置为“无”!你已经完成了。。。 我从一个用户那里得到了这个消息,他告诉我很多书在最后打开了

我写了一个小程序来解决这个问题,如果有人检查这个,请告诉我:

   Public Sub ConfSAP()

   Set objShell = CreateObject("WScript.Shell")

   reg = "REG_DWORD"



    strRoot_16 = "HKEY_CURRENT_USER\SOFTWARE\SAP\SAPGUI Front\SAP Frontend Server\Customize\BubbleDelay"
strRoot_17 = "HKEY_CURRENT_USER\SOFTWARE\SAP\General\AccMode"
            strModify = objShell.RegWrite(strRoot_16, "00000003", reg)
   strModify = objShell.RegWrite(strRoot_17, "On", "REG_SZ")
                strModify = Null
                strRoot_16 = Null

strRoot_17 = Null

    subfolder = Null 
    reg = Null Set 
    objShell = Nothing 
    End Sub

今天我看到了这个问题的另一个解决方案。我真的很想和你分享

例如:

. . .
'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
...
' 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:\tmp"
Session.findById("wnd[1]/usr/ctxt[1]").Text = "SAP_export.XLSX"
Session.findById("wnd[1]/tbar[0]/btn[11]").press


Dim xlApp As Object
Application.Wait Now + TimeSerial(0, 0, 5)

Set xlApp = GetObject("c:\tmp\SAP_export.XLSX").Application

xlApp.Workbooks(1).Close False
'xlApp.Quit
...

关于ScriptMan,“我有一些VBA代码”如果您有一些代码正在做您不想做的事情,那么共享该代码的[相关部分]可能会很有用。别让我们猜你在干什么。嗨,蒂姆,很抱歉。我添加了一些相关代码来帮助澄清。从SAP打开导出的.XLSX文件似乎是一项自动功能,但直到宏完成。这就是我试图弄明白并阻止发生的事情。谢谢您好,我从SAP导入数据时做了一些事情。我已经将我的划分为多个函数和子例程。也就是说,我的流程成功地从SAP导出了一个文件,然后导入了文件数据,然后删除了该文件,我可以关闭它,但在我的情况下,它只是一个临时文件。也许只是在你的问题部分周围加上“出错时继续下一步”和“出错时转到0”。我没有文件打开或错误的问题,即使没有错误代码。是否可能原始工作表中的某些内容引用了SAP导出中的某些内容?试着走过去看看你是怎么走的。谢谢你,脾气暴躁的船长。您使用什么文件类型导出SAP信息?我有几个宏使用.txt文件导出,没有这个问题。对于这个宏,我需要使用.XLSX格式,因为它对格式化有很大帮助。我在.XLSX被导出到Excel时进行了一步,我可以看到一个新的VBAPProject实例为导出的文件打开,但它在宏完成之前不会打开,并且由于某种原因,我无法关闭该实例。我可以终止它,但宏完成后会弹出消息。我通常使用tab separate,因为它们更容易导入我想要的内容。为什么不考虑拆分代码呢。取出open并将其导入到一个单独的函数中,并将文件名作为参数。然后在函数中关闭它,并在原始子函数中杀死它。这与我实际拥有它的方式非常相似。我有一个主潜艇可以呼叫30个其他潜艇。我尝试过将工作簿(“SAP_export.XLSX”)放在不同的位置和子文件夹中,看看是否有帮助。它仍然返回“下标超出范围”,因为该文件实际上尚未打开。直到运行时完成,它才会打开。仅当我运行代码而不破坏它时,文件才会显示。如果我真的断了,文件最后就不会打开。我尝试了等待时间,甚至使用Ontime事件尝试以编程方式中断运行时,然后重新启动-仍然没有成功。是否正在关闭OLEDB连接和记录集?我不能说我确定他们需要用你的代码来结束,但似乎有什么东西在保持连接并导致问题。如果您尝试在没有OLEDB导入(注释掉)的情况下执行相同的操作,那么它是否有效。如果是这样,至少你知道问题在哪里,然后