8

问题!

目前在我工作的地方,我们正在尝试使用SAPGuiExcelVBA自动执行某种重复性任务。通常,我们从 SAP 的 TCodes 收集的大多数报告都显示为 GuiUserArea,这并不容易、整洁和快速解析。

解决方案!

无论如何,我设法根据某些类型的要求解析这些报告。因此,我第一次尝试解析任何报告(显示为 GuiUserArea)时,我想到了将报告保存为无格式文本然后使用 VBA(正则表达式、拆分, Text Length, ...) 而不是使用 GuiUserArea 方法和属性。

请注意,使用此过程(保存文件)更容易和更快地解析信息,但是使用SAPGUI对象只是为了保存文件而不是完成更复杂的任务作为解析信息有什么意义......

使用 GuiUserArea 我想出了以下解决方案:

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
              

上面显示的代码完美运行,除了以下语句:

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

  • 对于大量数据来说很慢而且很慢(因为我们正在使用 VBA 到 COM 对象,所以它应该是这样的)。尝试使用.NETSAPGUI对象但没有成功以加快进程。

但在路的尽头, SAPGUI对象似乎不是为这类任务而设计的。

问题!

  • 您还有其他方法可以尝试解析 GuiUserArea 吗?
  • 您是否尝试过使用高级编程语言(甚至脚本语言)来与 SAP 系统而不是 VBA 进行交互?
  • 您是否知道是否有任何其他方式与 SAP 系统交互而不是SAPGUI对象(您是否尝试过 SAP .NET 连接器?)
4

2 回答 2

2

由于以下原因,您的代码似乎有问题且速度慢:

  • 正在设置 intItemsShown,然后将其用作循环中的一个步骤,并最终在循环中对其进行修改。
  • 您有一个嵌套循环,它只执行 Debug.Print 可能会进一步减慢您的应用程序
  • 由于您似乎正在遍历对象的层次结构,因此在我看来,使用递归调用来
    处理孩子、孩子的孩子会更合适......解析 SAP 输出结构可能有效但不干净,可能会成为未来维护的噩梦。

我推荐的替代品

  • 创建一个 RFC,它将获取您的参数并将原始数据返回到 Excel。这个链接可能是一个好的开始: http ://www.vbforums.com/showthread.php?337408-VB-and-SAP-Integration
  • 创建 Web 服务并从 Excel VBA 调用它
  • 创建一个网页,该网页以 HTML 格式返回数据,excel 可以作为 Web 查询访问这些数据。请参阅此链接作为开始: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
于 2013-07-19T01:42:12.380 回答
2

首先,感谢您发布您的问题。你试图解决你的问题的努力正在帮助我解决我的问题。

刚刚发现了一些可以帮助您处理水平和垂直滚动条的信息

就我而言,我正在使用 PFCGGuiUserArea ,它是 GuiUserArea 类的对象。正如您在示例中指出的那样,此类具有这两个参数,Horizo​​ntalScrollbar 和 VerticalScrollbar。从这两个参数(它们是基于类创建的)中,您还具有最小、最大和页面大小参数。

在垂直的情况下:

VerticalScrollbar Maximum: 349   '==> Total Rows of the GuiUserArea
VerticalScrollbar Minimum: 0     '==> First Row of the GuiUserArea
VerticalScrollbar Position: 1    '==> Position of the Cursor 
VerticalScrollbar Page Size: 34  '==> Total Rows per Page

在水平的情况下

HorizontalScrollbar Maximum: 190      '==> Total of Columns available
HorizontalScrollbar Minimum: 0        '==> First Column Available
HorizontalScrollbar Position: 0       '==> Position of the cursor
HorizontalScrollbar Page Size: 255    '==> Total Columns per Page

因此,您可以改进指向此属性的代码以解决宽水平滚动问题。这将从系统中获取准确的信息,因此您不必将 1000 传递给该位置。

最好的问候, Caio

于 2018-01-23T16:35:57.340 回答