Excel / VBA,连接到SAP,GetObject(“SAPGUI”)返回什么types的对象?

TL; DR —————

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

TL; DR —————

我正在尝试在我的SAP客户端和我的Excel应用程序之间创build一个更可靠的连接。

我目前的问题是build立连接。 SAP客户端在使用其脚本loggingfunction时提供一个示例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

原来的代码在这里 ,我已经稍微修改,所以它可以在Excel / VBA的工作。 (我删除了IsObject(Wscript),我不得不用MyApplicationreplaceApplication)

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

使用代码我得到了以下地址stackoverflow.com/questions/19783180/get-list-of-all-properties-for-an-object我用“TypeLib信息”和函数TypeName()来确定每个对象types。 我试着宣布如下

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

我得到用户定义types未定义的错误。

经过一番search,我在这个地址find了部分答案。

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作为对象,因为它没有真正说出它是什么,我不能使用CTRL +空格来查看此对象的可用属性和function(我现在无法生存的VBfunction之一!)

我所知道的这个对象是它有一个.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 

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

如果我input下面的行

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

它给出了一个错误(虽然它曾经工作得很好!)。 错误是“Object variable or With bock variable not set”。

如果我注释掉variables声明,它就可以工作了!

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

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

在这里输出 – > pastebin.mozilla.org/8882551

但如果我运行相同的命令正确声明会话我得到..相同的错误

所以经过多一点的研究,事实certificate,脚本的开始现在不一样了。

 If Not IsObject(MyApplication) Then 

如果MyApplication已经用Dim MyApplication声明为SAPFEWSELib.GuiApplication,将不会执行

所以我试图执行没有IF的命令。

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

在Set MyApplication = SapGuiAuto.GetScriptingEngine上出现“Object variable or With bock variable not set”错误

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

 Set SapGuiAuto = New SAPFEWSELib.GuiApplication 

现在上面的代码执行,直到它失败在设置连接= MyApplication.Children(0)

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

以下行的快速testing显示.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

我不是pipe理员,星期五晚上10点,问问什么是噩梦。 希望我不必诉诸于此。

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

刚刚尝试,我得到同样的事情。 在这一点上,我必须抛出毛巾,没有一些帮助或至less晚上rest,我不能得到这个工作!

感谢您的任何build议或意见

我发现一些额外的链接对于和我一样的人来说非常有用。

SAP GUI脚本API PDF

使用VBAdebugging器来发现SAP GUI属性和functionscn.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:如何自动化用户交互(不幸的是,我的系统缺less“脚本开发工具”)scn.sap.com/docs/DOC-4614

另外,BIBSfunction可能对您有所帮助,但是它不能在我的系统上运行scn.sap.com/docs/DOC-4612

我只是自己来讨论这个问题,并find了一个“枚举器”错误的解决scheme。 还张贴在你提到的引用的stackoverflow后。

改变这个: Set Connection = Sap_Application.Children(0)

进入这个: Set Connection = Sap_Application.Children(1)

正如我在那里解释,不知道为什么会发生这种情况,或者说这意味着什么,我只是搞砸了数字,它的工作。

希望这不是太晚,或者它可以帮助别人。

问候