如何检测FEBA事务码表格控件中的选中项(蓝色字体行)
SAP FEBA事务码表格选中状态检测代码优化
问题背景
处理电子银行对账单的SAP事务码FEBA时,需要识别表格中条目是否被选中:
- 选中项:蓝色字体,可点击
- 未选中项:常规字体,不可点击
现有VB遍历代码可遍历表格行,但无法检测选中状态,需优化。
关联控件路径
session.findById("wnd[0]/usr/tabsTS/tabpREST/ssubPAGE:SAPDF05X:6106/tblSAPDF05XTC_6106/txtDF05B-PSBET[11," & adjustedIndex & "]")
session.findById("wnd[0]/usr/tabsTS/tabpREST/ssubPAGE:SAPDF05X:6106/tblSAPDF05XTC_6106/txtDF05B-PSDIF[12," & adjustedIndex & "]")
原有遍历代码
Function LoopDataOriginal(session As Object) Dim rowCount As Integer Dim visibleRows As Integer Dim scrollPos As Integer Dim i As Integer Dim adjustedIndex As Integer Dim batchSize As Integer Dim endRow As Integer rowCount = session.findById("wnd[0]/usr/tabsTS/tabpREST/ssubPAGE:SAPDF05X:6106/tblSAPDF05XTC_6106").rowCount visibleRows = session.findById("wnd[0]/usr/tabsTS/tabpREST/ssubPAGE:SAPDF05X:6106/tblSAPDF05XTC_6106").VisibleRowCount batchSize = visibleRows For scrollPos = 0 To rowCount - 1 Step batchSize session.findById("wnd[0]/usr/tabsTS/tabpREST/ssubPAGE:SAPDF05X:6106/tblSAPDF05XTC_6106").verticalScrollbar.position = scrollPos endRow = scrollPos + batchSize - 1 If endRow >= rowCount Then endRow = rowCount - 1 For i = scrollPos To endRow adjustedIndex = i Mod visibleRows Debug.Print session.findById("wnd[0]/usr/tabsTS/tabpREST/ssubPAGE:SAPDF05X:6106/tblSAPDF05XTC_6106/txtDF05B-PSDIF[12," & adjustedIndex & "]").Text Debug.Print session.findById("wnd[0]/usr/tabsTS/tabpREST/ssubPAGE:SAPDF05X:6106/tblSAPDF05XTC_6106/txtDF05B-PSBET[11," & adjustedIndex & "]").Text 'to add to check for selected Next i Next scrollPos End Function
优化后代码(含选中状态检测)
优化点说明:
- 缓存表格对象,减少重复查找操作,提升效率
- 通过控件Enabled属性和表格行Selected属性两种方式检测选中状态(可根据实际SAP GUI响应情况选择)
- 输出选中状态标识
Function LoopDataWithSelectionCheck(session As Object) Dim rowCount As Integer Dim visibleRows As Integer Dim scrollPos As Integer Dim i As Integer Dim adjustedIndex As Integer Dim batchSize As Integer Dim endRow As Integer ' 缓存表格对象,避免重复查找 Dim tbl As Object Set tbl = session.findById("wnd[0]/usr/tabsTS/tabpREST/ssubPAGE:SAPDF05X:6106/tblSAPDF05XTC_6106") rowCount = tbl.rowCount visibleRows = tbl.VisibleRowCount batchSize = visibleRows For scrollPos = 0 To rowCount - 1 Step batchSize tbl.verticalScrollbar.position = scrollPos endRow = scrollPos + batchSize - 1 If endRow >= rowCount Then endRow = rowCount - 1 For i = scrollPos To endRow adjustedIndex = i Mod visibleRows ' 获取当前行的两个单元格控件 Dim psdifCtrl As Object Dim psbetCtrl As Object Set psdifCtrl = tbl.findById("txtDF05B-PSDIF[12," & adjustedIndex & "]") Set psbetCtrl = tbl.findById("txtDF05B-PSBET[11," & adjustedIndex & "]") ' 方式1:通过控件Enabled属性判断(未选中项不可点击,Enabled为False) Dim isEnabled As Boolean isEnabled = psbetCtrl.Enabled ' 取任意一个可点击的控件判断即可 ' 方式2:通过表格行的Selected属性判断(部分SAP表格支持直接获取行选中状态) Dim isSelected As Boolean isSelected = tbl.Rows(i).Selected ' 输出单元格文本及选中状态 Debug.Print "行号:" & i + 1 & " | PSDIF值:" & psdifCtrl.Text & " | PSBET值:" & psbetCtrl.Text Debug.Print "是否可点击(Enabled):" & isEnabled & " | 是否选中(Selected):" & isSelected Debug.Print "-------------------------" Next i Next scrollPos End Function
注意事项
- 若
tbl.Rows(i).Selected报错,说明该SAP表格不支持直接访问行的Selected属性,可仅保留Enabled属性检测方式 - 测试时需确认选中项的
Enabled属性是否为True,未选中项为False,若实际情况相反,需调整判断逻辑 - 缓存表格对象可大幅提升遍历效率,避免频繁调用
findById
内容的提问来源于stack exchange,提问作者sephiroth
相关产品推荐
相关产品推荐

