You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过VBA自动提取SAP COOIS中的合计值并写入Excel?

解决SAP COOIS报表合计值自动抓取至Excel的问题

问题背景

已实现VBA自动化完成SAP COOIS报表的筛选、界面调整、行合计设置,但因合计值位置不固定,无法自动将合计值复制到Excel,仍需手动录入。

解决方案

方法1:直接调用ALV网格的合计获取方法(推荐)

SAP的ALV网格控件提供了直接获取列合计值的接口,无需依赖合计行的位置,是最可靠的方案。定位到ALV网格对象后,调用其GetTotal方法即可获取指定列的合计值。

方法2:通过合计行文本定位

若无法使用GetTotal方法,可查找包含"总计"(或SAP系统对应语言的合计文本,如英文环境的"Total")的行,再提取对应列的值。

方法3:导出报表到Excel后计算合计

作为备选,可将COOIS报表导出到Excel,再用Excel公式计算对应列的合计值,避免依赖SAP界面的合计行。

修改后的完整代码

以下代码基于方法1实现,自动抓取GWEMG列的合计值并写入Excel的TEST工作表A1单元格:

'COOIS Get Total
Option Explicit
Public SapGuiAuto, WScript, msgcol
Public objGui  As GuiApplication
Public objConn As GuiConnection
Public session As GuiSession
Public alvGrid As GuiGridView '新增ALV网格对象变量

Sub SAPDownloadAttachment()
    Dim WB As Workbook
    Dim WS As Worksheet
    Dim totalValue As Variant '存储合计值

    Set SapGuiAuto = GetObject("SAPGUI")
    Set objGui = SapGuiAuto.GetScriptingEngine
    Set objConn = objGui.Children(0)
    Set session = objConn.Children(0)
    
    '绑定Excel对象
    Set WB = ThisWorkbook
    Set WS = WB.Worksheets("TEST")
    
    '原有自动化步骤:筛选、界面调整、设置行合计
    session.findById("wnd[0]").resizeWorkingPane 126, 43, False
    session.findById("wnd[0]/usr/cntlIMAGE_CONTAINER/shellcont/shell/shellcont[0]/shell").doubleClickNode "F00023"
    session.findById("wnd[0]/usr/ssub%_SUBSCREEN_TOPBLOCK:PPIO_ENTRY:1100/ctxtPPIO_ENTRY_SC1100-ALV_VARIANT").SetFocus
    session.findById("wnd[0]/usr/ssub%_SUBSCREEN_TOPBLOCK:PPIO_ENTRY:1100/ctxtPPIO_ENTRY_SC1100-ALV_VARIANT").caretPosition = 11
    session.findById("wnd[0]").sendVKey 4
    session.findById("wnd[1]/usr/cntlGRID/shellcont/shell").currentCellColumn = "TEXT"
    session.findById("wnd[1]/usr/cntlGRID/shellcont/shell").doubleClickCurrentCell
    session.findById("wnd[0]/usr/tabsTABSTRIP_SELBLOCK/tabpSEL_00/ssub%_SUBSCREEN_SELBLOCK:PPIO_ENTRY:1200/ctxtS_WERKS-LOW").Text = "p120"
    session.findById("wnd[0]/usr/tabsTABSTRIP_SELBLOCK/tabpSEL_00/ssub%_SUBSCREEN_SELBLOCK:PPIO_ENTRY:1200/ctxtS_ARBPL-LOW").Text = "132"
    session.findById("wnd[0]/usr/tabsTABSTRIP_SELBLOCK/tabpSEL_00/ssub%_SUBSCREEN_SELBLOCK:PPIO_ENTRY:1200/ctxtS_ISTEN-LOW").SetFocus
    session.findById("wnd[0]/usr/tabsTABSTRIP_SELBLOCK/tabpSEL_00/ssub%_SUBSCREEN_SELBLOCK:PPIO_ENTRY:1200/ctxtS_ISTEN-LOW").caretPosition = 0
    session.findById("wnd[0]").sendVKey 4
    session.findById("wnd[1]/usr/cmbWORKFLDS-MONTH").SetFocus
    session.findById("wnd[1]/usr/cmbWORKFLDS-MONTH").Key = "1"
    session.findById("wnd[1]/usr/cmbWORKFLDS-YEARN").SetFocus
    session.findById("wnd[1]/usr/cmbWORKFLDS-YEARN").Key = "2025"
    session.findById("wnd[1]/usr/sub:SAPLSHLC:0200[0]/txtIOWORKFLDS-DAY03[0,6]").SetFocus
    session.findById("wnd[1]/usr/sub:SAPLSHLC:0200[0]/txtIOWORKFLDS-DAY03[0,6]").caretPosition = 1
    session.findById("wnd[1]").sendVKey 2
    session.findById("wnd[0]/usr/tabsTABSTRIP_SELBLOCK/tabpSEL_00/ssub%_SUBSCREEN_SELBLOCK:PPIO_ENTRY:1200/ctxtS_ISTEN-HIGH").SetFocus
    session.findById("wnd[0]/usr/tabsTABSTRIP_SELBLOCK/tabpSEL_00/ssub%_SUBSCREEN_SELBLOCK:PPIO_ENTRY:1200/ctxtS_ISTEN-HIGH").caretPosition = 0
    session.findById("wnd[0]").sendVKey 4
    session.findById("wnd[1]/usr/cmbWORKFLDS-MONTH").SetFocus
    session.findById("wnd[1]/usr/cmbWORKFLDS-MONTH").Key = "1"
    session.findById("wnd[1]/usr/cmbWORKFLDS-YEARN").SetFocus
    session.findById("wnd[1]/usr/cmbWORKFLDS-YEARN").Key = "2050"
    session.findById("wnd[1]/usr/sub:SAPLSHLC:0200[0]/txtIOWORKFLDS-DAY06[0,15]").SetFocus
    session.findById("wnd[1]/usr/sub:SAPLSHLC:0200[0]/txtIOWORKFLDS-DAY06[0,15]").caretPosition = 1
    session.findById("wnd[1]").sendVKey 2
    session.findById("wnd[0]/tbar[1]/btn[8]").press
    session.findById("wnd[0]/usr/cntlCUSTOM/shellcont/shell/shellcont/shell").currentCellRow = -1
    session.findById("wnd[0]/usr/cntlCUSTOM/shellcont/shell/shellcont/shell").selectColumn "GWEMG"
    session.findById("wnd[0]/usr/cntlCUSTOM/shellcont/shell/shellcont/shell").pressToolbarButton "&NAVIGATION_PROFILE_TOOLBAR_EXPAND"
    session.findById("wnd[0]/usr/cntlCUSTOM/shellcont/shell/shellcont/shell").pressToolbarContextButton "&MB_SUM"
    session.findById("wnd[0]/usr/cntlCUSTOM/shellcont/shell/shellcont/shell").selectContextMenuItem "&SUMC"
    
    '关键:获取ALV网格对象并提取合计值
    Set alvGrid = session.findById("wnd[0]/usr/cntlCUSTOM/shellcont/shell/shellcont/shell")
    totalValue = alvGrid.GetTotal("GWEMG") '获取GWEMG列的合计值
    
    '将合计值写入Excel指定单元格(示例为TEST表A1)
    WS.Range("A1").Value = totalValue
    
    '返回主页面
    session.findById("wnd[0]").resizeWorkingPane 126, 43, False
    session.findById("wnd[0]/tbar[0]/btn[15]").press
    session.findById("wnd[0]").resizeWorkingPane 126, 43, False
    session.findById("wnd[0]/tbar[0]/btn[15]").press
    
End Sub

代码说明

  • 新增alvGrid变量绑定SAP的ALV网格控件
  • 通过alvGrid.GetTotal("GWEMG")直接获取目标列的合计值,无需关心合计行位置
  • 将获取到的totalValue写入Excel工作表的指定单元格,替换原有的手动录入步骤

内容的提问来源于stack exchange,提问作者lexmrk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 20:29:49