2

我需要通过 BEx 分析器更新几个 Excel 工作簿。我有一个调用脚本 A 和 B 的主脚本。

脚本 A 将填写每次在工作簿内刷新数据时弹出的 SAP 登录窗口。
脚本 B 将输入所需的日期。

我一直遇到的问题是代码非常适合第一个工作簿。一旦ExcelFileRefresh为第二个(第三个、第四个等)工作簿调用该函数,脚本 A 就会开始失败。它不会激活 SAP 登录窗口,而是将击键发送到另一个窗口,即包含主脚本的文件夹。

奇怪的是,如果我然后通过双击手动运行脚本 A,它会正常工作,而脚本 B 会做这件事......不幸的是,我自己无法弄清楚。

修复此问题的失败尝试列表:

  • 我尝试设置WScript.Sleep暂停。
  • 我尝试在脚本 A 的末尾设置SuccessSAPLogon为。Nothing
  • 我尝试在调用脚本 A 之前激活 Excel 工作簿。
  • 我尝试将脚本 A 和 B 融合到一个文件中。

主脚本

Filepath1 = "X:\ExcelBook1.xlsm"
Filepath2 = "X:\ExcelBook2.xlsm"

ExcelFileRefresh(Filepath1)
ExcelFileRefresh(Filepath2)

Function ExcelFileRefresh(Var)
    Set Excel = CreateObject("Excel.Application")
    Set objShell = CreateObject("WScript.Shell")

    Excel.Visible = True
    Excel.Workbooks.Open("C:\Program Files (x86)\Common Files\SAP Shared\BW\BExAnalyzer.xla")
    Excel.Run ("BExAnalyzer.xla!SetStart")
    Set Connection = Excel.Run("BExAnalyzer.xla!sapBEXgetConnection")
    Excel.Run("BExAnalyzer.xla!sapBEXinitConnection")
    Set ExcelBook = Excel.Workbooks.Open(Var, 0, False)

    '--- Initiate Scripts ---'

    Set objShell = CreateObject("WScript.Shell")
    objShell.Run "ScriptA.vbs"
    objShell.Run "ScriptB.vbs"

    Excel.Application.Run ("MenuRefreshVariables")
    Excel.Run "CommandButton1"
    Excel.Run "retreiveData"
    ExcelBook.Save
    Excel.Quit

    Set ExcelBook = Nothing
    Set Excel = Nothing
    Set objShell = Nothing
End Function

脚本A

Set objShell = CreateObject("WScript.Shell")

SuccessSAPLogon = False
Do While SuccessSAPLogon = False
    SuccessSAPLogon = objShell.AppActivate("SAP Logon")
Loop

objShell.SendKeys "{TAB 4}"
objShell.SendKeys "{RIGHT}"
objShell.SendKeys "{TAB}"
objShell.SendKeys "myWarehouse"
objShell.SendKeys "{TAB}"
objShell.SendKeys "BW"
objShell.SendKeys "{ENTER 2}"

脚本B

Set objShell = CreateObject("WScript.Shell")

SuccessVariables = False
Do While SuccessVariables = False
    SuccessVariables = objShell.AppActivate("Select Values")
Loop

objShell.SendKeys "{TAB 3}"
objShell.SendKeys "{DOWN}"
objShell.SendKeys "{TAB 14}"
DateA = DateSerial(Year(Date), Month(Date), Day(Date)-3)
objShell.SendKeys DateA
objShell.SendKeys "{ENTER}"
4

0 回答 0