在工作簿打开之前,代码不会“等待”

时间:2019-02-14 16:12:53

标签: excel vba sap sapscript

我有一个混合了SAPScript和VBA的VBA代码。 基本上,我使用SAP事务并将其导出为Excel工作表,然后单击“导出”按钮,询问要保存的位置。

我已经使用SAP录制了脚本并将其插入VBA

步骤是:

  1. 点击导出按钮(SAP)

(显然没有涉及“另存为...”窗口的代码,用户必须进行交互)

  1. 单击按钮可返回主页(SAP)

  2. 为“打开的工作簿”设置一个名称,以便我可以使用它

问题是,如果我运行代码,它将无法正常工作。就像代码不会等到打开工作簿才能继续一样。

我尝试过:

  1. 为VBA代码增加等待时间
  2. 在事件之间添加行(例如MsgBox)
session.findById("wnd[0]/mbar/menu[0]/menu[3]/menu[1]").Select '(Step 1)
session.findById("wnd[0]/tbar[0]/btn[3]").press '(Step 2)
session.findById("wnd[0]/tbar[0]/btn[3]").press '(Step 2)

Set Book = ActiveWorkbook '(Step 3)
Set Sheet = ZMMBBook.Worksheets("Sheet1") '(Step 3)

应该设置了工作簿,但是代码会在打开之前运行。即使试图在它们之间添加时间也行不通,这就像它仅在进度之后才打开,但是当进度进行时,工作簿没有打开,因此会导致“下标超出范围”错误。

如果我在“设置”行中插入一个断点,则会打开工作簿,并且如果我继续进行,代码将正常工作。

我想作为解决方案:

  1. 一种插入代码行的方法,该代码行使代码像在断点处一样“中断”(但很平稳,因此最终用户可以使用它)

  2. SAPScript中与“保存窗口”交互的一种方式(因为我认为这是导致该错误的原因)

  3. 任何其他解决方案

谢谢大家!

1 个答案:

答案 0 :(得分:0)

在继续使用VBA之前,请在按下最后一个SAP GUI按钮之后尝试测试文件是否成功下载。像这样...

session.findById("wnd[0]/mbar/menu[0]/menu[3]/menu[1]").Select '(Step 1)
session.findById("wnd[0]/tbar[0]/btn[3]").press '(Step 2)
session.findById("wnd[0]/tbar[0]/btn[3]").press '(Step 2)

' Check the file downloaded successfully
If session.findById("wnd[0]/sbar").Text <> "" Then
    msgbox "There was an error downloading the file"
end if

Set Book = ActiveWorkbook '(Step 3)
Set Sheet = ZMMBBook.Worksheets("Sheet1") '(Step 3)

GUI脚本擅长等待自身完成处理后再继续下一条命令,但是在SAP GUI脚本和VBA之间来回移动时,我曾经遇到问题。

或者,您是否需要导出文件以获取数据?我的第一个偏好是直接从GUI,表格,网格或一系列单个字段中提取数据到一个数组中,然后将其粘贴到Excel Range中。这意味着需要更多的GUI脚本,但通常运行速度更快,并且使我们能够更好地控制我们获得的数据以及数据的去向(描述字段通常使用相同的标头导出,但可以在SAP GUI中轻松识别)。