[英]How can I run my SAP gui script using a button from excel if the script is created to get info from excel?
我正在尝试使用 excel 中的按钮运行 SAP gui 脚本,我创建的脚本的方式是从 excel 获取信息以在 SAP 中使用,该脚本运行良好,如果我打开它运行顺利,但我无法管理将该脚本添加到 excels 命令按钮。
这是有效的原始脚本:
Set SapGuiAuto = GetObject("SAPGUI")
Set application = SapGuiAuto.GetScriptingEngine
End If
If Not IsObject(connection) Then
Set connection = application.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
'REM ADDED BY EXCEL *************************************
Dim objExcel
Dim objSheet, intRow, i
Set objExcel = GetObject(,"Excel.Application")
Set objSheet = objExcel.ActiveWorkbook.ActiveSheet
For i = 2 to objSheet.UsedRange.Rows.Count
COL1 = Trim(CStr(objSheet.Cells(i, 1).Value)) 'Column1
COL2 = Trim(CStr(objSheet.Cells(i, 2).Value)) 'Column2
'REM ADDED BY EXCEL *************************************
session.findById("wnd[0]/usr/cntlIMAGE_CONTAINER/shellcont/shell/shellcont[0]/shell").selectedNode = "F00028"
session.findById("wnd[0]/usr/cntlIMAGE_CONTAINER/shellcont/shell/shellcont[0]/shell").doubleClickNode "F00028"
session.findById("wnd[0]/usr/ctxtVBRK-VBELN").text = Col1
session.findById("wnd[0]").sendVKey 0
session.findById("wnd[0]/mbar/menu[2]/menu[0]/menu[3]").select
session.findById("wnd[0]/usr/tblSAPDV70ATC_NAST3").getAbsoluteRow(0).selected = true
session.findById("wnd[0]/usr/tblSAPDV70ATC_NAST3/lblDV70A-STATUSICON[0,0]").setFocus
session.findById("wnd[0]/usr/tblSAPDV70ATC_NAST3/lblDV70A-STATUSICON[0,0]").caretPosition = 0
session.findById("wnd[0]/tbar[1]/btn[6]").press
session.findById("wnd[0]/usr/tblSAPDV70ATC_NAST3/cmbNAST-NACHA[3,0]").key = "1"
session.findById("wnd[0]/usr/tblSAPDV70ATC_NAST3/cmbNAST-NACHA[3,0]").setFocus
session.findById("wnd[0]/tbar[0]/btn[11]").press
session.findById("wnd[0]/usr/chkNAST-DELET").selected = true
session.findById("wnd[0]/usr/ctxtNAST-LDEST").text = "LOCALNEW"
session.findById("wnd[0]/usr/txtNAST-TDRECEIVER").text = Col2
session.findById("wnd[0]/usr/txtNAST-TDRECEIVER").setFocus
session.findById("wnd[0]/usr/txtNAST-TDRECEIVER").caretPosition = 8
session.findById("wnd[0]/tbar[0]/btn[3]").press
session.findById("wnd[0]/tbar[0]/btn[11]").press
session.findById("wnd[0]/tbar[0]/btn[3]").press
'REM FINALIZATION CONTROL CHECK ************************
aux=col1 & " " & col2
CreateObject("WScript.Shell").run("cmd /c @echo %date% %time% " & aux & " >> C:\SCRIPT\PlOrCreationLog.txt")
next
msgbox "Process Completed"
'REM FINALIZATION CONTROL CHECK ************************
如果将此代码添加到 excels VBA 它不起作用,所以我按照帖子“https://stackoverflow.com/questions/45187903/how-to-run-sap-gui-script-from-excel-macro。我改变了'application' 到 'GuiApplication' 并根据该帖子答案中给出的代码进行了一些更改。
完成更改后,我最终得到了以下代码:
Private Sub CommandButton1_Click()
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 SAP_session = Connection.Children(0)
End If
If IsObject(WScript) Then
WScript.ConnectObject SAP_session, "on"
WScript.ConnectObject SAPGuiApp, "on"
End If
If (Connection.Children.Count > 1) Then GoTo Err_TooManySAP
Set aw = SAP_session.ActiveWindow()
aw.findById("wnd[0]").Maximize
'REM ADDED BY EXCEL *************************************
Dim objExcel
Dim objSheet, intRow, i
Set objExcel = GetObject(, "Excel.Application")
Set objSheet = objExcel.ActiveWorkbook.ActiveSheet
For i = 2 To objSheet.UsedRange.Rows.Count
col1 = Trim(CStr(objSheet.Cells(i, 1).Value)) 'Column1
col2 = Trim(CStr(objSheet.Cells(i, 2).Value)) 'Column2
'REM ADDED BY EXCEL *************************************
On Error GoTo Err_Description
SAP_session.findById("wnd[0]/usr/cntlIMAGE_CONTAINER/shellcont/shell/shellcont[0]/shell").selectedNode = "F00028"
SAP_session.findById("wnd[0]/usr/cntlIMAGE_CONTAINER/shellcont/shell/shellcont[0]/shell").doubleClickNode "F00028"
SAP_session.findById("wnd[0]/usr/ctxtVBRK-VBELN").Text = col1
SAP_session.findById("wnd[0]").sendVKey 0
SAP_session.findById("wnd[0]/mbar/menu[2]/menu[0]/menu[3]").Select
SAP_session.findById("wnd[0]/usr/tblSAPDV70ATC_NAST3").getAbsoluteRow(0).Selected = True
SAP_session.findById("wnd[0]/usr/tblSAPDV70ATC_NAST3/lblDV70A-STATUSICON[0,0]").SetFocus
SAP_session.findById("wnd[0]/usr/tblSAPDV70ATC_NAST3/lblDV70A-STATUSICON[0,0]").caretPosition = 0
SAP_session.findById("wnd[0]/tbar[1]/btn[6]").press
SAP_session.findById("wnd[0]/usr/tblSAPDV70ATC_NAST3/cmbNAST-NACHA[3,0]").Key = "1"
SAP_session.findById("wnd[0]/usr/tblSAPDV70ATC_NAST3/cmbNAST-NACHA[3,0]").SetFocus
SAP_session.findById("wnd[0]/tbar[0]/btn[11]").press
SAP_session.findById("wnd[0]/usr/chkNAST-DELET").Selected = True
SAP_session.findById("wnd[0]/usr/ctxtNAST-LDEST").Text = "LOCALNEW"
SAP_session.findById("wnd[0]/usr/txtNAST-TDRECEIVER").Text = col2
SAP_session.findById("wnd[0]/usr/txtNAST-TDRECEIVER").SetFocus
SAP_session.findById("wnd[0]/usr/txtNAST-TDRECEIVER").caretPosition = 8
SAP_session.findById("wnd[0]/tbar[0]/btn[3]").press
SAP_session.findById("wnd[0]/tbar[0]/btn[11]").press
SAP_session.findById("wnd[0]/tbar[0]/btn[3]").press
'REM FINALIZATION CONTROL CHECK ************************
aux = col1 & " " & col2
CreateObject("WScript.Shell").Run ("cmd /c @echo %date% %time% " & aux & " >> C:\SCRIPT\PlOrCreationLog.txt")
Next
MsgBox "Process Completed"
'REM FINALIZATION CONTROL CHECK ************************
End Sub
当我点击 Debug>ComplieVBA 项目时。 弹出一个错误,说编译错误 Label 未定义并突出显示代码上的一行 ''' Set objExcel = GetObject(, "Excel.Application") '''
** https://i.stack.imgur.com/sNRTB.png
关于我做错了什么的任何想法? 我确定我做错了很多事情,我正在学习。 我只需要能够通过单击 excel 上的按钮来运行该脚本
获取 Excel object 是为了从不同的主机自动化 Excel。 当您的主机为 Excel 时, Application
object 包含Excel.Application
ZA8CFDE6331BD59EB26666F8911ZB4。
这段代码有很多问题。 如果您将Option Explicit
放在顶部,您会发现您还没有声明所有变量。 当你有时,它们没有类型。
您有一些使用GoTo
但没有匹配行标签的错误捕获。 您需要为每个GoTo
设置行标签,并且您还需要决定在这些错误事件中要做什么。 注意 sub 末尾的行标签。 它们以冒号结尾:
。 如果没有错误处理代码,sub 将结束。 您通常希望至少警告用户该错误。 如果您喜欢冒险,您可以就如何解决问题或尝试以编程方式解决问题提供反馈。
我已经修改了您的代码,以便它可以编译,但我不知道它是否符合您的要求:
Option Explicit
Dim SAPGuiApp As Object
Dim SapGuiAuto As Object
Dim Connection As Object
Dim SAP_session As Object
Dim WScript As Object
Dim aw As Object
Private Sub CommandButton1_Click()
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 SAP_session = Connection.Children(0)
End If
If IsObject(WScript) Then
WScript.ConnectObject SAP_session, "on"
WScript.ConnectObject SAPGuiApp, "on"
End If
If (Connection.Children.Count > 1) Then GoTo Err_TooManySAP
Set aw = SAP_session.ActiveWindow()
aw.findById("wnd[0]").Maximize
Dim objSheet As Worksheet
Set objSheet = ActiveSheet
Dim i As Integer
For i = 2 To objSheet.UsedRange.Rows.Count
Dim col1 As String
col1 = Trim(CStr(objSheet.Cells(i, 1).Value)) 'Column1
Dim col2 As String
col2 = Trim(CStr(objSheet.Cells(i, 2).Value)) 'Column2
On Error GoTo Err_Description
With SAP_session
.findById("wnd[0]/usr/cntlIMAGE_CONTAINER/shellcont/shell/shellcont[0]/shell").selectedNode = "F00028"
.findById("wnd[0]/usr/cntlIMAGE_CONTAINER/shellcont/shell/shellcont[0]/shell").doubleClickNode "F00028"
.findById("wnd[0]/usr/ctxtVBRK-VBELN").Text = col1
.findById("wnd[0]").sendVKey 0
.findById("wnd[0]/mbar/menu[2]/menu[0]/menu[3]").Select
.findById("wnd[0]/usr/tblSAPDV70ATC_NAST3").getAbsoluteRow(0).Selected = True
.findById("wnd[0]/usr/tblSAPDV70ATC_NAST3/lblDV70A-STATUSICON[0,0]").SetFocus
.findById("wnd[0]/usr/tblSAPDV70ATC_NAST3/lblDV70A-STATUSICON[0,0]").caretPosition = 0
.findById("wnd[0]/tbar[1]/btn[6]").press
.findById("wnd[0]/usr/tblSAPDV70ATC_NAST3/cmbNAST-NACHA[3,0]").Key = "1"
.findById("wnd[0]/usr/tblSAPDV70ATC_NAST3/cmbNAST-NACHA[3,0]").SetFocus
.findById("wnd[0]/tbar[0]/btn[11]").press
.findById("wnd[0]/usr/chkNAST-DELET").Selected = True
.findById("wnd[0]/usr/ctxtNAST-LDEST").Text = "LOCALNEW"
.findById("wnd[0]/usr/txtNAST-TDRECEIVER").Text = col2
.findById("wnd[0]/usr/txtNAST-TDRECEIVER").SetFocus
.findById("wnd[0]/usr/txtNAST-TDRECEIVER").caretPosition = 8
.findById("wnd[0]/tbar[0]/btn[3]").press
.findById("wnd[0]/tbar[0]/btn[11]").press
.findById("wnd[0]/tbar[0]/btn[3]").press
End With
'REM FINALIZATION CONTROL CHECK ************************
Dim aux As String
aux = col1 & " " & col2
CreateObject("WScript.Shell").Run ("cmd /c @echo %date% %time% " & aux & " >> C:\SCRIPT\PlOrCreationLog.txt")
Next
MsgBox "Process Completed"
'REM FINALIZATION CONTROL CHECK ************************
' Put error handling here
Err_Description:
Err_TooManySAP:
End Sub
@HackSLash
我尝试使用不同的代码,这次我没有对当前有效的原始脚本进行太多更改,我添加了您与我共享的代码的最后部分并且它有效。
Private Sub CommandButton1_Click()
If Not IsObject(GuiApplication) Then
Set SapGuiAuto = GetObject("SAPGUI")
Set GuiApplication = SapGuiAuto.GetScriptingEngine
End If
If Not IsObject(Connection) Then
Set Connection = GuiApplication.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 GuiApplication, "on"
End If
session.findById("wnd[0]").maximize
'REM ADDED BY EXCEL *************************************
Dim objExcel
Dim objSheet, intRow, i
Set objExcel = GetObject(, "Excel.Application")
Set objSheet = objExcel.ActiveWorkbook.ActiveSheet
For i = 2 To objSheet.UsedRange.Rows.Count
col1 = Trim(CStr(objSheet.Cells(i, 1).Value)) 'Column1
col2 = Trim(CStr(objSheet.Cells(i, 2).Value)) 'Column2
'REM ADDED BY EXCEL *************************************
session.findById("wnd[0]/usr/cntlIMAGE_CONTAINER/shellcont/shell/shellcont[0]/shell").selectedNode = "F00028"
session.findById("wnd[0]/usr/cntlIMAGE_CONTAINER/shellcont/shell/shellcont[0]/shell").doubleClickNode "F00028"
session.findById("wnd[0]/usr/ctxtVBRK-VBELN").Text = col1
session.findById("wnd[0]").sendVKey 0
session.findById("wnd[0]/mbar/menu[2]/menu[0]/menu[3]").Select
session.findById("wnd[0]/usr/tblSAPDV70ATC_NAST3").getAbsoluteRow(0).Selected = True
session.findById("wnd[0]/usr/tblSAPDV70ATC_NAST3/lblDV70A-STATUSICON[0,0]").SetFocus
session.findById("wnd[0]/usr/tblSAPDV70ATC_NAST3/lblDV70A-STATUSICON[0,0]").caretPosition = 0
session.findById("wnd[0]/tbar[1]/btn[6]").press
session.findById("wnd[0]/usr/tblSAPDV70ATC_NAST3/cmbNAST-NACHA[3,0]").Key = "1"
session.findById("wnd[0]/usr/tblSAPDV70ATC_NAST3/cmbNAST-NACHA[3,0]").SetFocus
session.findById("wnd[0]/tbar[0]/btn[11]").press
session.findById("wnd[0]/usr/chkNAST-DELET").Selected = True
session.findById("wnd[0]/usr/ctxtNAST-LDEST").Text = "LOCALNEW"
session.findById("wnd[0]/usr/txtNAST-TDRECEIVER").Text = col2
session.findById("wnd[0]/usr/txtNAST-TDRECEIVER").SetFocus
session.findById("wnd[0]/usr/txtNAST-TDRECEIVER").caretPosition = 8
session.findById("wnd[0]/tbar[0]/btn[3]").press
session.findById("wnd[0]/tbar[0]/btn[11]").press
session.findById("wnd[0]/tbar[0]/btn[3]").press
'REM FINALIZATION CONTROL CHECK ************************
Dim aux As String
aux = col1 & " " & col2
CreateObject("WScript.Shell").Run ("cmd /c @echo %date% %time% " & aux & " >> C:\SCRIPT\PlOrCreationLog.txt")
Next
MsgBox "Process Completed"
'REM FINALIZATION CONTROL CHECK ************************
' Put error handling here
Err_Description:
Err_TooManySAP:
End Sub
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.