Ошибка 91 - когда объект, который вы пытаетесь использовать, имеет значение Nothing. Таким образом, хотя эта строка выдает ошибку, на самом деле нет ничего плохого в этой строке. Что нужно исправить, так это как мы получаем объект сеанса.
Я предпочитаю работать с объектом сеанса, чтобы установить функцию, которая позаботится об этом, тогда это всего лишь пара строк кода в вашей основной подфункции / функции. Одна из наших оригинальных функций, которая не хороша, но должна делать то, что вам нужно, выглядит следующим образом ...
Public session As Object
Function GetSession() As Boolean
Dim IE As InternetExplorerMedium
Dim Created_IE As Boolean
Dim Sh As New Shell32.Shell
Dim ShellWindow As Object
Dim OpenWindows As Integer: OpenWindows = 0
Dim OpenSessions As Integer
Dim LoopCount As Integer: LoopCount = 0
Dim SAPSession_Known As Boolean: SAPSession_Known = False
Dim SAPGuiScripting As Object
Dim SAPApplication As Object
Dim SAPConnection As Object
Dim SAPSession As Object
' Loop through all open windows to bring the SAP Portal into focus
For Each ShellWindow In Sh.Windows
' Find the Window with the desired SAP Portal URL
If InStr(1, LCase$(ShellWindow.LocationURL), "com.sap.portal.appintegrator.sap.Transaction") Then
' Count the number of open SAP Sessions
OpenWindows = OpenWindows + 1
End If
DoEvents
Next ShellWindow
Do Until SAPSession_Known = True Or LoopCount > 100
On Error Resume Next
Set SAPGuiScripting = GetObject("SAPGUI")
Set SAPApplication = SAPGuiScripting.GetScriptingEngine
On Error GoTo 0
If OpenWindows = 0 Then
On Error Resume Next
Set SAPConnection = SAPApplication.Children(0)
On Error GoTo 0
On Error Resume Next
Set SAPSession = SAPConnection.Children(0)
On Error GoTo 0
Else
On Error Resume Next
Set SAPConnection = SAPApplication.Children(Int(OpenWindows - 1))
On Error GoTo 0
On Error Resume Next
Set SAPSession = SAPConnection.Children(Int(OpenWindows - 1))
On Error GoTo 0
End If
DoEvents
On Error Resume Next
OpenSessions = SAPApplication.Children.Count
On Error GoTo 0
If (OpenSessions <> 0) And Not (SAPSession Is Nothing) Then SAPSession_Known = True
Loop
On Error Resume Next
AppActivate ("com.sap.portal.appintegrator.sap.Transaction")
On Error GoTo 0
If SAPSession Is Nothing Then
MsgBox "SAP session not found"
GetSession = False
Else
Set session = SAPSession
GetSession = True
End If
End Function
Затем я запустил бы свой макрос, проверив, уже установлен ли сеанс SAP и не обнаружил ли его, прежде чем продолжить с остальной частью программы. Там, где человек не существует, он заканчивает программу.
Sub RunScript()
Dim SAPOpen As Boolean
If session Is Nothing Then
SAPOpen = SAPGetSession
If SAPOpen = False Then
MsgBox "No SAP session could be found." & vbNewLine & _
"Open a SAP session and try again."
End
End If
End If
With session
.findById("wnd[0]").maximize
.StartTransaction "ME21N" ' I prefer this for starting new transactions
'.findById("wnd[0]").sendVKey 0 ' and it means we can avoid this line
.findById("wnd[0]/tbar[0]/btn[12]").press
End With
End Sub
Я надеюсь, что это помогает, и я надеюсь, что это работает. Дайте нам знать, как вы идете.