无法通过 ID 找到该控件。 SAP GUI 错误?

The control could not be found by id. SAP GUI bug?

我正在尝试使用脚本自动提取 SAP 数据。我面临的问题是 SAP 中记录的脚本在我 运行 时不起作用,当我使用 findById("id") 方法时它出现无法找到,但是选项卡在那里。

想法是在选项卡之间移动(使用 session.findById("id").Select)以提取该面板中的信息。使用po的列表,做一个循环,提取信息,很简单。

但是,这些标签不是随机找到的。有时有效,有时找不到。所有 PO(如果我手动操作)都有包含数据的选项卡,但在脚本中它不起作用。

例如:

红色框是我要尝试的选项卡 select 录制脚本的输出(只是在选项卡之间移动):

    If Not IsObject(application) Then
       Set SapGuiAuto  = GetObject("SAPGUI")
       Set application = SapGuiAuto.GetScriptingEngine
    End If
    If Not IsObject(connection) Then
       Set connection = application.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 application, "on"
    End If
    session.findById("wnd[0]").resizeWorkingPane 183,24,false

session.findById("wnd[0]/usr/subSUB0:SAPLMEGUI:0015/subSUB3:SAPLMEVIEWS:1100/subSUB2:SAPLMEVIEWS:1200/subSUB1:SAPLMEGUI:1301/subSUB2:SAPLMEGUI:1303/tabsITEM_DETAIL/tabpTABIDT13").select
' Extract info
session.findById("wnd[0]/usr/subSUB0:SAPLMEGUI:0019/subSUB3:SAPLMEVIEWS:1100/subSUB2:SAPLMEVIEWS:1200/subSUB1:SAPLMEGUI:1301/subSUB2:SAPLMEGUI:1303/tabsITEM_DETAIL/tabpTABIDT15").select
' Extract info
session.findById("wnd[0]/usr/subSUB0:SAPLMEGUI:0015/subSUB3:SAPLMEVIEWS:1100/subSUB2:SAPLMEVIEWS:1200/subSUB1:SAPLMEGUI:1301/subSUB2:SAPLMEGUI:1303/tabsITEM_DETAIL/tabpTABIDT18").select
' Extract info

错误:

我正在使用:

我的理论,标签是隐藏的,找不到它,我必须使用箭头移动,但是当我在制作脚本录制时使用箭头时,它根本就没有将它们添加到代码中。

对不起我的英语,提前感谢您的时间。

对于这种现象,我只能提供一个解决方法。

例如:

...
for i = 1 to 99
    on error resume next
    session.findById("wnd[0]/usr/subSUB0:SAPLMEGUI:00" & right("0" & cstr(i),2) & "/subSUB3:SAPLMEVIEWS:1100/subSUB2:SAPLMEVIEWS:1200/subSUB1:SAPLMEGUI:1301/subSUB2:SAPLMEGUI:1303/tabsITEM_DETAIL/tabpTABIDT13").select
    if err.number = 0 then exit for
    on error goto 0
    next
    on error goto 0
' Extract info
for i = 1 to 99
    on error resume next
    session.findById("wnd[0]/usr/subSUB0:SAPLMEGUI:00" & right("0" & cstr(i),2) & "/subSUB3:SAPLMEVIEWS:1100/subSUB2:SAPLMEVIEWS:1200/subSUB1:SAPLMEGUI:1301/subSUB2:SAPLMEGUI:1303/tabsITEM_DETAIL/tabpTABIDT15").select
    if err.number = 0 then exit for
    on error goto 0
    next
    on error goto 0
' Extract info
for i = 1 to 99
    on error resume next
    session.findById("wnd[0]/usr/subSUB0:SAPLMEGUI:00" & right("0" & cstr(i),2) & "/subSUB3:SAPLMEVIEWS:1100/subSUB2:SAPLMEVIEWS:1200/subSUB1:SAPLMEGUI:1301/subSUB2:SAPLMEGUI:1303/tabsITEM_DETAIL/tabpTABIDT18").select
    if err.number = 0 then exit for
    on error goto 0
    next
    on error goto 0
' Extract info

此致, 脚本人

啊是的,我最喜欢的 SAP 屏幕:ME23N。谁知道 SAPLMEGUI:00XX 会是什么!但是,如果您通过名称 找到元素,您就永远不会运行 遇到这个问题。此外,这解决了您不希望出现的选项卡的问题;因为,根据 PO 的行项目,谁知道哪些选项卡可用。

这就是我每次克服这个问题的方法,没有失败

在您的子程序中使用下面的函数。如果选项卡在那里,它将 select 它和 return true 并且您可以继续提取数据。您需要标签文本标签条的名称

您可以轻松找到标签条的名称。看看记录了什么。它有 "tabs" 前缀。

session.findById("wnd[0]/usr/subSUB0:SAPLMEGUI:0015/subSUB3:SAPLMEVIEWS:1100/subSUB2:SAPLMEVIEWS:1200/subSUB1:SAPLMEGUI:1301/subSUB2:SAPLMEGUI:1303/tabsITEM_DETAIL/tabpTABIDT13")

Public Sub Main()

    If IsTabThere("ITEM_DETAIL", "Account Assignment") = True Then
        ' Extract info
    End If

    If IsTabThere("ITEM_DETAIL", "Purchase Order History") = True Then
        ' Extract info
    End If

End Sub

Public Function IsTabThere(ByVal tabStripName As String, ByVal tabText As String) As Boolean

    Dim userArea As Object
    Dim tabStrip As Object
    Dim tabToSelect As Object

    Set userArea = session.FindById("wnd[0]/usr")
    Set tabStrip = userArea.FindByName(tabStripName, "GuiTabStrip").Children

    For Each tabToSelect In tabStrip
        If tabToSelect.Text = tabText Then
            tabToSelect.Select
            IsTabThere = True

            ' Will exit here if the tab was selected and return true
            Exit Function
        End If
    Next

    IsTabThere = False
End Function

希望这会让你开心。祝你好运!

如果您有兴趣让您的脚本更加动态,请查看我对此 post 的回答。我解释了如何开始使用 SAP GUI 脚本 API。

how-to-run-sap-gui-script-from-excel-macro