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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 11:10:20