如何通过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
相关产品推荐
相关产品推荐

