Запуск двух вспомогательных модулей VBA с использованием метода вызова

#excel #vba #sap

#excel #vba #sap-графический интерфейс

Вопрос:

Я написал / записал два отдельных макроса: один, который отправляется в SAP для загрузки некоторой информации, а другой, который затем берет загруженную информацию и извлекает / форматирует ее в мою исходную электронную таблицу.

Оба макроса отлично выполняются сами по себе. Проблема, с которой я сталкиваюсь, заключается в том, что когда я пытаюсь вызвать макрос ConnectToSAPGUI в макросе pulldemand, код прерывается при попытке чтения export.XLSX и говорит, что нижний индекс находится вне диапазона.

Я не понимаю, где происходит отключение. Сначала я подумал, что макрос, возможно, выполняется слишком быстро для сохранения загруженного файла из SAP, поэтому я поставил 5-секундную паузу в коде, но это не решило проблему.

Приветствуются любые предложения о том, где я ошибаюсь, и что я могу сделать, чтобы это исправить.

PS: это моя первая попытка использовать макрос для взаимодействия с SAP. Код, который я использовал для этого, взят из других руководств, которые я нашел в Интернете.

 Sub ConnectToSAPGUI()

    'Catch and redirect errors in case SAP GUI is not
    'open or not accessible
    On Error GoTo NotConnected
    'Get the SAP GUI Scripting object
    Set SapGuiAuto = GetObject("SAPGUI")
    'Get the currently running SAP GUI
    Set SAPApp = SapGuiAuto.GetScriptingEngine
    'Get the first system that is currently connected
    Set SAPCon = SAPApp.Children(0)
    'Get the first session (window) on that connection
    Set session = SAPCon.Children(0)
    'Return to regular error handling
    On Error GoTo 0

    'Your code here
    session.findById("wnd[0]").maximize
    session.findById("wnd[0]/tbar[0]/okcd").Text = "/nyscmd04"
    session.findById("wnd[0]").sendVKey 0
    session.findById("wnd[0]/usr/ctxtS_MATNR-LOW").Text = Range("B1")
    session.findById("wnd[0]/usr/ctxtS_WERKS-LOW").Text = Range("B2")
    session.findById("wnd[0]/usr/ctxtS_DAT00-LOW").Text = Range("B3")
    session.findById("wnd[0]/usr/ctxtS_DAT00-HIGH").Text = Range("B5")
    session.findById("wnd[0]/usr/ctxtS_DAT00-HIGH").SetFocus
    session.findById("wnd[0]/usr/ctxtS_DAT00-HIGH").caretPosition = 8
    session.findById("wnd[0]/tbar[1]/btn[8]").press
    session.findById("wnd[0]/usr/cntlGRID1/shellcont/shell").setCurrentCell 9, "MAKTX"
    session.findById("wnd[0]/usr/cntlGRID1/shellcont/shell").selectedRows = "9"
    session.findById("wnd[0]/usr/cntlGRID1/shellcont/shell").contextMenu
    session.findById("wnd[0]/usr/cntlGRID1/shellcont/shell").selectContextMenuItem "amp;XXL"
    session.findById("wnd[1]/tbar[0]/btn[0]").press
    session.findById("wnd[1]/tbar[0]/btn[11]").press

    Set session = Nothing

    'Exception handling in case SAP GUI is not
    'open or not accessible
    Exit Sub

NotConnected:
MsgBox "Please log into SAP first.", vbCritical

End Sub





Sub pulldemand()

'Call ConnectToSAPGUI

Application.Wait (Now   TimeValue("0:00:05"))

    Windows("export.XLSX").Activate
    Columns("H:H").Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
    Range("H2").FormulaR1C1 = "=DATE(YEAR(RC[-1]),MONTH(RC[-1]),1)"
    Range("H2").AutoFill Destination:=Range("H2:H1642")

    Windows("Deamand Breakdown Report.xlsm").Activate
    Sheets("Sheet2").Select
    Range("B2:ZZ1000000").ClearContents
    Range("B2").FormulaR1C1 = _
        "=SUMIFS([export.XLSX]Sheet1!C13,[export.XLSX]Sheet1!C22,RC1,[export.XLSX]Sheet1!C8,R1C)"
    Range("B2").AutoFill Destination:=Range("B2:S2"), Type:=xlFillDefault
    Range("B2:S2").AutoFill Destination:=Range("B2:S17"), Type:=xlFillDefault
    Range("B2:S17").Select
    Selection.Copy
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False

    Windows("export.XLSX").Close (False)
    Sheets("Sheet2").Activate
    Range("A1").Select
    MsgBox ("Report Generated")

End Sub
  

Комментарии:

1. Если вы получаете сообщение об ошибке, полезно указать, в какой строке возникает ошибка.

2. Call как команда VBA устарела и ее не следует использовать. И не забудьте использовать Option Explicit , это поможет при отладке.

Ответ №1:

Если ваша проблема заключается в ожидании загрузки файла… Я использую это:

 Dim FilePath As String, FileName As String, FindIt As String

FilePath = wb.Path amp; ""
FileName = FilePath  amp; "yourfilename"
FindIt = Dir(FileName ) 
While Len(FindIt) = 0  
  FindIt = Dir(FileName )
Wend