.net SAPGUI解析GUI用户区 问题
目前在我工作的地方,我们正试图通过使用SAPGui、Excel和VBA自动执行某种重复性任务。通常,我们从SAP的TCodes中收集的大多数报告都显示有一个GUI用户区,这不容易、整洁和快速地解析 解决方案 无论如何,我根据特定类型的需求解析了这些类型的报告。因此,在我第一次尝试解析任何报告(显示为GuiUserArea)时,我想到了这样一个想法:将报告保存为未格式化文本,然后使用VBA(regex、Splits、text Length等)而不是使用GuiUserArea方法和属性来解析它是很容易的。 请注意,使用此过程(保存文件)更容易、更快速地解析信息,但使用SAPGUI对象只是为了保存文件,而不是作为解析信息完成更复杂的任务,这有什么意义呢 通过使用GuiUserArea,我提出了以下解决方案:.net SAPGUI解析GUI用户区 问题,.net,excel,vba,sap-gui,sap-dotnet-connector,.net,Excel,Vba,Sap Gui,Sap Dotnet Connector,目前在我工作的地方,我们正试图通过使用SAPGui、Excel和VBA自动执行某种重复性任务。通常,我们从SAP的TCodes中收集的大多数报告都显示有一个GUI用户区,这不容易、整洁和快速地解析 解决方案 无论如何,我根据特定类型的需求解析了这些类型的报告。因此,在我第一次尝试解析任何报告(显示为GuiUserArea)时,我想到了这样一个想法:将报告保存为未格式化文本,然后使用VBA(regex、Splits、text Length等)而不是使用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对象但未成功,以加快进程
- 您是否有任何其他方法来尝试解析GuiUserArea
- 您是否尝试过使用高级编程语言(甚至脚本语言)来与SAP系统而不是VBA进行交互
- 您知道是否有其他方式与SAP系统交互,而不是与SAPGUI对象交互(您是否尝试过SAP.NET Connector?)
- 正在设置intItemsShown,然后将其用作循环中的一个步骤 并最终在循环中修改它
- 您有一个嵌套循环 这只是进行了一次调试。打印,这可能会进一步降低应用程序的速度
- 由于您似乎正在遍历对象的层次结构,因此
告诉我使用递归调用
过程孩子,孩子的孩子。。。解析SAP输出 结构可能工作,但不干净,可能会成为 未来的维护噩梦 - 创建一个RFC,它将接受您的参数并返回原始数据 出类拔萃。此链接可能会给我一个良好的开端:
- 创建web服务并从Excel VBA调用它
- 创建网页 以HTML格式返回excel可以作为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
对于i=0到intVerticalScrollEndPoint步骤初始化演示“首先,感谢您发布您的问题。你为解决你的问题所做的努力帮助了我
刚刚发现了一些可能帮助您处理水平和垂直滚动条的信息
在我的例子中,我正在使用一个PFCGGuiUserArea,它是GuiUserArea类的一个对象。正如您在示例中指出的,这个类有两个参数,水平滚动条和垂直滚动条。通过这两个参数(它们是基于类创建的),您还可以获得最小、最大和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传递到该位置
致以最良好的祝愿,
Caio如果您在某个地方放置断点并查看vba代码中包含的数据以查找所需内容,会发生什么情况?有关详细说明,请参阅。我使用这种方法取得了巨大的成功。在你工作的地方有ABAP程序员吗?它们可以将您需要执行的重复任务包装到RFC函数中,或者编写代码并将其作为Web服务公开。您可以通过.NET connector连接到SAP,但您仍将受限于公开的SAP BAPi(这不是一件坏事,因为这些BAPi至少有很好的文档记录和支持)。您实际想要实现什么,它是否需要SAP中不存在的数据?我不清楚您为什么要在Excel/VBA中而不是在ABAP中使用BDC来执行此操作。@Esti:不幸的是,我们的工厂没有任何ABAP程序员,只是在公司级别,但他们拒绝接受此类请求。因此,我将尝试.NET连接器…@BryanCain:它只需要满足TCode要求的数据。我没有听说过BDC,但只要我有使用ABAP和BDC的特权,我就会尝试它。这根本不起作用,VBA代码需要一个对象。@MaximTeleguz这只是OP提供的代码的一部分。它嵌套在With End With块中。