SAP GUI:编写VBA复制BOM时如何获取物料总行数?
解决SAP BOM总行数统计的靠谱方法
嘿,这个问题我之前帮不少同行踩过坑——SAP GUI脚本录制出来的相对行号确实鸡肋,滚动后就重置,完全没法准确统计真实的BOM总行数。给你几个实用的解决方案,按靠谱程度排序:
1. 用SAP标准RFC函数(最推荐)
直接调用SAP的CSAP_MAT_BOM_READ函数,这是SAP官方提供的BOM读取API,完全绕开界面限制,能直接获取指定物料BOM的所有行项目。在VBA里通过RFC调用它,返回的T_STPOX表的行数就是你要的总物料行数量。
具体步骤:
- 在VBA里配置SAP RFC连接(需要确保系统允许RFC调用,且你有相关权限)
- 设置函数参数:物料号(
MATNR)、工厂(WERKS)、BOM用途(STLAN)等关键信息 - 执行函数后,读取输出表
T_STPOX的行数即可
这个方法的优势是:不受界面分页/滚动影响,支持大批量BOM,数据准确率100%。
2. 利用SAP表格控件的GetAllRows方法
如果不想折腾RFC,直接在界面上操作的话,SAP的表格控件提供了GetAllRows()方法,可以一次性获取所有行的数据(不管是否在当前屏幕显示),然后通过数组长度统计总行数。
示例VBA代码:
Sub GetBOMTotalRows() Dim sapSession As SAPGuiSession Dim bomTable As SAPGuiCtrl.SAPGuiTable Dim allBOMRows As Variant Dim totalRowCount As Integer ' 假设已连接SAP并打开目标BOM界面(如CS02/CS03) Set sapSession = Application.ActiveSession Set bomTable = sapSession.findById("wnd[0]/usr/tabsTS_ITOV/tabpTCMA/ssubSUBPAGE:SAPLCSDI:0152/tblSAPLCSDITCMAT") ' 获取所有BOM行数据 allBOMRows = bomTable.GetAllRows() ' 数组从0开始,所以总行数是UBound+1 totalRowCount = UBound(allBOMRows, 1) + 1 MsgBox "当前BOM的物料行总数:" & totalRowCount End Sub
注意事项:
- 要先在VBA编辑器的「工具->引用」里勾选「SAP GUI Scripting API」
- 这个方法获取的是当前层级的BOM行数,如果是多层BOM,需要递归处理各子项
3. 切换到BOM概览视图
在CS02/CS03事务码里,按F5或者点击菜单栏「编辑->显示概览」,切换到概览视图。这个视图会尽可能显示更多BOM行(如果数量极大还是会分页,但多数场景下能显示全部),然后直接读取表格的RowCount属性:
totalRowCount = bomTable.RowCount
如果概览视图还是分页,结合上面的GetAllRows方法依然能拿到准确数量。
内容的提问来源于stack exchange,提问作者bcherb2
相关产品推荐
相关产品推荐

