将行号存储在 VBS 脚本中作为变量并引用它
Store the row number in a VBS script as variable and refer to it
我正在从 VBA 编写脚本并在 SAP GUI 屏幕中使用记录的操作。我想让脚本输入某个交易粘贴某个值(合约编号),然后转到table中的某个行,双击它并在里面做某个动作。
我在 VBA 中使用 while 循环,在 Excel sheet 中我存储合同号,脚本应该双击然后粘贴的行号输入后我需要的值。它应该这样做,直到 a 列中的单元格为空。
您可以在下面代码的 VBS 部分看到,我尝试用变量“行”替换行号,但代码不接受。
如果我在那里留下一个数字,它实际上会做我想做的,只要这个数字是我尝试做的正确的数字。
有人可以帮我解决这个问题吗?如果行号的可能性数量有限,我会使用 if 语句解决这个问题,但这可能意味着代码很长,并且可能会遗漏某些内容。
是否可以让行号引用代码中的变量。
我已经尝试过在 VBS 中声明变量,但效果不佳。
代码:
'We declared the parameter for the while function in excel
Dim cont As String
Dim row As Integer
Dim rep As String
Dim j As Integer
j = 2
With ThisWorkbook
While Cells(j, 1) <> ""
cont = Cells(j, 1).Value
row = Cells(j, 3).Value
rep = Cells(j, 4).Value
Set SapGuiAuto = GetObject("SAPGUI")
Set SAPApp = SapGuiAuto.GetScriptingEngine
Set SAPCon = SAPApp.Children(0)
Set Session = SAPCon.Children(0)
If IsObject(WScript) Then
WScript.ConnectObject Session, "on"
WScript.ConnectObject Application, "on"
End If
Session.findById("wnd[0]").maximize
Session.findById("wnd[0]/usr/ctxtVBAK-VBELN").Text = cont
Session.findById("wnd[0]/usr/ctxtVBAK-VBELN").caretPosition = 8
Session.findById("wnd[0]").sendVKey 0
Session.findById("wnd[0]/usr/tabsTAXI_TABSTRIP_OVERVIEW/tabpT/ssubSUBSCREEN_BODY:SAPMV45A:4426/subSUBSCREEN_TC:SAPMV45A:4908/tblSAPMV45ATCTRL_U_ERF_KONTRAKT/ctxtVBAP-KDMAT[5,row]").SetFocus
Session.findById("wnd[0]/usr/tabsTAXI_TABSTRIP_OVERVIEW/tabpT/ssubSUBSCREEN_BODY:SAPMV45A:4426/subSUBSCREEN_TC:SAPMV45A:4908/tblSAPMV45ATCTRL_U_ERF_KONTRAKT/ctxtVBAP-KDMAT[5,row]").caretPosition = 6
Session.findById("wnd[0]").sendVKey 2
Session.findById("wnd[0]/usr/tabsTAXI_TABSTRIP_ITEM/tabpT").Select
Session.findById("wnd[0]/usr/tabsTAXI_TABSTRIP_ITEM/tabpT/ssubSUBSCREEN_BODY:SAPMV45A:4454/ctxtVBAP-KDMAT").Text = rep
Session.findById("wnd[0]/usr/tabsTAXI_TABSTRIP_ITEM/tabpT/ssubSUBSCREEN_BODY:SAPMV45A:4454/ctxtVBAP-KDMAT").SetFocus
Session.findById("wnd[0]/usr/tabsTAXI_TABSTRIP_ITEM/tabpT/ssubSUBSCREEN_BODY:SAPMV45A:4454/ctxtVBAP-KDMAT").caretPosition = 3
Session.findById("wnd[0]/tbar[0]/btn[11]").press
j = j + 1
Wend
End With
您不使用变量行作为变量,而是使用字符串 "row"。看看规则 #5 here 。 "row" 对 SAPGUI 没有任何意义。
试试这个
session.findById("wnd[0]/usr/tabsTAXI_TABSTRIP_OVERVIEW/tabpT/ssubSUBSCREEN_BODY:SAPMV45A:4426/subSUBSCREEN_TC:SAPMV45A:4908/tblSAPMV45ATCTRL_U_ERF_KONTRAKT/ctxtVBAP-KDMAT[5," & CStr(Row) & "]").SetFocus
您也需要对第二个字符串执行此操作。
你也用错了关键词。这不是 SAP ABAP,这是 SAPGUI scripting。
我正在从 VBA 编写脚本并在 SAP GUI 屏幕中使用记录的操作。我想让脚本输入某个交易粘贴某个值(合约编号),然后转到table中的某个行,双击它并在里面做某个动作。
我在 VBA 中使用 while 循环,在 Excel sheet 中我存储合同号,脚本应该双击然后粘贴的行号输入后我需要的值。它应该这样做,直到 a 列中的单元格为空。
您可以在下面代码的 VBS 部分看到,我尝试用变量“行”替换行号,但代码不接受。
如果我在那里留下一个数字,它实际上会做我想做的,只要这个数字是我尝试做的正确的数字。
有人可以帮我解决这个问题吗?如果行号的可能性数量有限,我会使用 if 语句解决这个问题,但这可能意味着代码很长,并且可能会遗漏某些内容。
是否可以让行号引用代码中的变量。
我已经尝试过在 VBS 中声明变量,但效果不佳。
代码:
'We declared the parameter for the while function in excel
Dim cont As String
Dim row As Integer
Dim rep As String
Dim j As Integer
j = 2
With ThisWorkbook
While Cells(j, 1) <> ""
cont = Cells(j, 1).Value
row = Cells(j, 3).Value
rep = Cells(j, 4).Value
Set SapGuiAuto = GetObject("SAPGUI")
Set SAPApp = SapGuiAuto.GetScriptingEngine
Set SAPCon = SAPApp.Children(0)
Set Session = SAPCon.Children(0)
If IsObject(WScript) Then
WScript.ConnectObject Session, "on"
WScript.ConnectObject Application, "on"
End If
Session.findById("wnd[0]").maximize
Session.findById("wnd[0]/usr/ctxtVBAK-VBELN").Text = cont
Session.findById("wnd[0]/usr/ctxtVBAK-VBELN").caretPosition = 8
Session.findById("wnd[0]").sendVKey 0
Session.findById("wnd[0]/usr/tabsTAXI_TABSTRIP_OVERVIEW/tabpT/ssubSUBSCREEN_BODY:SAPMV45A:4426/subSUBSCREEN_TC:SAPMV45A:4908/tblSAPMV45ATCTRL_U_ERF_KONTRAKT/ctxtVBAP-KDMAT[5,row]").SetFocus
Session.findById("wnd[0]/usr/tabsTAXI_TABSTRIP_OVERVIEW/tabpT/ssubSUBSCREEN_BODY:SAPMV45A:4426/subSUBSCREEN_TC:SAPMV45A:4908/tblSAPMV45ATCTRL_U_ERF_KONTRAKT/ctxtVBAP-KDMAT[5,row]").caretPosition = 6
Session.findById("wnd[0]").sendVKey 2
Session.findById("wnd[0]/usr/tabsTAXI_TABSTRIP_ITEM/tabpT").Select
Session.findById("wnd[0]/usr/tabsTAXI_TABSTRIP_ITEM/tabpT/ssubSUBSCREEN_BODY:SAPMV45A:4454/ctxtVBAP-KDMAT").Text = rep
Session.findById("wnd[0]/usr/tabsTAXI_TABSTRIP_ITEM/tabpT/ssubSUBSCREEN_BODY:SAPMV45A:4454/ctxtVBAP-KDMAT").SetFocus
Session.findById("wnd[0]/usr/tabsTAXI_TABSTRIP_ITEM/tabpT/ssubSUBSCREEN_BODY:SAPMV45A:4454/ctxtVBAP-KDMAT").caretPosition = 3
Session.findById("wnd[0]/tbar[0]/btn[11]").press
j = j + 1
Wend
End With
您不使用变量行作为变量,而是使用字符串 "row"。看看规则 #5 here 。 "row" 对 SAPGUI 没有任何意义。
试试这个
session.findById("wnd[0]/usr/tabsTAXI_TABSTRIP_OVERVIEW/tabpT/ssubSUBSCREEN_BODY:SAPMV45A:4426/subSUBSCREEN_TC:SAPMV45A:4908/tblSAPMV45ATCTRL_U_ERF_KONTRAKT/ctxtVBAP-KDMAT[5," & CStr(Row) & "]").SetFocus
您也需要对第二个字符串执行此操作。
你也用错了关键词。这不是 SAP ABAP,这是 SAPGUI scripting。