SAP:SAPGUI分析GuiUserArea

问题!

目前在我工作的地方我们正尝试通过使用SAPGuiExcelVBA自动执行某种重复任务。 通常情况下,我们从SAP的TCodes收集到的大部分报告都是用一个GuiUserArea来显示的,这个GuiUserArea不容易,整洁,快速地parsing。

解!

无论如何,我设法parsing这些types的报告取决于某些types的要求。 所以,我第一次试图parsing任何报告(显示为GuiUserArea),我想出了这样的想法:将报告保存为未格式化的文本很容易,然后使用VBA(正则expression式,分裂,文本长度,…),而不是使用GuiUserArea方法和属性。

请注意,使用这个过程(保存文件)更容易和快速地parsing信息,但是使用SAPGUI对象只是为了保存文件而不是parsing信息来完成更复杂的任务。

使用GuiUserArea我已经想出了以下解决scheme:

Sub ParseSAPGUI() Dim objSAPGui As Object Dim objApplication As Object Dim objConnection As Object Dim objSession As Object If (objSAPGui Is Nothing) Then Set objSAPGui = GetSAPGuiObject() Set objApplication = GetSAPGuiScriptEngine(objSAPGui) End If If (objConnection Is Nothing) Then Set objConnection = GetSAPGuiConnection(objApplication) End If If (objSession Is Nothing) Then Set objSession = GetSAPGuiSession(objConnection) End If With objSession Dim intItemsShown As Integer Dim intVerticalScrollEndPoint As Integer Dim intHorizontalScrollEndPoint As Integer ' Move to the end of the GuiUserArea .findById("wnd[0]/usr").HorizontalScrollbar.Position = 10000 .findById("wnd[0]/usr").VerticalScrollbar.Position = 10000 ' Store end points intVerticalScrollEndPoint = .findById("wnd[0]/usr").VerticalScrollbar.Position intHorizontalScrollEndPoint = .findById("wnd[0]/usr").HorizontalScrollbar.Position ' Move to the start of the GuiUserArea .findById("wnd[0]/usr").HorizontalScrollbar.Position = 0 .findById("wnd[0]/usr").VerticalScrollbar.Position = 0 ' Items per page being shown intItemsShown = objSession.findById("wnd[0]/usr").Children.Count - 1 Dim i As Integer Dim n As Integer For i = 0 To intVerticalScrollEndPoint Step intItemsShown .findById("wnd[0]/usr").VerticalScrollbar.Position = i intItemsShown = objSession.findById("wnd[0]/usr").Children.Count - 1 For n = 0 To intItemsShown Debug.Print .findById("wnd[0]/usr").Children.ElementAt(n).Text Next n Next i End With End Sub 

上面显示的代码完美工作除了以下语句:

  • 它几乎可以parsing所有types的GuiUserArea报告,除了具有宽水平窗口的报告外。 我正在努力解决这些问题,但缺乏SAPGUI对象的文档。

  • 对于大量的数据,速度慢,速度很慢(因为我们正在使用VBA到COM对象)。 试图与.NETSAPGUI对象没有成功,以加快进程。

但是在路的尽头,似乎SAPGUI对象并不是为这些任务而devise的。

问题!

  • 你有任何其他的方法来尝试parsingGuiUserArea?
  • 您是否尝试过使用高级编程语言(甚至是脚本语言)来与SAP交互而不是VBA?
  • 你知道是否有任何其他方式与SAP交互而不是SAPGUI对象(您是否尝试过SAP .NET Connector?)

〜EderQuiñones

您的代码似乎越野车和缓慢的原因如下:

  • intItemsShown被设置,然后你用它作为一个循环内的一个步骤,并最终在循环内修改它。
  • 你有一个嵌套循环,只是做一个Debug.Print可能会进一步减慢你的应用程序
  • 由于您似乎正在遍历对象的层次结构,因此在我看来,使用recursion调用来更合适
    处理儿童,儿童的孩子…parsingSAP输出结构可能工作,但不干净,将来可能会成为维护的噩梦。

我推荐的select

  • 创build一个将采用您的参数并将原始数据返回给Excel的RFC。 这个链接可能是一个好的开始: http : //www.vbforums.com/showthread.php?337408-VB-and-SAP-Integration
  • 创build一个Web服务并从Excel VBA中调用它
  • 创build一个网页,返回Excel中可以作为networking查询访问的HTML数据。 请参阅此链接作为开始: http : //www.techrepublic.com/article/pull-data-into-microsoft-excel-with-web-queries/ 。

第一个选项需要SAP方面的ABAP。 另外两个选项假定您有一个与SAP集成的Web服务器。

 For i = 0 To intVerticalScrollEndPoint Step intItemsShown ' <--intItemsShown is being used here .findById("wnd[0]/usr").VerticalScrollbar.Position = i intItemsShown = objSession.findById("wnd[0]/usr").Children.Count - 1 ' and modified here For n = 0 To intItemsShown ' and used here again Debug.Print .findById("wnd[0]/usr").Children.ElementAt(n).Text Next n Next i