【问题标题】:What type of object is returned by GetObject("SAPGUI")?GetObject("SAPGUI") 返回什么类型的对象?
【发布时间】:2016-07-09 01:59:21
【问题描述】:

TL;DR ---------------

如果我在初始化脚本中正确声明了变量,我将无法附加到 SAPFEWSELib.GuiApplication 的“连接”对象。 MyApplication.Children(0) 集合是空的,但如果我注释掉声明块,它就可以工作!?

TL;DR ---------------

我正在尝试在我的 SAP 客户端和我的 excel 应用程序之间建立更可靠的连接。

我当前的问题是建立连接。 SAP客户端在使用脚本录制功能时提供了一个示例vbscript。

If Not IsObject(MyApplication) Then
    Debug.Print "yep"
   Set SapGuiAuto = GetObject("SAPGUI")
   Set MyApplication = SapGuiAuto.GetScriptingEngine
End If
If Not IsObject(Connection) Then
   Set Connection = MyApplication.Children(0)
End If
If Not IsObject(session) Then
   Set session = Connection.Children(0)
End If

stackoverflow 上的另一个问题接近答案,但没能解决 stackoverflow.com/questions/24738998/vba-using-variables-that-were-not-declared

原始代码为here,我稍作修改,使其可以在excel/vba 中使用。 (我删除了 IsObject(Wscript),我不得不用 MyApplication 替换 Application)

我要做的第一件事是显式声明所有变量。

使用我在以下地址获得的代码 stackoverflow.com/questions/19783180/get-list-of-all-properties-for-an-object 我使用“TypeLib 信息”和函数 TypeName() 来确定每个对象类型。我尝试声明如下

Dim session as GuiSession
Dim MyApplication as GuiApplication
Dim Connection as ISapConnectionTarget
Dim SapGuiAuto as object

我收到用户定义类型未定义错误。

经过一番搜索,我在这个地址找到了部分答案。

scn.sap.com/thread/3254335

我觉得手动添加“C:\Program Files (x86)\SAP\FrontEnd\SAPgui\sapfewse.ocx”引用会很容易中断。如果有更好的方法,请告诉我。

好的,现在我可以像这样声明它了。

Dim MyApplication As SAPFEWSELib.GuiApplication
Dim Connection As SAPFEWSELib.GuiConnection
Dim session As SAPFEWSELib.GuiSession
Dim SapGuiAuto As Object

我不喜欢 SapGuiAuto As Object,因为它并没有真正说明它是什么,而且我不能使用 CTRL+SPACE 来查看这个对象的可用属性和功能(VB 功能之一我不能没有现在就活下去!)

我只知道这个对象有一个 .GetScriptingEngine 函数(方法?)。

在研究写这个问题时,我在 sap.com 论坛上遇到了这个帖子。 scn.sap.com/thread/3448120

这里提到“GetScriptingEngine 是 GuiApplication 类的一个方法”。

所以我尝试了以下声明,它似乎有效。

Dim MyApplication As SAPFEWSELib.GuiApplication
Dim Connection As SAPFEWSELib.GuiConnection
Dim session As SAPFEWSELib.GuiSession
Dim SapGuiAuto As SAPFEWSELib.GuiApplication

现在如果我输入“会话”。出现可能的属性列表。 但是有一个问题!

如果我输入以下行

Debug.Print session.FindById("wnd[0]").Text

它给出了一个错误(虽然它曾经工作得很好!)。 错误是“对象变量或未设置块变量”。

如果我注释掉变量声明,它就可以正常工作!

在未声明会话时使用 TLI 函数我得到以下成员

DumpProperties session.FindById("wnd[0]")

在此处输出 -> pastebin.mozilla.org/8882551

但是如果我在正确声明会话的情况下运行相同的命令,我会得到..同样的错误

所以经过一番研究,结果发现脚本的开头现在不一样了。

If Not IsObject(MyApplication) Then

如果 MyApplication 已使用 Dim MyApplication As SAPFEWSELib.GuiApplication 声明,则不会执行

所以我尝试在没有 IF 的情况下执行命令。

Set MyApplication = SapGuiAuto.GetScriptingEngine
Set Connection = MyApplication.Children(0)
Set session = Connection.Children(0)

在 Set MyApplication = SapGuiAuto.GetScriptingEngine 上出现“对象变量或未设置块变量”错误而失败

解决这个问题的方法是像这样创建一个新的 SapGuiAuto 实例。

Set SapGuiAuto = New SAPFEWSELib.GuiApplication

现在上面的代码执行,直到 Set Connection = MyApplication.Children(0) 失败

错误:“集合的枚举器找不到具有指定索引的元素”

以下行的快速测试显示,.Children 集合为空。

For Each chld In MyApplication.Children: Debug.Print "one exists": Next

如果我当前与 SAP 断开连接,这与我通常会遇到的错误相同,但我已连接并注释掉声明块,解决了问题。

stackoverflow 上的这个答案是不祥的 stackoverflow.com/questions/36751819/sap-gui-scripting-error-the-enumerator-of-the-collection-cannot-find-an-elemen

我不是管理员,现在是周五晚上 10 点,向 IT 询问任何事情都是一场噩梦。希望我不必诉诸于此。

我会在另一台电脑上试试。

刚试过,我得到了同样的东西。在这一点上,我必须认输,如果没有一些帮助或至少睡个好觉,我无法让它工作!

感谢任何建议或 cmets

我发现一些额外的链接对与我在同一路径上的人非常有用。

SAP GUI Scripting API PDF

使用 VBA 调试器发现 SAP GUI 属性和函数 scn.sap.com/docs/DOC-39696

SAP GUI 脚本 API 文档(我无法打开这个文件,但里面有很多好东西) www.sdn.sap.com/irj/scn/go/portal/prtroot/docs/library/uuid/a034a16b-3bfe-2a10-e2bb-8bd880db0b3c

SAP GUI 脚本 API:如何自动化用户交互(不幸的是我的系统缺少“脚本开发工具”) scn.sap.com/docs/DOC-4614

BIBS 功能也可能对您有所帮助,但它在我的系统上不起作用 scn.sap.com/docs/DOC-4612

【问题讨论】:

  • 这篇文章的第一行是你好,但是它似乎只是被论坛机器人修剪了。真没礼貌 !好吧,你好,谁在读这篇文章。

标签: vba sap-gui


【解决方案1】:

当我使用它时,我也会得到 0 个孩子,好像没有连接到 SAP:
Set sapCon = New SAPFEWSELib.GuiApplication

改为使用它实际上可以工作:
Set sapCon = GetObject("SAPGUI").GetScriptingEngine

据此:https://answers.sap.com/questions/12487790/what-are-the-differences-in-vba-methods-to-connect.html?childToView=12494892

【讨论】:

  • 你好,请问 Set SAP = CreateObject("SAP.Functions") 这个远程函数调用如何在没有 UI 的情况下工作,接口文档是什么?
  • @Shodan 您可能应该就此提出一个新问题。这是我在快速搜索 blogs.sap.com/2015/09/18/… 时发现的,它解释了如何设置它以及如何访问代码完成,这至少应该是朝着正确方向迈出的一步。
【解决方案2】:

我自己刚刚遇到这个问题,并找到了“枚举器”错误的解决方案。还将它发布在您提到的引用的stackoverflow帖子中。

改变这个: 设置连接 = Sap_Application.Children(0)

进入这个: 设置连接 = Sap_Application.Children(1)

正如我在那里解释的那样,不知道为什么会发生这种情况,或者这意味着什么,我只是把数字弄乱了,它起作用了。

希望现在还不算晚,或者它可能会帮助其他人。

问候

【讨论】:

  • 谢谢,仍在努力解决这个问题。我希望创建一个“GetSession”函数,为所有其他子和函数返回一个会话对象。如果未启动,我还希望它启动 SAP Logon,如果不存在连接,则使用 openbyconnectionstring。甚至允许多个并发会话运行并让 subs 保留特定会话(我相信它们的编号为 0 到 5,并且只要会话存在,会话编号就会持续存在)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-29
  • 1970-01-01
相关资源
最近更新 更多