SAP Scripting Tracker基本使用 - VBA 示例

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

推荐阅读更多精彩内容