【问题标题】:Excel file downloaded from SAP is not getting recognized in my VBA code从 SAP 下载的 Excel 文件在我的 VBA 代码中未得到识别
【发布时间】:2021-04-01 05:34:10
【问题描述】:

我有一个宏代码,它从 SAP 下载一个 excel 文件,发布后它应该对其进行一些数据处理以到达我的最终输出文件。代码下载并打开了 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").Activate 收到错误消息 一旦我手动输入工作表并继续运行代码,它就会工作。

请多多指教。

【问题讨论】:

  • 您确定导出的xlsx 文件在同一个 Excel 会话中打开了吗?请使用任务管理器,看看您可以看到多少个 Excel 会话。并避免使用Windows 和激活。尝试设置变量Set wbE = Workbooks("EXPORT.xlsx")。或者在所有打开的工作簿之间进行迭代并搜索名称为“EXPORT.xlsx”的工作簿。这样的代码能找到吗?
  • 或者,如果此操作需要一些时间,您的代码可能需要等待工作簿下载并打开...
  • 如果您在现有会话中找到它,您可以尝试在所有现有工作簿之间循环搜索讨论中的工作簿,每次迭代延迟一秒(使用Application.Whait)。 For each WB in WorkbooksIf Wb.Name = "EXPORT.xlsx" Then。找到工作簿后,按照我上面的建议和Exit Do 进行设置。如果它在同一个会话中,如果我的上述解释不够清楚,我可以提供一段代码。但现在我要离开办公室,我可以在几个小时内完成,届时我将在家......
  • 它在同一个会话中。如果您可以分享代码,将会很有帮助。
  • 好的,我现在开车..

标签: excel vbscript sap-gui


【解决方案1】:

我有同样的问题,并尝试使用 Sleep API 函数进行循环。它总是超时,因为在代码执行完成之前打开工作簿。如果您在调试模式下逐行运行它,它可以工作,因为您可以在执行下一行代码之前留出时间打开工作簿。但是,如果您让宏继续运行,Excel 会等到宏中的所有代码执行完毕,然后再打开文件。

【讨论】:

    【解决方案2】:

    请尝试下一种方法,等待导出的文件在 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打开呢?

    【讨论】:

    • 在 10 秒内找不到工作簿。我试图只下载文件,但下载后它会自动打开。有没有其他方法可以解决这个问题
    • @stark1208:如果你不回答我的问题,就很难理解发生了什么。我没有安装 SAP 以便自行检查...“如果您手动尝试导出此类工作簿,我还想知道打开此类工作簿需要多长时间”。我的意思是,从你按下导出按钮的那一刻起,直到你看到它打开。这可能需要 12 秒,我们将调整上面的代码。或者只有两个,我们必须寻找另一种方式......
    • 手动导出不到 10 秒。我为此找到了出路。从 SAP 将文件保存为 txt 格式,然后编写一个宏来从文本文件中导入数据。它现在无需任何人工干预即可工作。感谢您的帮助
    【解决方案3】:

    我会试试的

    applicatin.workbooks("Export.xlsx").activate
    

    如果仍然有错误,请运行此代码而不是激活行

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-24
      • 1970-01-01
      • 2021-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多