从SAP下载的Excel文件在我的VBA代码中无法识别

从SAP下载的Excel文件在我的VBA代码中无法识别,excel,vbscript,sap-gui,Excel,Vbscript,Sap Gui,我有一个宏代码,可以从SAP下载一个excel文件,post应该对其进行一些数据操作,以获得最终的输出文件。代码将下载并打开excel文件。但每次该对象超出范围时,它仍会显示一个错误。一旦我单击excel工作表中的某个地方并继续运行我的代码,它就可以完美地工作了。如何避免这种人工干预。请告知 If Not IsObject(App) Then Set SapGuiAuto = GetObject("SAPGUI") Set App = SapGuiAuto.Get

我有一个宏代码,可以从SAP下载一个excel文件,post应该对其进行一些数据操作,以获得最终的输出文件。代码将下载并打开excel文件。但每次该对象超出范围时,它仍会显示一个错误。一旦我单击excel工作表中的某个地方并继续运行我的代码,它就可以完美地工作了。如何避免这种人工干预。请告知

If Not IsObject(App) Then
   Set SapGuiAuto = GetObject("SAPGUI")
   Set App = SapGuiAuto.GetScriptingEngine
End If
If Not IsObject(Connection) Then
   Set Connection = App.Children(0)
End If
If Not IsObject(session) Then
   Set session = Connection.Children(0)
End If
If IsObject(WScript) Then
   WScript.ConnectObject session, "on"
   WScript.ConnectObject App, "on"
End If
session.findById("wnd[0]").maximize
session.findById("wnd[0]/usr/txtRSYST-BNAME").Text = "stark"
session.findById("wnd[0]/usr/pwdRSYST-BCODE").Text = "*****"
session.findById("wnd[0]/usr/pwdRSYST-BCODE").SetFocus
session.findById("wnd[0]/usr/pwdRSYST-BCODE").caretPosition = 12
session.findById("wnd[0]").sendVKey 0
session.findById("wnd[0]/tbar[0]/okcd").Text = "ABC01"
session.findById("wnd[0]").sendVKey 0
session.findById("wnd[0]/usr/radMADE").SetFocus
session.findById("wnd[0]/usr/radMADE").Select
session.findById("wnd[0]/mbar/menu[0]/menu[0]").Select
session.findById("wnd[0]/mbar/menu[0]/menu[3]/menu[1]").Select
session.findById("wnd[1]/usr/ctxtDY_PATH").Text = "C:\Users\Stark\Desktop\SAP Scripting"
session.findById("wnd[1]/usr/ctxtDY_PATH").SetFocus
session.findById("wnd[1]/usr/ctxtDY_PATH").caretPosition = 44
session.findById("wnd[1]/tbar[0]/btn[0]").press

Windows("EXPORT.xlsx").Activate
Range("AA1").Select
    ActiveCell.FormulaR1C1 = "1"
    Range("AA1").Select
    Selection.Copy
    Range("B2:D2").Select
    Range(Selection, Selection.End(xlDown)).Select
该文件始终作为EXPORT.xlsx下载。我在
Windows(“EXPORT.xlsx”)上遇到错误。激活

一旦我手动输入工作表并继续运行代码,它就会工作

请告知。

我会试试

If Not IsObject(App) Then
   Set SapGuiAuto = GetObject("SAPGUI")
   Set App = SapGuiAuto.GetScriptingEngine
End If
If Not IsObject(Connection) Then
   Set Connection = App.Children(0)
End If
If Not IsObject(session) Then
   Set session = Connection.Children(0)
End If
If IsObject(WScript) Then
   WScript.ConnectObject session, "on"
   WScript.ConnectObject App, "on"
End If
session.findById("wnd[0]").maximize
session.findById("wnd[0]/usr/txtRSYST-BNAME").Text = "stark"
session.findById("wnd[0]/usr/pwdRSYST-BCODE").Text = "*****"
session.findById("wnd[0]/usr/pwdRSYST-BCODE").SetFocus
session.findById("wnd[0]/usr/pwdRSYST-BCODE").caretPosition = 12
session.findById("wnd[0]").sendVKey 0
session.findById("wnd[0]/tbar[0]/okcd").Text = "ABC01"
session.findById("wnd[0]").sendVKey 0
session.findById("wnd[0]/usr/radMADE").SetFocus
session.findById("wnd[0]/usr/radMADE").Select
session.findById("wnd[0]/mbar/menu[0]/menu[0]").Select
session.findById("wnd[0]/mbar/menu[0]/menu[3]/menu[1]").Select
session.findById("wnd[1]/usr/ctxtDY_PATH").Text = "C:\Users\Stark\Desktop\SAP Scripting"
session.findById("wnd[1]/usr/ctxtDY_PATH").SetFocus
session.findById("wnd[1]/usr/ctxtDY_PATH").caretPosition = 44
session.findById("wnd[1]/tbar[0]/btn[0]").press

Windows("EXPORT.xlsx").Activate
Range("AA1").Select
    ActiveCell.FormulaR1C1 = "1"
    Range("AA1").Select
    Selection.Copy
    Range("B2:D2").Select
    Range(Selection, Selection.End(xlDown)).Select
applicatin.workbooks("Export.xlsx").activate
如果仍然存在错误,请运行此代码而不是激活行

Dim i As Long
For i = 1 To Application.Workbooks.Count
    Debug.Print Application.Workbooks(i).Name
Next

这样,您就可以在激活代码行中获得需要使用的工作簿名称。

请尝试下一种方法,等待导出的文件加载到Excel中。VBA打开工作簿时,会等待其打开,但如果未直接打开代码,请在加载/打开导出的工作簿之前尝试查找该工作簿:

Sub testCheckOpenSAPExportedWb()
 'your existing code
 '...
 Session.findById("wnd[1]/tbar[0]/btn[0]").press
  
  Dim wb As Workbook, wbSAP As Workbook, lastRow As Long, count As Long
  
  'loop until the exported workbook is found. If more then 10 iteration sets passed, the loop is exited
  Do While wbSAP Is Nothing
    For Each wb In Workbooks
        count = count + 1
        If wb.Name = "EXPORT.xlsx" Then
            Set wbSAP = wb: Exit Do
        End If
        Application.Wait Now + TimeValue("0:00:01")
        If coumn >= 10 Then MsgBox "The workbook coould not be found in 10 seconds...": Exit Do
    Next
  Loop
  If wbSAP Is Nothing Then Exit Sub
  
    MsgBox "The exported workbook has been found..."
    wbSAP.Range("AA1").FormulaR1C1 = "1" 'I do not understand what you want doing here...
    lastRow = wbSAP.Range("B" & rows.count).End(xlUp).row
    wbSAP.Range("B2:D" & lastRow).Copy 'then you can paste it wherever you need...
    'do here whatever you need with the copied range...
    '...
End Sub
请测试并发送一些反馈。
我还想知道,如果您尝试手动导出这样一个工作簿,打开它需要多少时间。那么,是否可以只下载计算机中的某个位置的文件,然后让VBA打开它?

是否确定导出的
xlsx
文件在同一Excel会话中打开?请使用任务管理器,查看可以看到多少Excel会话。并避免使用
Windows
和激活。尝试设置一个变量
Set wbE=workbook(“EXPORT.xlsx”)
。或者在所有打开的工作簿之间迭代并搜索名为“EXPORT.xlsx”的工作簿。这样的代码可以找到它吗?或者您的代码需要等待工作簿下载并打开,如果此操作需要一些时间…如果您在现有会话中找到它,您可以尝试在所有现有工作簿之间循环搜索讨论中的工作簿,每次迭代延迟一秒钟(使用
Application.Whait
)<代码>用于工作簿中的每个WB
<代码>如果Wb.Name=“EXPORT.xlsx”则
。找到工作簿后,按照我上面的建议进行设置,然后
退出Do
。如果是在同一个会话中,如果我上面的解释不够清楚,我可以帮助编写一段代码。但现在我要离开办公室,我可以在几个小时内完成,那时我将在家里…这是在同一个会议。如果你能分享一段代码,那将很有帮助。好的,我现在开车。10秒内找不到工作簿。我试着下载文件,但下载后会自动打开。还有别的办法吗out@stark1208当前位置如果你不回答我的问题,就很难理解发生了什么。我没有安装SAP以便自己检查。。。“我还想知道,如果您尝试手动导出这样的工作簿,打开它需要多少时间。”。我的意思是,从你按下导出按钮的那一刻起,直到你看到它打开为止。这可能需要12秒,我们将修改上述代码。或者只有两个,我们必须寻找另一种方法…手动导出它所需的时间少于10秒。我找到了解决办法。从SAP将文件保存为txt格式,然后编写宏从文本文件导入数据。它现在可以在没有任何手动干预的情况下工作。谢谢你的帮助