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

SAP GridView导出Excel行数据不全问题咨询

SAP GridView VBA导出数据不完整问题解决

问题说明

使用VBA从SAP GridView导出数据时,小数据量场景下代码可正常运行,但数据行数较多时(例如总行数240条仅能获取52条)无法导出全部数据,询问SAP GridView是否存在循环/范围限制。

当前使用代码

session.FindById("wnd[0]/tbar[0]/okcd").Text = "/NZFPAYADVINFO"
session.FindById("wnd[0]").sendVKey 0
session.FindById("wnd[0]/usr/ctxtSP$00001-LOW").Text = "AR02"
session.FindById("wnd[0]/tbar[1]/btn[8]").press
session.FindById("wnd[0]/usr/cntlGRID1/shellcont/shell").setCurrentCell -1, "AVIK-AVTXT"
session.FindById("wnd[0]/usr/cntlGRID1/shellcont/shell").selectColumn "AVIK-AVTXT"
session.FindById("wnd[0]/tbar[1]/btn[29]").press
session.FindById("wnd[1]/usr/ssub%_SUBSCREEN_FREESEL:SAPLSSEL:1105/btn%_%%DYN001_%_APP_%-VALU_PUSH").press
session.FindById("wnd[2]/tbar[0]/btn[24]").press
session.FindById("wnd[2]/tbar[0]/btn[8]").press
session.FindById("wnd[1]/tbar[0]/btn[0]").press
session.FindById("wnd[0]/usr/cntlGRID1/shellcont/shell").currentCellColumn = "AVIK-AVSID"

Dim myGrid2 As Object
Set myGrid2 = session.FindById("wnd[0]/usr/cntlGRID1/shellcont/shell")

allRows = myGrid2.RowCount - 1 ' Number of SAP rows
allCols = myGrid2.ColumnCount - 1 ' Number of SAP Columns

Dim columns2 As Object
Set columns2 = myGrid2.ColumnOrder ' SAP column names in order in SAP window

For i = 0 To allRows
   Cells(i + 4, 1).Value = myGrid2.GetCellValue(i, columns2(1))
Next i

MsgBox ("Completed")

原因分析

SAP GridView并非存在循环/范围限制,而是默认仅加载当前可见区域的数据。未滚动到的行不会被加载到前端内存中,此时通过RowCount能获取总行数,但GetCellValue只能读取已加载到内存的行(即当前可见行),这就导致了仅能获取部分数据的问题。

解决方案

方案1:循环滚动加载每行数据

在读取每行数据前,通过ScrollRow方法将该行滚动到可见区域,确保数据被加载到内存后再执行读取操作。修改后的代码如下:

session.FindById("wnd[0]/tbar[0]/okcd").Text = "/NZFPAYADVINFO"
session.FindById("wnd[0]").sendVKey 0
session.FindById("wnd[0]/usr/ctxtSP$00001-LOW").Text = "AR02"
session.FindById("wnd[0]/tbar[1]/btn[8]").press
session.FindById("wnd[0]/usr/cntlGRID1/shellcont/shell").setCurrentCell -1, "AVIK-AVTXT"
session.FindById("wnd[0]/usr/cntlGRID1/shellcont/shell").selectColumn "AVIK-AVTXT"
session.FindById("wnd[0]/tbar[1]/btn[29]").press
session.FindById("wnd[1]/usr/ssub%_SUBSCREEN_FREESEL:SAPLSSEL:1105/btn%_%%DYN001_%_APP_%-VALU_PUSH").press
session.FindById("wnd[2]/tbar[0]/btn[24]").press
session.FindById("wnd[2]/tbar[0]/btn[8]").press
session.FindById("wnd[1]/tbar[0]/btn[0]").press
session.FindById("wnd[0]/usr/cntlGRID1/shellcont/shell").currentCellColumn = "AVIK-AVSID"

Dim myGrid2 As Object
Set myGrid2 = session.FindById("wnd[0]/usr/cntlGRID1/shellcont/shell")

allRows = myGrid2.RowCount - 1 ' 获取总行数
Dim columns2 As Object
Set columns2 = myGrid2.ColumnOrder ' 获取列顺序

For i = 0 To allRows
    ' 滚动到当前行,触发数据加载
    myGrid2.ScrollRow i
    ' 可选:等待SAP完成数据加载,根据系统性能调整等待时长
    Application.Wait Now + TimeValue("00:00:00.5")
    ' 读取数据到Excel指定单元格
    Cells(i + 4, 1).Value = myGrid2.GetCellValue(i, columns2(1))
Next i

MsgBox ("Completed")

方案2:使用SAP自带导出功能(更高效)

如果业务允许,直接调用SAP GridView的原生导出功能(比如导出到Excel),无需逐行读取,效率更高且不会出现数据遗漏。示例代码片段如下:

' 点击GridView的导出按钮(需根据实际控件ID调整)
session.FindById("wnd[0]/tbar[1]/btn[30]").press
' 设置导出文件路径和名称
session.FindById("wnd[1]/usr/ctxtDY_PATH").Text = "C:\Your\Export\Path\"
session.FindById("wnd[1]/usr/ctxtDY_FILENAME").Text = "payadv_info.xlsx"
' 确认导出
session.FindById("wnd[1]/tbar[0]/btn[11]").press

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 22:28:12