VBA驅動SAP GUI實現辦公自動化(一)

2022-06-14 06:05:58

  小爬之前寫過一系列Python驅動SAP GUI實現辦公自動化的文章,其實如果我們的實際業務不是太複雜,且我們對VBA語法比較熟悉的話,我們完全可以藉助Excel VBA來驅動SAP GUI做很多自動化操作了。而無論是python還是VBA來驅動SAP,本質都是利用SAP對外開放的SAP GUI Scripting API。今天,小爬就帶大家揭開VBA驅動SAP的神祕面紗。

  我們首先需要確保對應的SAP連線開啟了【指令碼錄製與回放】功能,如下圖所示:

 

   如果該項為灰色,說明該功能出於各種考量,被SAP管理員禁用了,我們需要聯絡公司SAP後臺支援團隊想辦法開通該功能,之後我們便可以大大方方進行指令碼錄製了,錄製好的指令碼(VBS檔案)具體存放路徑可以通過下圖清晰看出:

 

 由於生成的指令碼預設是.vbs,而VBS語法跟VBA幾乎如出一轍,我們可以毫不費力將這些程式碼拷貝到VBA的模組中。小爬這裡錄製了一段SAP Connection的登入介面的操作,具體VBS程式碼如下:

If Not IsObject(application) Then
   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
session.findById("wnd[0]/usr/txtRSYST-BNAME").text = "user001"
session.findById("wnd[0]/usr/pwdRSYST-BCODE").text = "********"
session.findById("wnd[0]/usr/pwdRSYST-BCODE").setFocus
session.findById("wnd[0]/usr/pwdRSYST-BCODE").caretPosition = 7
session.findById("wnd[0]").sendVKey 0

 

相信作為新手的你,肯定已經急不可耐地準備將這堆程式碼拷貝到VBA中了,如下所示:

 

   正當我們以為找準了路子想要大幹一場時,剛點選【執行子過程】,就會發現這段程式碼編譯都無法通過:

 

 

實在是鬧心啊!

 

 

   其實我們完全沒必要就此慌張,VBE不但有錯誤提示,且貼心將錯誤定位到了程式碼中Application這個單詞上 。如果您已經有一定VBA基礎就不難發現,VBA中的Application是保留字,它指的是整個Excel應用範例。

要消除這個編譯錯誤,其實方法超簡單,用別的物件名來指代它便是,修改後的VBA程式碼如下:

Sub sapAutomation()
    '通過VBA連線SAP GUI實現自動化登入
    If Not IsObject(Application) Then
       Set SapGuiAuto = GetObject("SAPGUI")
       Set sapApplication = SapGuiAuto.GetScriptingEngine
    End If
    If Not IsObject(Connection) Then
       Set Connection = sapApplication.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
    session.findById("wnd[0]/usr/txtRSYST-BNAME").Text = "user001"
    session.findById("wnd[0]/usr/pwdRSYST-BCODE").Text = "********"
    session.findById("wnd[0]/usr/pwdRSYST-BCODE").SetFocus
    session.findById("wnd[0]/usr/pwdRSYST-BCODE").caretPosition = 7
    session.findById("wnd[0]").sendVKey 0

End Sub

  (●'◡'●)是不是發現程式設計師的活兒其實某種程度上也沒那麼難?還不快快拿著程式碼愉快地實踐一番,好好檢驗一下?

歡迎掃碼關注我的公眾號 獲取更多爬蟲、資料分析的知識!