Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 如何从SAP GUI提取PDF文档?(脚本)_Vba_Scripting_Sap Gui - Fatal编程技术网

Vba 如何从SAP GUI提取PDF文档?(脚本)

Vba 如何从SAP GUI提取PDF文档?(脚本),vba,scripting,sap-gui,Vba,Scripting,Sap Gui,我试图从SAP中提取PDF文档,但是,我被代码的第二部分卡住了,我需要启动另存为序列 代码的第一部分涉及连接到SAP并查询特定的发票号,然后是几行代码,我试图将这些代码附加到包含PDF文档的第二个SAP窗口。诀窍是使用Send键保存实际文件 Sub DocumentExtraction() Dim varResponse As Variant 'Prompts the user if macro should be run. varResponse = MsgBox("

我试图从SAP中提取PDF文档,但是,我被代码的第二部分卡住了,我需要启动另存为序列

代码的第一部分涉及连接到SAP并查询特定的发票号,然后是几行代码,我试图将这些代码附加到包含PDF文档的第二个SAP窗口。诀窍是使用Send键保存实际文件

Sub DocumentExtraction()

    Dim varResponse As Variant 'Prompts the user if macro should be run.
        varResponse = MsgBox("Are you sure you wish to run extraction macro?", vbYesNo, "Warning!")
        If varResponse <> vbYes Then Exit Sub

    Set SapGuiAuto = GetObject("SAPGUI") 'Obtains SAP GUI Scripting object.
    Set SAPApp = SapGuiAuto.GetScriptingEngine 'Obtains currently running SAP GUI.
    Set SAPCon = SAPApp.Children(0) 'Obtains the first system currently connected.
    Set session = SAPCon.Children(0) 'Obtains the first session (window) on that connection.

    ' SAP scripting starts here.

    session.findById("wnd[0]").maximize
    session.findById("wnd[0]/tbar[0]/okcd").Text = "/nFB03"
    session.findById("wnd[0]").sendVKey 0
    session.findById("wnd[0]/usr/txtRF05L-BELNR").Text = "930502016"
    session.findById("wnd[0]/usr/ctxtRF05L-BUKRS").Text = "7360"
    session.findById("wnd[0]/usr/txtRF05L-GJAHR").Text = "2019"
    session.findById("wnd[0]/usr/txtRF05L-GJAHR").SetFocus
    session.findById("wnd[0]/usr/txtRF05L-GJAHR").caretPosition = 4
    session.findById("wnd[0]").sendVKey 0
    session.findById("wnd[0]/titl/shellcont/shell").pressContextButton "%GOS_TOOLBOX"
    session.findById("wnd[0]/titl/shellcont/shell").selectContextMenuItem "%GOS_VIEW_ATTA"
    session.findById("wnd[1]/usr/cntlCONTAINER_0100/shellcont/shell").selectedRows = "0"
    session.findById("wnd[1]/usr/cntlCONTAINER_0100/shellcont/shell").doubleClickCurrentCell

    Set session = SAPCon.Children(1) 'Obtains the second session (window) on current connection.

    session.findById("wnd[0]/shellcont/shell/shellcont[1]/shell").SetFocus

End Sub
子文档提取()
Dim varResponse As Variant'提示用户是否应运行宏。
varResponse=MsgBox(“您确定要运行提取宏吗?”,vbYesNo,“警告!”)
如果varResponse vbYes,则退出Sub
设置SapGuiAuto=GetObject(“SAPGUI”)”获取SAP GUI脚本对象。
设置SAPApp=SapGuiAuto.GetScriptingEngine'获取当前正在运行的SAP GUI。
Set SAPCon=SAPApp.Children(0)”获取当前连接的第一个系统。
Set session=SAPCon.Children(0)”获取该连接上的第一个会话(窗口)。
'SAP脚本从这里开始。
session.findById(“wnd[0]”)。最大化
session.findById(“wnd[0]/tbar[0]/okcd”).Text=“/nFB03”
session.findById(“wnd[0]”)。sendVKey 0
session.findById(“wnd[0]/usr/txtRF05L BELNR”).Text=“9305016”
session.findById(“wnd[0]/usr/ctxtRF05L BUKRS”).Text=“7360”
session.findById(“wnd[0]/usr/txtRF05L GJAHR”).Text=“2019”
session.findById(“wnd[0]/usr/txtRF05L GJAHR”).SetFocus
session.findById(“wnd[0]/usr/txtRF05L GJAHR”).caretPosition=4
session.findById(“wnd[0]”)。sendVKey 0
session.findById(“wnd[0]/titl/shellcont/shell”)。按ContextButton“%GOS\u工具箱”
session.findById(“wnd[0]/titl/shellcont/shell”)。选择ContextMenuItem“%GOS\u VIEW\u ATTA”
session.findById(“wnd[1]/usr/cntlCONTAINER\u 0100/shellcont/shell”)。selectedRows=“0”
session.findById(“wnd[1]/usr/cntlCONTAINER\u 0100/shellcont/shell”)。双击当前单元格
Set session=SAPCon.Children(1)”获取当前连接上的第二个会话(窗口)。
session.findById(“wnd[0]/shellcont/shell/shellcont[1]/shell”).SetFocus
端接头

我在SAP支持页面上发现了类似的帖子,但是,建议的解决方案似乎不起作用-对象不存在。

一个简单的解决方法是通过导航到Internet Explorer/Tools/Internet Options/Programs/Manage add-ons/select All add-ons/disable Adobe PDF Reader在Internet Explorer中禁用Adobe PDF Reader

然后在单击文档后使用下面的代码,它将打开打开/保存/关闭窗口

Application.Wait Now + TimeValue("0:00:15")
SendKeys "%s" 'ALT + S initiates save as procedure.

Application.Wait Now + TimeValue("0:00:05")
SendKeys ExtractFolderPath & ExtractFileName 'File name and path are entered.

Application.Wait Now + TimeValue("0:00:02")
SendKeys "{ENTER}"

Application.Wait Now + TimeValue("0:00:02")
SendKeys "{F3}" 'Closes Document Viewer window.

Application.Wait Now + TimeValue("0:00:02")
session.findById("wnd[1]").Close 'Closes Attachment List window.

我不建议使用
Sendkeys
,因为人们不能依赖它。在您的情况下,如果15s resp 2s没有足够的时间等待SAPGUI显示对话框,会发生什么情况。我同意这远远不够理想。不过,我添加了一段代码来查看下载文件夹并报告文件是否确实存在:)我还有一段代码来提取SAP状态栏文本,以便更清楚地了解文件未被提取的原因。但是,正如您所说,这不是最好的选择。那么您没有SAPGUI 7.30 PL8或更高版本,因为在该版本中,我上面的代码应该可以工作,然后不需要使用
Sendkeys
。我们实际上有SAP GUI 740,我取消了上面的脚本选项。我得到的信息是document不支持此函数,这是我试图提取的几乎所有文档的名称。关于发送键,你们是对的,一旦我切换到更小的屏幕(使用两个屏幕来编码),它就不能工作了,所以肯定不可靠。