SAP GUI自动化脚本优化:如何自动定位到表格最后一行?
SAP GUI网格自动滚动至底部的解决方案
核心思路
SAP GUI的网格控件自带总行数、可见行数的属性,无需反复循环试错,直接计算最后一屏的起始行位置即可一步到位;如果偏好逐屏验证的逻辑,也可通过循环判断滚动状态实现。
方案一:直接计算(高效推荐)
利用网格的RowCount(总行数)和VisibleRowCount(当前可见行数)属性,直接算出最后一屏的firstVisibleRow值,一次性跳转到底部。
修改后的完整脚本:
Sub AUTOMATE() Dim App As Object Dim Connection As Object Dim session As Object Dim grid As Object '定义网格对象,简化重复代码 If Not IsObject(App) Then Set SapGuiAuto = GetObject("SAPGUI") Set App = SapGuiAuto.GetScriptingEngine End If If Not IsObject(Connection) Then Set Connection = App.Children(0) End If If Not IsObject(session) Then Set session = Connection.Children(0) End If If IsObject(WScript) Then WScript.ConnectObject session, "on" WScript.ConnectObject Application, "on" End If session.findById("wnd[0]").maximize Set grid = session.findById("wnd[0]/usr/cntlGRID1/shellcont/shell/shellcont[1]/shell") '选择目标列 grid.setCurrentCell -1, "FEVOR" grid.selectColumn "FEVOR" '第一列 grid.selectColumn "AUFNR" '第二列 '计算并跳转至最后一屏 Dim lastFirstVisibleRow As Integer lastFirstVisibleRow = grid.RowCount - grid.VisibleRowCount If lastFirstVisibleRow < 0 Then lastFirstVisibleRow = 0 '处理数据不足一屏的情况 grid.firstVisibleRow = lastFirstVisibleRow '复制所选内容 grid.contextMenu grid.selectContextMenuItemByPosition "0" '粘贴到Excel Range("F2").Select ActiveSheet.Paste End Sub
关键代码说明
Set grid = ...:将网格控件赋值给变量,避免重复书写冗长的findById路径,提升代码可读性。grid.RowCount:获取网格的总行数(包含所有数据行)。grid.VisibleRowCount:获取当前屏幕可见的行数。lastFirstVisibleRow = grid.RowCount - grid.VisibleRowCount:计算最后一屏的起始行索引(网格行索引从0开始),确保最后一行显示在屏幕内。
方案二:循环滚动(备选)
如果需要逐屏滚动验证是否到达底部,可使用循环逻辑:
'替换方案一中的跳转代码为以下循环 Dim currentFirstRow As Integer Do currentFirstRow = grid.firstVisibleRow grid.firstVisibleRow = currentFirstRow + grid.VisibleRowCount '每次滚动一屏 Loop Until grid.firstVisibleRow = currentFirstRow '滚动后无变化,说明已到底部
原理
每次滚动一屏后,检查firstVisibleRow是否和滚动前一致——若一致,说明无法继续向下滚动,已到达网格底部。
内容的提问来源于stack exchange,提问作者Lucas Tezolini
相关产品推荐
相关产品推荐

