目前在我工作的地方我们正试图通过 SAPGui , Excel &的使用自动执行某种重复性任务。 VBA 。通常,我们从SAP的TCode收集的大多数报告都使用GuiUserArea显示,这不容易,整洁且快速解析。
无论如何,我设法根据某些类型的要求解析这些类型的报告。因此,我第一次尝试解析任何报告(显示为GuiUserArea)时,我想到了将报告保存为未格式化文本然后使用VBA解析它(Regexes,Splits)的想法很容易,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对象)。尝试使用 .NET 和 SAPGUI 对象而没有成功,以加快流程。
但最后,似乎 SAPGUI 对象并非设计用于这类任务。
~EderQuiñones
答案 0 :(得分:2)
由于以下原因,您的代码似乎有些错误和缓慢:
我推荐的替代品
第一个选项需要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
答案 1 :(得分:2)
首先,感谢发布您的问题。你努力解决问题的努力正在帮助我。
刚刚找到一些可能有助于您处理水平和垂直滚动条的信息
就我而言,我正在使用PFCGGuiUserArea,这是GuiUserArea Class的一个对象。正如您在示例中所指出的,此类具有以下两个参数:HorizontalScrollbar和VerticalScrollbar。从这两个参数(它们是基于类创建的),您还有最小,最大和pagesize参数。
在垂直的情况下:
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传递到该位置。
最诚挚的问候, 卡欧