excel SAP GUI脚本随时间运行变慢VBA

emeijp43  于 2023-06-25  发布在  其他
关注(0)|答案(1)|浏览(153)

当我在VBA(Excel)中长时间运行SAP GUI脚本时,SAP GUI会话开始变慢。如果我中断代码并重新启动它,SAP GUI会话仍然以原来的慢速运行。如果我关闭Excel并再次运行代码,SAP GUI会话仍然以慢速运行。但是,如果我关闭SAP GUI会话并重新打开它,然后运行代码(而不是关闭Excel),速度将再次回到最佳速度。
我运行下面的代码(作为测试)来查看速度的下降。当代码开始时,每个循环大约需要4秒,然而到了第300次循环,速度下降到了每个循环16秒。
这可能看起来微不足道,但我正在运行另一个代码块(太大而无法发布),它有大约3000个循环要执行,其中每个循环需要大约25秒以最佳速度执行(一旦SAP GUI开始减速,每个循环需要一分钟或更长时间)。
而不是运行一个100个循环的块,关闭SAP GUI,再次重新打开SAP GUI,然后运行下一个100个循环的块(这就是我一直在做的),有人知道是什么减慢了SAP GUI会话,如果有一种方法可以通过编程重置SAP,以便代码再次返回到最佳速度?任何帮助或指导都会非常感谢,我在网上找不到太多关于这方面的信息。

Sub runScript()

    Application.ScreenUpdating = False
    Application.DisplayAlerts = False
    Application.Calculation = xlCalculationManual

    Dim count As Integer
    count = 1
    
    Do While count < 1000
    
        Dim startDateTime As Date
        startDateTime = Now

        Call enterExitTransactionIW33
        
        Cells(count, 2) = DateDiff("S", startDateTime, Now)
        count = count + 1
    
    Loop
    
    Application.ScreenUpdating = True
    Application.DisplayAlerts = True
    Application.Calculation = xlCalculationAutomatic

End Sub

Private Sub enterExitTransactionIW33()

    Dim SAPGuiAuto, SAPApp, SAPConnection, SAPSession As Object
    
    Set SAPGuiAuto = GetObject("SAPGUI")
    Set SAPApp = SAPGuiAuto.GetScriptingEngine
    Set SAPConnection = SAPApp.Children(0)
    Set SAPSession = SAPConnection.Children(0)

    SAPSession.findById("wnd[0]/tbar[0]/okcd").Text = "IW33"
    SAPSession.findById("wnd[0]").sendVKey 0
    
    SAPSession.findById("wnd[0]/usr/ctxtCAUFVD-AUFNR").Text = "80808080"
    SAPSession.findById("wnd[0]").sendVKey 0
    
    SAPSession.findById("wnd[0]/usr/subSUB_ALL:SAPLCOIH:3001/ssubSUB_LEVEL:SAPLCOIH:1100/tabsTS_1100/tabpVGUE").Select
    SAPSession.findById("wnd[0]/usr/subSUB_ALL:SAPLCOIH:3001/ssubSUB_LEVEL:SAPLCOIH:1101/tabsTS_1100/tabpMUEB").Select
    SAPSession.findById("wnd[0]/usr/subSUB_ALL:SAPLCOIH:3001/ssubSUB_LEVEL:SAPLCOIH:1101/tabsTS_1100/tabpKOAU").Select
    SAPSession.findById("wnd[0]/usr/subSUB_ALL:SAPLCOIH:3001/ssubSUB_LEVEL:SAPLCOIH:1101/tabsTS_1100/tabpPARU").Select
    SAPSession.findById("wnd[0]/usr/subSUB_ALL:SAPLCOIH:3001/ssubSUB_LEVEL:SAPLCOIH:1101/tabsTS_1100/tabpIOLU").Select
    SAPSession.findById("wnd[0]/usr/subSUB_ALL:SAPLCOIH:3001/ssubSUB_LEVEL:SAPLCOIH:1101/tabsTS_1100/tabpIHKD").Select
    
    SAPSession.findById("wnd[0]/tbar[0]/okcd").Text = "/N"
    SAPSession.findById("wnd[0]").sendVKey 0
    
End Sub
fykwrbwg

fykwrbwg1#

我也遇到了这个问题,我在任何地方都找不到答案,但我相信我找到了一个解决方案-您需要做的就是在脚本慢下来时等待1秒:

Application.Wait (Now + TimeValue("0:00:01"))

第一步是测量执行每个循环所需的时间,所以我这样计算:

For i = 1 To 100
    StartTime = Timer  

    [SAP GUI Script] 

    SecondsElapsed = Round(Timer - StartTime, 2)
Next

根据SecondsElapsed变量,我可以看出在第10次循环之后,脚本速度变慢了,所以我需要每10次循环等待1秒。

breakCount = 0
For i = 1 To 100
  breakCount = breakCount + 1
  StartTime = Timer  

  [SAP GUI Script] 
              
  SecondsElapsed = Round(Timer - StartTime, 2)

  If breakCount = 10 Then
    Application.Wait (Now + TimeValue("0:00:01"))
    breakCount = 0
  End If
Next

这就解决了我的问题。

相关问题