SAP销售订单文本提取到Excel

时间:2018-04-18 14:42:34

标签: excel-vba sap-gui vba excel

多年来,我使用的是ERP系统,我可以轻松到达每个角落并轻松获取数据,但我们现在已经转移到全球SAP系统,并且访问水平低得多,并不容易。 我有一个特定的要求从一些销售订单项目文本字段中提取数据;因为这些是加密的,因为我仅限于SQVI,所以不能直接完成。 我尝试使用事务VA03记录脚本以提取数据,并且发现其他人都认为保存为本地文件的重要部分未被记录。我在SAP归档讨论https://archive.sap.com/discussions/thread/3240622中找到了一个非常有用的帖子,其中解决了这个问题,并通过进行一些微不足道的更改来设法将标题文本保存到Excel中。



Sub Macro1()
'
' Macro1 Macro
'


If Not IsObject(sap) Then

   Set SapGuiAuto = GetObject("SAPGUI")

   Set sap = SapGuiAuto.GetScriptingEngine

End If

If Not IsObject(Connection) Then

   Set Connection = sap.Children(0)

End If

If Not IsObject(session) Then

   Set session = Connection.Children(0)

End If

If IsObject(WScript) Then

   WScript.ConnectObject session, "on"

   WScript.ConnectObject sap, "on"

End If

session.findById("wnd[0]").resizeWorkingPane 167, 31, False

session.findById("wnd[0]/tbar[0]/okcd").Text = "/nva03"

session.findById("wnd[0]").sendVKey 0

session.findById("wnd[0]/usr/ctxtVBAK-VBELN").Text = "nnnnnn"

session.findById("wnd[0]").sendVKey 0
session.findById("wnd[0]/usr/subSUBSCREEN_HEADER:SAPMV45A:4021/btnBT_HEAD").press
session.findById("wnd[0]/usr/tabsTAXI_TABSTRIP_HEAD/tabpT\09").Select
session.findById("wnd[0]/usr/tabsTAXI_TABSTRIP_HEAD/tabpT\09/ssubSUBSCREEN_BODY:SAPMV45A:4152/subSUBSCREEN_TEXT:SAPLV70T:2100/cntlSPLITTER_CONTAINER/shellcont/shellcont/shell/shellcont[0]/shell").selectItem "Z005", "Column1"
session.findById("wnd[0]/usr/tabsTAXI_TABSTRIP_HEAD/tabpT\09/ssubSUBSCREEN_BODY:SAPMV45A:4152/subSUBSCREEN_TEXT:SAPLV70T:2100/cntlSPLITTER_CONTAINER/shellcont/shellcont/shell/shellcont[0]/shell").ensureVisibleHorizontalItem "Z005", "Column1"
session.findById("wnd[0]/usr/tabsTAXI_TABSTRIP_HEAD/tabpT\09/ssubSUBSCREEN_BODY:SAPMV45A:4152/subSUBSCREEN_TEXT:SAPLV70T:2100/cntlSPLITTER_CONTAINER/shellcont/shellcont/shell/shellcont[0]/shell").doubleClickItem "Z005", "Column1"

Cells(1, 1) = session.findById("wnd[0]/usr/tabsTAXI_TABSTRIP_HEAD/tabpT\08/ssubSUBSCREEN_BODY:SAPMV45A:4152/subSUBSCREEN_TEXT:SAPLV70T:2100/cntlSPLITTER_CONTAINER/shellcont/shellcont/shell/shellcont[1]/shell").Text

session.findById("wnd[0]/tbar[0]/btn[3]").press
End Sub




这很有效,(订单编号在非常不可能的事件中被压缩为nnnnnn,有人可能认出它)并且我能够通过添加行从其他字段获取数据,但是当我尝试做同样的项目文字的内容与下面的变化



ub Macro1()
'
' Macro1 Macro
'


If Not IsObject(sap) Then

   Set SapGuiAuto = GetObject("SAPGUI")

   Set sap = SapGuiAuto.GetScriptingEngine

End If

If Not IsObject(Connection) Then

   Set Connection = sap.Children(0)

End If

If Not IsObject(session) Then

   Set session = Connection.Children(0)

End If

If IsObject(WScript) Then

   WScript.ConnectObject session, "on"

   WScript.ConnectObject sap, "on"

End If

session.findById("wnd[0]").resizeWorkingPane 167, 31, False

session.findById("wnd[0]/tbar[0]/okcd").Text = "/nva03"

session.findById("wnd[0]").sendVKey 0

session.findById("wnd[0]/usr/ctxtVBAK-VBELN").Text = "nnnnnn"
session.findById("wnd[0]").sendVKey 0
session.findById("wnd[0]/usr/tabsTAXI_TABSTRIP_OVERVIEW/tabpT\01/ssubSUBSCREEN_BODY:SAPMV45A:4400/subSUBSCREEN_TC:SAPMV45A:4900/subSUBSCREEN_BUTTONS:SAPMV45A:4050/btnBT_POPO").press
session.findById("wnd[1]/usr/txtRV45A-POSNR").Text = "351"
session.findById("wnd[1]/usr/txtRV45A-POSNR").caretPosition = 3
session.findById("wnd[1]").sendVKey 0
session.findById("wnd[0]/usr/tabsTAXI_TABSTRIP_OVERVIEW/tabpT\01/ssubSUBSCREEN_BODY:SAPMV45A:4400/subSUBSCREEN_TC:SAPMV45A:4900/subSUBSCREEN_BUTTONS:SAPMV45A:4050/btnBT_PKON").press
session.findById("wnd[0]/usr/tabsTAXI_TABSTRIP_ITEM/tabpT\09").Select
' Texts is 9th tab - this leaves cursor on first text line, next line moves to Customer tags, but doesn't show content, which only shows on doubleClickItem "Z102" line
session.findById("wnd[0]/usr/tabsTAXI_TABSTRIP_ITEM/tabpT\09/ssubSUBSCREEN_BODY:SAPMV45A:4152/subSUBSCREEN_TEXT:SAPLV70T:2100/cntlSPLITTER_CONTAINER/shellcont/shellcont/shell/shellcont[0]/shell").selectItem "Z102", "Column1"
session.findById("wnd[0]/usr/tabsTAXI_TABSTRIP_ITEM/tabpT\09/ssubSUBSCREEN_BODY:SAPMV45A:4152/subSUBSCREEN_TEXT:SAPLV70T:2100/cntlSPLITTER_CONTAINER/shellcont/shellcont/shell/shellcont[0]/shell").ensureVisibleHorizontalItem "Z102", "Column1"
session.findById("wnd[0]/usr/tabsTAXI_TABSTRIP_ITEM/tabpT\09/ssubSUBSCREEN_BODY:SAPMV45A:4152/subSUBSCREEN_TEXT:SAPLV70T:2100/cntlSPLITTER_CONTAINER/shellcont/shellcont/shell/shellcont[0]/shell").doubleClickItem "Z102", "Column1"

Cells(1, 1) = session.findById("wnd[0]/usr/tabsTAXI_TABSTRIP_HEAD/tabpT\09/ssubSUBSCREEN_BODY:SAPMV45A:4152/subSUBSCREEN_TEXT:SAPLV70T:2100/cntlSPLITTER_CONTAINER/shellcont/shellcont/shell/shellcont[0]/shell").Text


session.findById("wnd[0]/tbar[0]/btn[3]").press
End Sub




这将显示SAP屏幕上的必填字段,但随后会出现错误,"运行时错误'''无法找到控件是id。"

我显然不明白所发生的一切 - 请有人帮助我吗?

安德鲁

1 个答案:

答案 0 :(得分:0)

不幸的是,我无法访问事务VA03。但是如果所有命令都是由脚本记录器实际记录的,那么我可以想象在查询数据时它们还没有准备好。所以也许解决方案可能有点突破。

例如:

...
session.findById("wnd[0]/usr/tabsTAXI_TABSTRIP_ITEM/tabpT\09/ssubSUBSCREEN_BODY:SAPMV45A:4152/subSUBSCREEN_TEXT:SAPLV70T:2100/cntlSPLITTER_CONTAINER/shellcont/shellcont/shell/shellcont[0]/shell").doubleClickItem "Z102", "Column1"
waitTill = Now() + TimeValue("00:00:01")
While Now() < waitTill
  DoEvents
Wend

Cells(1, 1) = session.findById("wnd[0]/usr/tabsTAXI_TABSTRIP_HEAD/tabpT\09/ssubSUBSCREEN_BODY:SAPMV45A:4152/subSUBSCREEN_TEXT:SAPLV70T:2100/cntlSPLITTER_CONTAINER/shellcont/shellcont/shell/shellcont[0]/shell").Text
...

此致 ScriptMan