Excel/VBA,连接到SAP,GetObject("SAPGUI")返回什么类型的对象?

Sho*_*dan 7 excel sap vba excel-vba

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
Run Code Online (Sandbox Code Playgroud)

stackoverflow上的另一个问题接近于答案,但是没有达到最低限度.clipoverflow.com/questions/24738998/vba-using-variables-that-were-not-declared

原始代码在这里,我稍微修改了以便它可以在excel/vba中工作.(我删除了IsObject(Wscript),我不得不用MyApplication替换Application)

我想要做的第一件事是明确声明所有变量.

使用代码我在以下地址stackoverflow.com/questions/19783180/get-list-of-all-properties-for-an-object得到我用"类型库信息",功能类型名()来确定每个对象类型.我尝试声明如下

Dim session as GuiSession
Dim MyApplication as GuiApplication
Dim Connection as ISapConnectionTarget
Dim SapGuiAuto as object
Run Code Online (Sandbox Code Playgroud)

我得到用户定义的类型未定义错误.

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

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
Run Code Online (Sandbox Code Playgroud)

我不喜欢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
Run Code Online (Sandbox Code Playgroud)

现在如果我键入"session".出现可能的属性列表.但有个问题 !

如果我键入以下行

Debug.Print session.FindById("wnd[0]").Text
Run Code Online (Sandbox Code Playgroud)

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

如果我注释掉变量声明,它就可以了!

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

DumpProperties session.FindById("wnd[0]")
Run Code Online (Sandbox Code Playgroud)

输出到这里 - > pastebin.mozilla.org/8882551

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

因此,经过一些研究,结果发现脚本的开头现在不起作用.

If Not IsObject(MyApplication) Then
Run Code Online (Sandbox Code Playgroud)

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

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

Set MyApplication = SapGuiAuto.GetScriptingEngine
Set Connection = MyApplication.Children(0)
Set session = Connection.Children(0)
Run Code Online (Sandbox Code Playgroud)

在设置MyApplication = SapGuiAuto.GetScriptingEngine时出现"对象变量或未设置bock变量"错误

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

Set SapGuiAuto = New SAPFEWSELib.GuiApplication
Run Code Online (Sandbox Code Playgroud)

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

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

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

For Each chld In MyApplication.Children: Debug.Print "one exists": Next
Run Code Online (Sandbox Code Playgroud)

如果我目前与SAP断开连接,这通常会得到同样的错误,但是我已连接并注释掉声明块,修复了问题.

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

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

我会试试另一台电脑.

刚试过,我得到同样的东西.在这一点上,我必须放弃,如果没有一些帮助或者至少晚上休息,我不能让它工作!

感谢您的任何建议或意见

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

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 Scripting API:如何自动化用户交互(遗憾的是我的系统缺少"脚本开发工具")scn.sap.com/docs/DOC-4614

此外,BIBS功能可能对您有所帮助,但它无法在我的系统上运行scn.sap.com/docs/DOC-4612

use*_* 91 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