excel - 在 VA02 表格控件中读取文本

标签 excel vba sap-erp sap-gui

我对 SAP VA02 有疑问,我想在其中识别特定标签所在的行。在这种情况下,标签/文本是“Cust.expected price”。
我正在尝试更改此行旁边的数据,问题是它并不总是同一行,有时是 16、18 等。
我试图找到一种方法来遍历结构中第 2 列中的每一行,阅读文本,并找到标签所在的行,然后使用该行作为变量将价格粘贴到正确的单元格中。我在下面粘贴了一些功能代码。
我正在做的是在这里输入正确的价格:session.findById("wnd[0]/usr/tabsTAXI_TABSTRIP_ITEM/tabpT\05/ssubSUBSCREEN_BODY:SAPLV69A:6201/tblSAPLV69ATCTRL_KONDITIONEN/txtKOMV-KBETR[3,16]").Text = Price 我的主要问题是如何阅读每个单元格中的文本,例如 session.findById("wnd[0]/usr/tabsTAXI_TABSTRIP_ITEM/tabpT\05/ssubSUBSCREEN_BODY:SAPLV69A:6201/tblSAPLV69ATCTRL_KONDITIONEN/txtKOMV-KBETR[2,16]")我可能可以从那里弄清楚其余的。我无法找到关于这个特定结构的太多信息,感谢任何输入。我还将发布页面截图以供引用。谢谢!
The page in question

Sub OrderRelease()

Dim Order As String
Dim RowCount As Integer
Dim Item As Integer
Dim sh As Worksheet
Dim rw As Range
Dim Sroll As Integer
Dim Price As Double

On Error Resume Next


RowCount = 0
Set sh = ActiveSheet
For Each rw In sh.Rows

  If sh.Cells(rw.Row, 6).Value = "" Then
    Exit For
  End If

  RowCount = RowCount + 1

Next rw

If Not IsObject(SAPGuiApp) Then
   Set SapGuiAuto = GetObject("SAPGUI")
   Set SAPGuiApp = SapGuiAuto.GetScriptingEngine
End If
If Not IsObject(Connection) Then
   Set Connection = SAPGuiApp.Children(0)
End If
If Not IsObject(SAP_session) Then
   Set session = Connection.Children(0)
End If
If IsObject(WScript) Then
   WScript.ConnectObject SAP_session, "on"
   WScript.ConnectObject SAPGuiApp, "on"
End If

session.findById("wnd[0]").maximize
session.findById("wnd[0]/tbar[0]/okcd").Text = "/nva02"
session.findById("wnd[0]").sendVKey 0

For i = 2 To RowCount
    Order = Cells(i, "F")
    
    session.findById("wnd[0]/usr/ctxtVBAK-VBELN").Text = Order
    session.findById("wnd[0]/usr/ctxtVBAK-VBELN").caretPosition = 9
    session.findById("wnd[0]").sendVKey 0
    session.findById("wnd[1]/tbar[0]/btn[0]").press
    
Continue:

    Item = Cells(i, "G") / 10 - 1
    Scroll = Item - 1
    Price = Cells(i, "H")

    Set sub = session.findById("wnd[0]/usr/tabsTAXI_TABSTRIP_OVERVIEW/tabpT\02/ssubSU" _
              & "BSCREEN_BODY:SAPMV45A:4401/subSUBSCREEN_TC:SAPMV45A:4900")
    Set tbl = sub.findById("tblSAPMV45ATCTRL_U_ERF_AUFTRAG")

    tbl.verticalScrollbar.Position = Scroll
    tbl.getAbsoluteRow(Item).Selected = True
    tbl.findById("txtVBAP-POSNR[0,8]").SetFocus
    tbl.findById("txtVBAP-POSNR[0,8]").caretPosition = 4
 
    sub.findById("subSUBSCREEN_BUTTONS:SAPMV45A:4050/btnBT_PKON").press


    Set tbl2 = session.findById("wnd[0]/usr/tabsTAXI_TABSTRIP_ITEM/tabpT\05/ssubSU" _
               & "BSCREEN_BODY:SAPLV69A:6201/tblSAPLV69ATCTRL_KONDITIONEN")

    tbl2.verticalScrollbar.Position = 8

'The below line is what I need to find. In this case, Cust. expected price would be 2,16,
'but I have not found a way to actually read the text in that cell.
    tbl2.findById("txtKOMV-KBETR[3,16]").Text = Price
    tbl2.findById("txtKOMV-KBETR[3,16]").SetFocus
    tbl2.findById("txtKOMV-KBETR[3,16]").caretPosition = 16

    session.findById("wnd[0]/usr/tabsTAXI_TABSTRIP_ITEM/tabpT\11").Select
    session.findById("wnd[0]/usr/tabsTAXI_TABSTRIP_ITEM/tabpT\11/ssubSU" _
        & "BSCREEN_BODY:SAPMV45A:4456/cmbVBAP-ABGRU").Key = " "

    session.findById("wnd[0]/tbar[0]/btn[3]").press
    session.findById("wnd[0]/usr/btnBUT2").press
    session.findById("wnd[1]/tbar[0]/btn[0]").press
    session.findById("wnd[0]").sendVKey 0

    If Cells(i, "F") = Cells(i + 1, "F") Then
        i = i + 1
        GoTo Continue
    End If

    session.findById("wnd[0]").sendVKey 11
    session.findById("wnd[1]/tbar[0]/btn[0]").press
    session.findById("wnd[1]/usr/btnSPOP-VAROPTION1").press

Next i

End Sub

最佳答案

以下是如何引用给定行和给定列中单元格的值,它们都在变量中提供:

row = 0
column = 1
cellText = session.findById(".../tblXXXXX/columnFieldName[" & column & "," & row & "]").Text
另一种解决方案是在 Table Control 对象上使用 GetCell 方法:
cellText = session.findById(".../tblXXXXX").GetCell(row,column).Text
注意:请注意行和列参数已切换。
了解 使用什么值".../tblXXXXX/columnFieldName[...] ,最简单的方法是记录一个脚本,只需将光标移动到所需的列。生成的脚本将返回类似的内容(使用演示程序测试DEMO_DYNPRO_TABCONT_LOOPFLIGHTS):
session.findById("wnd[0]/usr/tblDEMO_DYNPRO_TABCONT_LOOPFLIGHTS/ctxtDEMO_CONN-CITYFROM[2,1]").setFocus
session.findById("wnd[0]/usr/tblDEMO_DYNPRO_TABCONT_LOOPFLIGHTS/ctxtDEMO_CONN-CITYFROM[2,1]").caretPosition = 1
行号 对应于可见行之间的顺序,从 0 开始(0 = 第一个可见行)。最后一个可见行的编号等于表格控件属性 VisibleRowCount减 1. 可以通过使脚本垂直滚动来访问不可见的行(上方和下方),有关以编程方式滚动的更多信息,请参见下面的章节。
列号 是基于表格控件中显示的列的顺序,无论这些列是立即可见的还是水平滚动后可见的。该脚本不需要执行水平滚动来读取不可见列的值。 0 是最左列,最右列的数字等于表格控件的两个属性 Columns.Count负 1。
  • 列列表及其顺序可能会根据事件的表格控制配置而有所不同。您可能希望在运行时根据列名确定列号,具体请参见下面的章节。
  • 可能还有其他列通过 Table Control administrator function 提出的。 ,选中“隐藏”复选框。 SAP GUI 脚本完全忽略这些列。如果你需要和他们一起工作,你必须调用表格控制方法ConfigureLayout显示管理员屏幕,然后您可以像处理任何其他屏幕一样处理设置。

  • 滚动行
    对于表控件,SAP GUI 脚本仅知道当前在屏幕上可见的行中的数据,因为出于性能原因,后端 ABAP 程序仅将这些行发送到前端。 SAP GUI 脚本无法知道不可见行的值。要求脚本垂直滚动以获取其他行。 关注 ,滚动意味着重新加载整个屏幕,因此需要重新实例化屏幕元素。以下示例滚动整个列表以显示第一列中的所有值(使用演示程序 DEMO_DYNPRO_TABCONT_LOOPFLIGHTS ):
    Set tbl = session.findById("wnd[0]/usr/tblDEMO_DYNPRO_TABCONT_LOOPFLIGHTS")
    ' Make the first row visible (show the top of the list) -> that calls the back-end system and screen is reloaded.
    ' ATTENTION: when the back-end is called, to continue working with screen elements, they must be re-instantiated.
    tbl.VerticalScrollbar.Position = 0
    
    TextsOfAllCellsInColumnZero = ""
    Do While True
      ' Re-instantiate the Table Control element (mandatory each time the back-end is called)
      Set tbl = session.findById("wnd[0]/usr/tblDEMO_DYNPRO_TABCONT_LOOPFLIGHTS")
      visibleRow = 0
      currentScrollbarPosition = tbl.VerticalScrollbar.Position
      While visibleRow < tbl.VisibleRowCount And currentScrollbarPosition <= tbl.VerticalScrollbar.Maximum
        TextsOfAllCellsInColumnZero = TextsOfAllCellsInColumnZero & tbl.GetCell(visibleRow,0).Text & Chr(10)
        visibleRow = visibleRow + 1
        currentScrollbarPosition = currentScrollbarPosition + 1
      Wend
      If currentScrollbarPosition > tbl.VerticalScrollbar.Maximum Then
        Exit Do
      End If
      tbl.VerticalScrollbar.Position = currentScrollbarPosition
    Loop
    MsgBox TextsOfAllCellsInColumnZero
    
    请注意,此示例适用于少量页面。在许多其他情况下,页面更多,对于搜索包含给定值的行之类的操作,单击现有按钮以执行该值的后端搜索会执行得更多。右侧页面将立即显示。
    在运行时根据列名确定列号
    如上所述,列号可能会根据列的顺序和隐藏列而有所不同。如果它们在运行时以未确定的方式变化,则以下代码允许根据列名确定列号(请注意,要删除字段名的小写前缀,如“ctxtDEMO_CONN-CITYFROM”中的“ctxt” "),但仅在至少有 1 行时才有效(如果 Table Control 为空时需要,则找不到解决方案):
    Set tbl = session.findById("wnd[0]/usr/tblDEMO_DYNPRO_TABCONT_LOOPFLIGHTS")
    column = GetColumnNumberByName(tbl,"DEMO_CONN-CITYFROM")
    msgbox tbl.GetCell(row,column).text
    
    Function GetColumnNumberByName( TableControl, ColumnName )
      If TableControl.Rows.Count > 0 Then
        For i = 0 To TableControl.Columns.Count - 1
          If TableControl.Columns(i)(0).Name = ColumnName Then
            GetColumnNumberByName = i
            Exit Function
          End If
        Next
      End If
      GetColumnNumberByName = -1
    End Function
    
    附录
    更多信息请引用documentation of the "GuiTableControl Object" in the SAP Library .
    注意:如果您查看其他问题,请注意表格控件( GuiTableControl )与 GridView ( GuiGridView )完全无关,所以不要混淆。

    关于excel - 在 VA02 表格控件中读取文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68685911/

    相关文章:

    connector - "SAP Java Connector"的 future

    sap-erp - SAP ERP 中销售组织、销售办事处和销售组之间的关系

    abap - 确定当前 MM 周期?

    ms-access - Access 获取共享文件夹 session 的子文件夹

    excel - 使用 VBScript 以独占模式打开 Excel 文件

    excel - 新工作表上的 VBA 数据透视表

    excel - 在 VBA Excel 2003 中获取 "My Documents"文件夹的独立于语言的方法

    excel - 如何在excel vba中添加段落或中断

    java - 使用 jxls 写入大量行以在 java 中表现出色

    vba - 查找以 "Email"VBA 开头的列