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
现在,如果我键入" session。"出现可能的属性列表。 但是有一个问题!
如果我键入以下行
Debug.Print session.FindById("wnd[0]").Text
它给出了一个错误(虽然它曾经工作得很好!)。 错误是"对象变量或未设置bock变量"。
如果我注释掉变量声明,它就可以了!
在会话未声明时使用TLI功能我得到以下成员
DumpProperties session.FindById("wnd[0]")
此处输出 - > pastebin.mozilla.org/8882551
但如果我运行相同的命令并正确声明会话我得到了......同样的错误
因此经过一番研究后发现,脚本的开头现在的工作原理并不相同。
If Not IsObject(MyApplication) Then
如果已使用Dim MyApplication声明MyApplication为SAPFEWSELib.GuiApplication
,则无法执行所以我尝试在没有IF的情况下执行命令。
Set MyApplication = SapGuiAuto.GetScriptingEngine
Set Connection = MyApplication.Children(0)
Set session = Connection.Children(0)
这失败了"对象变量或未设置的bock变量" Set MyApplication = SapGuiAuto.GetScriptingEngine
上的错误此问题的解决方案是像这样创建一个新的SapGuiAuto实例。
Set SapGuiAuto = New SAPFEWSELib.GuiApplication
现在上面的代码执行,直到它在Set Connection = MyApplication.Children(0)
失败错误:"集合的枚举器找不到具有指定索引的en元素"
使用以下行进行的快速测试显示,.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什么都是噩梦。希望我不必诉诸于此。
我会试试另一台电脑。
刚试过,我得到了同样的东西。在这一点上,我必须放弃,我无法在没有任何帮助的情况下工作,或者至少晚上好好休息!
我发现一些额外的链接对于和我一样的人来说非常有用。
使用VBA调试器发现SAP GUI属性和功能 scn.sap.com/docs/DOC-39696
SAP GUI Scripting 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
答案 0 :(得分:1)
我自己刚刚遇到这个问题,并找到了“枚举器”错误的解决方案。也将它发布在您提到的引用的stackoverflow帖子中。
改变这个: 设置连接= Sap_Application.Children(0)
进入: 设置连接= Sap_Application.Children(1)
正如我在那里解释的那样,不确定为什么会发生这种情况,或者它意味着什么,我只是搞砸了这些数字并且有效。
希望现在还为时不晚,或者它可以帮助其他人。
此致
答案 1 :(得分:0)
使用此方法时,我也会得到0个孩子,就像未连接到SAP一样:
Set sapCon = New SAPFEWSELib.GuiApplication
通过使用它实际上可以正常工作:
Set sapCon = GetObject("SAPGUI").GetScriptingEngine