Как сделать цикл в сценарии SAP VBA

У меня проблема со скриптом VBA SAP. У меня есть данные в Excel, и я хочу выполнить код транзакции IW41, скопировав и вставив данные из Excel. У меня есть все данные, такие как даты, количество заказов, кто это сделал и т. д., в Excel, и я хочу автоматизировать их. Я сделал цикл для переменной i, но получаю ошибку и не могу ее исправить.

Ошибка :

Ошибка выполнения «619»: ошибка, определяемая приложением или объектом.

Код предоставлен ниже.

Можете ли вы дать мне несколько профессиональных советов или помочь мне исправить это?

Экран в IW41, где возникает ошибка: введите здесь описание изображения

Код :

Sub ConfirmPM_Nots()

    SystemName = "CCP"          'change as needed or use a variable
Transaction = "SESSION_MANAGER"      'change as needed or use a variable

On Error GoTo ErrorHandler:
If Not IsObject(Sap_Applic) Then
   Set SapGuiAuto = GetObject("SAPGUI")
   Set Sap_Applic = SapGuiAuto.GetScriptingEngine
End If
On Error GoTo 0
koniec:
qConnections = Sap_Applic.Connections.Count
If qConnections = 0 Then
    MsgBox "No connection to SAP"
    End
End If

bSession = False
For iConnectionCounter = 0 To qConnections - 1
    Set Connection = Sap_Applic.Children(Int(iConnectionCounter))
    If Not Connection.Description = "" Then
    qSessions = Connection.Children.Count
        For iSessionCounter = 0 To qSessions - 1
            Set session = Connection.Children(Int(iSessionCounter))
        If session.info.SystemName <> SystemName Then Exit For
            If session.info.Transaction = Transaction Then
                bSession = True
                Exit For
            End If
        Next
    End If
    If bSession Then Exit For
Next

If Not bSession Then
    MsgBox SystemName & " not available or free session not available"
    End
End If

Do
i = 1
session.findById("wnd[0]").resizeWorkingPane 128, 37, False
session.findById("wnd[0]/tbar[0]/okcd").Text = "iw41"
session.findById("wnd[0]").sendVKey 0

Order = Cells(i, 1)
b = Cells(i, 2)
c = Cells(i, 3)
d = Cells(i, 4)

session.findById("wnd[0]/usr/ctxtCORUF-AUFNR").Text = Order
session.findById("wnd[0]/usr/ctxtCORUF-AUFNR").caretPosition = 7
session.findById("wnd[0]").sendVKey 0
session.findById("wnd[0]/usr/tblSAPLCORUTC_3100/txtAFVGD-VORNR[1,0]").SetFocus
session.findById("wnd[0]/usr/tblSAPLCORUTC_3100/txtAFVGD-VORNR[1,0]").caretPosition = 2
session.findById("wnd[0]").sendVKey 2
session.findById("wnd[0]/usr/chkAFRUD-AUERU").Selected = True
session.findById("wnd[0]/usr/chkAFRUD-LEKNW").Selected = True
session.findById("wnd[0]/usr/ctxtAFRUD-ISDD").Text = c
session.findById("wnd[0]/usr/txtAFRUD-IDAUR").Text = b
session.findById("wnd[0]/usr/ctxtAFRUD-IEDD").Text = c
session.findById("wnd[0]/usr/txtAFRUD-LTXA1").Text = d
session.findById("wnd[0]/usr/txtAFRUD-LTXA1").SetFocus
session.findById("wnd[0]/usr/txtAFRUD-LTXA1").caretPosition = 10

session.findById("wnd[0]/tbar[0]/btn[11]").press
   i = i + 1
Loop

Exit Sub

ErrorHandler:
MsgBox "No connection to SAP"
End

End Sub

person neider1233    schedule 14.08.2020    source источник
comment
Худший снимок сделать будет сложно, я думаю... Мы не видим желтую линию, которая возвращает ошибку, которая важнее, чем сама ошибка. Можете ли вы отредактировать свой вопрос и скопировать строку, возвращающую ошибку?   -  person FaneDuru    schedule 14.08.2020
comment
привет, я сделал это, чтобы сделать цикл, но он падает на последней записи В ЭТОМ МЕСТЕ: i .stack.imgur.com/IowTh.png Плюс у меня есть вопрос, как остановить цикл, когда записей не осталось?   -  person neider1233    schedule 14.08.2020
comment
Как этот цикл должен завершиться? У вас нет условия While или Until и нет Exit Do или Exit Sub в самом цикле. Этот цикл будет работать до тех пор, пока ваша программа не выйдет из строя.   -  person John Coleman    schedule 14.08.2020
comment
Он не может остановиться на 5 строках кода... Попробуйте внести следующую модификацию в свой VBE: Инструменты -> Параметры -> Общие (вкладка) и установите флажок Разбить модуль класса.   -  person FaneDuru    schedule 14.08.2020
comment
Ошибка ibb.co/L8vnq14 на следующем пути: session.findById(wnd[0]/usr/tblSAPLCORUTC_3100 /txtAFVGD-VORNR[1,0]).SetFocus   -  person neider1233    schedule 14.08.2020
comment
я думал, и я знаю, почему он падает на setfocus. Потому что когда вы подтверждаете задачи, он нажимает количество операций (setFocus), затем нажимает все данные. Но когда это последняя операция в заказе, и вы делаете iw41-›заказ-›, он показывает меню подтверждения без выбора операции. Вы знаете, как я могу это исправить?   -  person neider1233    schedule 14.08.2020
comment
После сохранения (wnd[0]/tbar[0]/btn[11]) вы покидаете транзакцию и вам необходимо повторно войти в транзакцию.   -  person Storax    schedule 14.08.2020


Ответы (1)


"iw41" (от session.findById("wnd[0]/tbar[0]/okcd").Text = "iw41") работает только в том случае, если текущий экран является начальным меню. OK-код "/niw41" будет работать всегда! Так что этот код может работать (непроверенный):

Do
i = 1
' session.findById("wnd[0]").resizeWorkingPane 128, 37, False
' iw41 only works in the start menu. OK-Code /niw41 will always work!
session.findById("wnd[0]/tbar[0]/okcd").Text = "/niw41"
session.findById("wnd[0]").sendVKey 0

Order = Cells(i, 1)
b = Cells(i, 2).value
c = Cells(i, 3).value
d = Cells(i, 4).value

session.findById("wnd[0]/usr/ctxtCORUF-AUFNR").Text = Order
' session.findById("wnd[0]/usr/ctxtCORUF-AUFNR").caretPosition = 7
session.findById("wnd[0]").sendVKey 0
session.findById("wnd[0]/usr/tblSAPLCORUTC_3100/txtAFVGD-VORNR[1,0]").SetFocus
' session.findById("wnd[0]/usr/tblSAPLCORUTC_3100/txtAFVGD-VORNR[1,0]").caretPosition = 2
session.findById("wnd[0]").sendVKey 2
session.findById("wnd[0]/usr/chkAFRUD-AUERU").Selected = True
session.findById("wnd[0]/usr/chkAFRUD-LEKNW").Selected = True
session.findById("wnd[0]/usr/ctxtAFRUD-ISDD").Text = c
session.findById("wnd[0]/usr/txtAFRUD-IDAUR").Text = b
session.findById("wnd[0]/usr/ctxtAFRUD-IEDD").Text = c
session.findById("wnd[0]/usr/txtAFRUD-LTXA1").Text = d
' session.findById("wnd[0]/usr/txtAFRUD-LTXA1").SetFocus
' session.findById("wnd[0]/usr/txtAFRUD-LTXA1").caretPosition = 10

session.findById("wnd[0]/tbar[0]/btn[11]").press
   i = i + 1
Loop

Я также прокомментировал строки с помощью resizeWorkingPane, caretPosition и SetFocus, потому что обычно это не требуется. resizeWorkingPane изменит размер экрана SAPGUI, а caretPosition — это положение курсора в текстовом поле. Иногда необходимо, если вы хотите, например, заменить текст. Но в данном случае точно нет.

person Storax    schedule 14.08.2020