首页 > 解决方案 > SAP 脚本随着时间的推移运行缓慢 VBA

问题描述

当我在 VBA (excel) 中长时间运行 SAP 脚本时,SAP 会话开始变慢。如果我中断代码并重新启动它,SAP 会话仍然以原来的慢速运行。如果我关闭 excel 并再次运行代码,SAP 会话仍然以慢速运行。但是,如果我关闭 SAP 会话并重新打开它,然后运行代码(不关闭 excel),速度会再次回到最佳速度。

我运行了以下代码(作为测试)以查看速度降低。当代码开始时,每个循环大约需要 4 秒,但是到第 300 个循环时,速度下降到每个循环 16 秒。

这可能看起来微不足道,但我正在运行另一个代码块(太大而无法发布),它有大约 3000 个循环要执行,其中每个循环需要大约 25 秒才能以最佳速度执行(一旦 SAP 开始,每个循环一分钟或更长时间)减速)。

与其运行一个 100 个循环块,关闭 SAP,再次重新打开 SAP,然后运行下一个 100 个循环块(这是我一直在做的),有谁知道是什么减慢了 SAP 会话以及是否有办法以编程方式重置 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

标签: excelvbaperformancescriptingsap

解决方案


推荐阅读