SAP Scripting Tracker 的基本介绍和 Python 代码示例参见上一篇:SAP Scripting Tracker基本使用技巧 。本篇提供 VBA 的代码示例。
引用 sapfewse.ocx 控件。
在 VBA 中使用 SAP Scritpting 需要引用 sapfewse.ocx,安装 SAP GUI 之后,在系统中能找到。Windows 下面的位置:C:\Program Files (x86)\SAP\FrontEnd\SapGui
Frame 代码
以下代码来自 Tracker.pdf 帮助文档中的文档进行改下。
' 获取 SAP Session
Public Function GetSession() As Object
Dim SapGuiAuto As Object
Dim app As SAPFEWSELib.GuiApplication
Dim connection As SAPFEWSELib.GuiConnection
Dim session As SAPFEWSELib.GuiSession
If app Is Nothing Then
Set SapGuiAuto = GetObject("SAPGUI")
Set app = SapGuiAuto.GetScriptingEngine
End If
If connection Is Nothing Then
Set connection = app.Children(0)
End If
If session Is Nothing Then
Set session = connection.Children(0)
End If
Set GetSession = session
End Function
' 返回 Easy Access 界面
Public Sub returnEasyAccess(sess As Object)
sess.FindById("wnd[0]/tbar[0]/okcd").Text = "/n"
sess.FindById("wnd[0]").SendVKey (0)
End Sub
使用 Tracker 实现批量开发票
下面的代码实现基于交货单调用 VF01 进行开票。在 Excel 中,数据有 4 列,其中前面 3 列用于提供导入的数据,第 4 列获取系统返回值。
以下就是调用 VF01 代码,非常直观:
Option Explicit
Public Sub ExecuteVF01()
Dim session As Object
Set session = GetSession
Call returnEasyAccess(session)
' 运行VF01
Dim i As Long
For i = 2 To 100000
If Sheet1.Range("A" & i).Value = "EOF" Then Exit Sub
' 每次先回到Easy Access 界面
Call returnEasyAccess(session)
Dim leftCell As Range
Set leftCell = Sheet1.Range("A" & i)
session.FindById("wnd[0]/tbar[0]/okcd").Text = "VF01"
session.FindById("wnd[0]").SendVKey (0)
session.FindById("wnd[0]/usr/cmbRV60A-FKART").Key = leftCell.Offset(0, 1).Value '发票类型
session.FindById("wnd[0]/usr/ctxtRV60A-FKDAT").Text = leftCell.Offset(0, 2).Value '日期
session.FindById("wnd[0]/usr/tblSAPMV60ATCTRL_ERF_FAKT/ctxtKOMFK-VBELN[0,0]").Text = leftCell.Value '交货单
session.FindById("wnd[0]/usr/tblSAPMV60ATCTRL_ERF_FAKT/ctxtKOMFK-VBELN[0,0]").CaretPosition = 8
session.FindById("wnd[0]").SendVKey (0)
session.FindById("wnd[0]/tbar[0]/btn[11]").Press
' 读取SAP返回消息
leftCell.Offset(0, 3).Value = session.FindById("wnd[0]/sbar").Text
Next
End Sub