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
相关产品推荐
相关产品推荐

