Ошибка времени выполнения '91' при запуске скрипта vba - PullRequest
0 голосов
/ 05 июля 2019

Я встретил ошибку:

"Переменная объекта или переменная блока не установлена" в строке session.findById ("wnd [0]"). Maximize .

Пожалуйста, помогите мне решить эту проблему.Спасибо

Я попытался выполнить поиск в Интернете, но у нас есть ошибки в другой строке, не знаю, в чем моя проблема.

```Sub RunScript()

Dim session As Object

If Not IsObject(Sapplication) Then
    Set SapGuiAuto = GetObject("SAPGUI")
    Set Sapplication = SapGuiAuto.GetScriptingEngine
End If
If Not IsObject(Connection) Then
    Set Connection = Sapplication.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 Sapplication, "on"
End If
session.findById("wnd[0]").maximize
session.findById("wnd[0]/tbar[0]/okcd").Text = "/NME21N"
session.findById("wnd[0]").sendVKey 0
session.findById("wnd[0]/tbar[0]/btn[12]").press

```End Sub

Я ожидаю, что он запустит SAP, который я открыл.

Ответы [ 2 ]

0 голосов
/ 05 июля 2019

Но вы также можете попробовать следующее:

Sub RunScript()

'Dim session As Object

'If Not IsObject(Sapplication) Then
Set SapGuiAuto = GetObject("SAPGUI")
Set Sapplication = SapGuiAuto.GetScriptingEngine
'End If
'If Not IsObject(Connection) Then
con = 0
Set Connection = Sapplication.Children(Int(con))
'End If
'If Not IsObject(session) Then
ses = 0
Set session = Connection.Children(Int(ses))
'End If
'If IsObject(WScript) Then
'WScript.ConnectObject session, "on"
'WScript.ConnectObject Sapplication, "on"
'End If
session.findById("wnd[0]").maximize
session.findById("wnd[0]/tbar[0]/okcd").Text = "/NME21N"
session.findById("wnd[0]").sendVKey 0
session.findById("wnd[0]/tbar[0]/btn[12]").press

End Sub

С уважением, ScriptMan

0 голосов
/ 05 июля 2019

Ошибка 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

Я надеюсь, что это помогает, и я надеюсь, что это работает. Дайте нам знать, как вы идете.

...