当前位置: 首页 > 知识库问答 >
问题:

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

祁雪峰
2023-03-14

我是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号码可供搜索,则停止。没关系。

第二步是获取Referenze号(这里我必须将一个星号连接到Referenze号--示例[*12345]&关闭日期,将其粘贴到SAP搜索条件中,从GridView打开并调整数据,然后将其粘贴回工作表中。

下面是SAP GUI脚本生成的代码:

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

这段代码提取我的头名,附加的2行63列。实际上,我不需要所有的数据。在GridView中,我只需要:

行1列3行1列37和行2列3行2列37

重新粘贴到活动的excel工作表行中。(见附图)

然后进行下一次公民投票。

Excel表:

干杯。

共有1个答案

万俟招
2023-03-14

大家好,感谢您的观点。

在将GridView设置为对象之后,我使用了函数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")

干杯。

 类似资料:
  • 我需要对SAP做一个大规模的改变。因此,我想有一个宏,复制3个不同的列从excel到sap(约3000行) 销售订单#-数据1-数据2 从excel复制销售订单-执行事务处理/NVA02-粘贴 在excel中复制数据1-在Sap中粘贴 在excel中复制数据2-在Sap中粘贴 下一个销售订单等直到最后一行 excel工作表将由多人用户使用,例如活动工作簿将比路径更有帮助 你能帮我提供一个VBA代码

  • 谢谢你阅读我的问题。 我有一个表[ws1(A4:Q500)]包含数据,而Q列后面有公式。因此,我无法复制整行,只能复制文本中的特定范围。 Q列是定义数据是否属于周期的公式,即11月16日至11月30日的数据。标志如下: 0 1 = 16/11 - 30/11 2. 这里的目标是将带有标志“1”的ws1数据复制到[ws2(A2:P200)],然后删除带有标志“1”和“2”的ws1数据 相信复制和删除

  • 下面列出了完整的代码,我正在将数据透视表中DB10单元格的数据复制到Checklist表中的第N列--还要注意Checklist表中的行是动态的,每周增长3018行...这是减慢处理时间的部分(我对其进行了计时,在运行代码时完成处理需要大约8分钟)这部分是减慢处理速度的地方: 完整代码:

  • 问题内容: 当我尝试使用粘贴到单元格时,我要粘贴的单元格保持空白,但setValueAt()似乎可以正常工作。另外,当我尝试从一个单元格剪切或复制JPopupMenu时,如果要粘贴到另一个单元格,则我的“粘贴”选项将保持禁用状态。我不知道为什么。我的代码如下。 Here’s my code for 问题答案: 根据您的示例代码,并且必须填写空白,它对 我有用… Now, maybe you’d l

  • 我正试图将一组数据从一个工作簿复制到另一个工作簿,假设我要将数据从a册复制到B册。首先,我要去BookA册复制列表,然后去BookB册运行copydata宏下面(我想在回到BookB册的前一个工作表之前将数据粘贴到新工作表上。) 由于工作表类的粘贴方法失败,宏在第6行失败。有人知道怎么修好它吗?