首页 文章

SAP VBS和VBA - 使用RefNummber(Excel) - 从GridView(SAP)复制数据 - 粘贴回Excel?

提问于
浏览
1

我是VBA和SAP GUI Scirpting的新手 . 我需要帮助在录制的VBScript中实现代码 .

我有一张Excel工作表,其中使用参考编号将数据从TM03导入Excel工作表 . 这部分工作正常 .

代码:

Public Sub RunGUIScript(currentline As Integer)

Dim W_Ret As Boolean

W_Ret = Attach_Session
If Not W_Ret Then
    Exit Sub
End If

On Error GoTo myerr


objSess.FindById("wnd[0]").maximize
objSess.FindById("wnd[0]/tbar[0]/okcd").Text = "/ntm03" 'TM03
objSess.FindById("wnd[0]").SendVKey 0

objSess.FindById("wnd[0]/usr/ctxtVTMFHA-BUKRS").Text = "0050" ' Company Code
objSess.FindById("wnd[0]/usr/ctxtVTMFHA-RFHA").Text = Cells(currentline, 1).Value ' Referenze Nummer
objSess.FindById("wnd[0]").SendVKey 0

Cells(currentline, 6).Value = objSess.FindById("wnd[0]/usr/tabsTS00/tabpBASE/ssubTS00_SUB:SAPLTM00:1203/ctxtVTMFHAZU-XVTRAB").Text ' Abschlussdatum
Cells(currentline, 9).Value = objSess.FindById("wnd[0]/usr/tabsTS00/tabpBASE/ssubTS00_SUB:SAPLTM00:1203/txtVTMFHA-KONTRH").Text ' Geschäftspartner
Cells(currentline, 11).Value = objSess.FindById("wnd[0]/usr/tabsTS00/tabpBASE/ssubTS00_SUB:SAPLTM00:1203/txtVTMHPTBWG-XZBETR").Text ' Zahlungsbetrag
Cells(currentline, 16).Value = objSess.FindById("wnd[0]/usr/tabsTS00/tabpBASE/ssubTS00_SUB:SAPLTM00:1203/subDATES:SAPLTM00:0011/ctxtVTMFHAZU-XBLFZ").Text 'Laufzeit Beginn
Cells(currentline, 17).Value = objSess.FindById("wnd[0]/usr/tabsTS00/tabpBASE/ssubTS00_SUB:SAPLTM00:1203/subDATES:SAPLTM00:0011/ctxtVTMFHAZU-XELFZ").Text 'Laufzeit Ende
Cells(currentline, 19).Value = objSess.FindById("wnd[0]/usr/tabsTS00/tabpBASE/ssubTS00_SUB:SAPLTM00:1203/txtVTMHPTBWG-XNWHR").Text ' Nominalbetrag


' Setting the line status to completed
Cells(currentline, 2).Value = 1
Exit Sub

myerr:
' Some error occured
' Setting the line status to Failed
Cells(currentline, 2).Value = 2


End Sub

Sub StartExtract()
Dim currentline As Integer

    ' This is the system to connect to
    W_System = "Z2L100"
    ' We start looking for order numbers from line 8 in the sheet
    currentline = 8
    While Cells(currentline, 1).Value <> ""
        ' Only process this line if the status is "to be processed"
        If Cells(currentline, 2).Value = 0 Then
            ' Run the actual GUI script
            RunGUIScript currentline
        End If
        ' move to the next line
        currentline = currentline + 1
    Wend


    ' Update the current date and time
    Cells(2, 3).Value = Now()
    objSess.EndTransaction




End Sub

正如您所看到的那样,状态已完成,并且如果没有更多的参考号来搜索它停止 . 没关系 .

第二步是采用Referenze数字(这里我必须将ASTERIX连接到Referenze数字 - 示例[* 12345]并且结束日期将其粘贴到SAP搜索条件中,打开并从GridView中获取数据并将其粘贴回表格 .

这是SAP GUI Scripting生成的代码:

objSess.FindById("wnd[0]/tbar[0]/okcd").Text = "/nse16"
objSess.FindById("wnd[0]").SendVKey 0
objSess.FindById("wnd[0]/usr/ctxtDATABROWSE-TABLENAME").Text = "VTBFHAZU"
objSess.FindById("wnd[0]").SendVKey 0
objSess.FindById("wnd[0]").SendVKey 17
objSess.FindById("wnd[1]/usr/txtENAME-LOW").Text = ""
objSess.FindById("wnd[1]/usr/txtENAME-LOW").SetFocus
objSess.FindById("wnd[1]/usr/txtENAME-LOW").caretPosition = 0
objSess.FindById("wnd[1]/tbar[0]/btn[8]").Press
objSess.FindById("wnd[1]/usr/cntlALV_CONTAINER_1/shellcont/shell").CurrentCellRow = 2
objSess.FindById("wnd[1]/usr/cntlALV_CONTAINER_1/shellcont/shell").SelectedRows = "2"
objSess.FindById("wnd[1]/tbar[0]/btn[2]").Press
objSess.FindById("wnd[0]/usr/ctxtI4-LOW").Text = "06.08.2018" ' CLOSING DATE
objSess.FindById("wnd[0]/usr/ctxtI4-LOW").SetFocus
objSess.FindById("wnd[0]/usr/ctxtI4-LOW").caretPosition = 10
objSess.FindById("wnd[0]").SendVKey 0
objSess.FindById("wnd[0]/usr/txtI14-LOW").Text = "*25750" ' ASTERIX (*) & REFERENZE NUMBER from Excel
objSess.FindById("wnd[0]/usr/txtI14-LOW").SetFocus
objSess.FindById("wnd[0]/usr/txtI14-LOW").caretPosition = 6
objSess.FindById("wnd[0]").SendVKey 0
objSess.FindById("wnd[0]").SendVKey 8

' Store The GridView As Local Object

Set GridView = objSess.FindById("wnd[0]/usr/cntlGRID1/shellcont/shell")
' Extract The Column Titles

For i = 0 To GridView.ColumnCount - 1
    Cells(9, i + 1).Value = GridView.GetColumnTitles(GridView.ColumnOrder(i))(0)
Next i
' Extract The Content

For i = 0 To GridView.ColumnCount - 1
   For j = 0 To GridView.RowCount - 1
       Cells(10 + j, i + 1).Value = GridView.GetCellValue(j, GridView.ColumnOrder(i))
   Next j
Next i

此代码将我提取 Headers 名称,其中包含63列的adittional 2行 . 其实我不需要所有的数据 . 从GridView我只需要:

第1行第3列第1行第37列第2行第3列第2列第37列

粘贴回活动的Excel工作表行 . (见附图)

然后是下一个参考数量 .

Excel表格:

Excel-Where the data should be imported/pasted from the GridView

对于具有编程技能的人来说,这应该不复杂 . 我希望有人能帮助我 .

我没有写上面的代码 . 我使用代码并使用SAP GUI Recording实现它,并将单元格引用到excel中 . 这里的目标是在一个vba模块中实现所有功能 .

提前致谢 !由于这是我的第一篇文章,我希望你不要对我苛刻:)我将留在这里与经验丰富的人学习 . 感谢您分享你的知识!分享是关怀!

干杯 .

1 回答

  • 0

    大家好,感谢您的意见 .

    将GridView设置为Object后,我使用了函数getCellValue . 对于行,您需要使用索引位置,对于列,需要使用列的名称来获取单元格值 .

    我用这几行代码解决了这个问题:

    Set GridView = objSess.FindById("wnd[0]/usr/cntlGRID1/shellcont/shell") '-Store The GridView As Local Object
    
            Cells(currentline, 10) = GridView.GetCellValue(0, "RFHA")       '-Getting The Data From SAP GridView Into Excel
            Cells(currentline, 12) = GridView.GetCellValue(0, "KKURS")
    
            Cells(currentline, 20) = GridView.GetCellValue(1, "RFHA")
            Cells(currentline, 22) = GridView.GetCellValue(1, "KKURS")
    

    干杯 .

相关问题