Когда в графический интерфейс SAP отправляется команда, например SAPsession.FindById("wnd[0]").resizeWorkingPane(170, 25, False)
, и возникает ошибка, я хотел бы зарегистрировать ошибку и позволить сценарию продолжить работу после ввода пользователя (при необходимости), чтобы исправить ошибку. Далее я хочу использовать журнал для проверки ошибок и их исправления.
Я думал сделать это с помощью дополнительного модуля, который обрабатывает команду SAP GUI и улавливает ошибку, как показано ниже.
Я знаю, что приведенный ниже код вообще не тренируется, но это просто иллюстрация того, чего я хотел бы достичь.
Спасибо!
Private sub DoSomethingInSAP()
SAPCommand(SAPsession.FindById("wnd[0]").resizeWorkingPane(170, 25, False))
SAPCommand(SAPsession.FindById("wnd[0]/tbar[0]/okcd").text = "/nsu3")
SAPCommand(SAPsession.FindById("wnd[0]").sendVKey(0))
End Sub
Private sub SAPCommand(input as ?????) '//SAPCommand to be executed
try
Run SAPCommand
Catch ex as Exception
Log("Error: " & input & vbCRLF & ex.tostring)
msgbox("First fix the error for command: " & vbCRLF & input & vbCRLF & "Next: Click 'Ok' to continue")
end try
end sub
Я бы предложил что-то вроде следующего:
Private Sub DoSomethingInSAP()
On Error GoTo error
SAPsession.FindById("wnd[0]").resizeWorkingPane(170, 25, False)
SAPsession.FindById("wnd[0]/tbar[0]/okcd").Text = "/nsu3"
SAPsession.FindById("wnd[0]").sendVKey (0)
Exit Sub
error:
Log("Error: " & input & vbCRLF & ex.tostring)
MsgBox("First fix the error for command: " & vbCRLF & input & vbCRLF & "Next: Click 'Ok' to continue")
Resume Next
End Sub
Если возникает ошибка с первым FindById, управление переходит к блоку ошибок, где вы можете вести журнал и пользовательский ввод. Resume Next
— ключевой элемент вашего сценария. Он вернет управление оператору, следующему за оператором, вызвавшим ошибку, в данном случае второму FindById.
Минус этого подхода заключается в том, что вы не будете знать, какая команда вызвала ошибку при регистрации и пользовательском вводе.
Вот один из способов сделать это, но вам нужно будет добавить номера строк к каждой строке кода, что может вызвать ошибку.
Вам также нужно будет «доверить доступ к проекту VB» в настройках Excel (?).
Совет: Найдите номер строки ошибки в VBA
Стоит отметить, что если ошибка возникает в ненумерованной строке, то Erl
вернет номер из самой последней нумерованной строки (или ноль, если цифры не использовались).
Sub Tester()
10 On Error GoTo haveError:
20 Debug.Print "Before error"
30 Debug.Print 1 / 0
40 Debug.Print "After error"
Exit Sub
haveError:
If MsgBox("Error '" & Err.Description & "' with:" _
& vbLf & vbLf & GetLine("Module1", "Tester", Erl) & _
vbLf & vbLf & "Continue?", vbYesNo, "Error") <> vbYes Then Exit Sub
Resume Next
End Sub
'return a numbered a line of code from a named module and method
Function GetLine(module, proc, lineNum)
Const vbext_pk_Proc = 0
Dim m As Object, lStart As Long, lEnd As Long, l As Long, txt
Set m = ThisWorkbook.VBProject.VBComponents(module).CodeModule
lStart = m.ProcStartLine(proc, vbext_pk_Proc)
lEnd = lStart + m.ProcCountLines(proc, vbext_pk_Proc)
For l = lStart To lEnd
txt = Trim(m.Lines(l, 1))
If txt Like lineNum & " *" Then
GetLine = txt
Exit Function
End If
Next l
GetLine = "Line number " & line & " not found"
End Function
Вы действительно используете VBA?