小爬之前寫過一系列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
(●'◡'●)是不是發現程式設計師的活兒其實某種程度上也沒那麼難?還不快快拿著程式碼愉快地實踐一番,好好檢驗一下?
歡迎掃碼關注我的公眾號 獲取更多爬蟲、資料分析的知識!