VBA驅動SAP GUI完成介面元素值初始化
- 2022 年 7 月 15 日
- 筆記
- RPA, VBA, 辦公自動化, SAP script
小爬日常利用VBA完成SAP GUI自動化時,經常被這個問題困擾:我們進入一個事務程式碼介面時,如FBL1N(供應商行項目顯示),很多的 GuiTextField(文本框)對象、GuiCheckBox(複選框)對象都已經有值了。我們如果忘了對這些對象的值初始化,可能SAP執行後的結果並非我們預期的那樣,如下圖所示。

針對這個問題,大部分童鞋很容易想到的方案是:把每個文本框的text屬性設為空字元串,把每個複選框的勾選狀態都設置為【不勾選】,具體程式碼如下:
session.findById("wnd[0]/usr/ctxtRACCT-LOW").text = "" '文本框初始化 session.findById("wnd[0]/usr/chkX_SHBV").selected = false 'checkBox值初始化
該方法未嘗不可,但是需要在SAP腳本錄製階段,對每個這類元素都初始化並記錄後台腳本,屬實麻煩,也容易產生遺漏。
還有一個方法是,關閉SAP連接,要求用戶重新登錄後,再使用我們的腳本工具,此時SAP已經對會話介面的參數完成了初始化。可該方法如果站在用戶角度來思考,難免讓人覺得有些非人性化,就跟解決不了別人電腦問題,就讓別人重啟電腦試下的感覺,小爬總覺得它不應該成為我們的最優解。
小爬翻閱了N多資料,苦心人天不負,總算總結出了更通用的方法:對會話元素層層往下窮舉子元素,如果發現子元素為文本框,就將text屬性置為"",如果發現子元素為複選項,就將其selected屬性改為false即可。具體用VBA程式碼實現的話,還需要知道如何寫遞歸函數,示例如下:
Sub SessionElementInitialization() '對介面元素的值進行初始化,文本框值置為空,複選框狀態改為【未勾選】 Dim UserArea As Object If Not IsObject(SAPApplication) 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 SAPApplication, "on" End If Set UserArea = session.findByID("wnd[0]/usr") Clear_Fields UserArea MsgBox "已完成!" End Sub '_______________________________ Sub Clear_Fields(Area As Object) Set SAPApplication = GetObject("SAPGUI").GetScriptingEngine Dim Obj As Object Dim NextArea As Object On Error Resume Next For i = 0 To Area.Children.Count - 1 Set Obj = Area.Children(CInt(i)) If Obj.ContainerType = True Then If Obj.Children.Count > 0 Then Set NextArea = SAPApplication.findByID(Obj.ID) Clear_Fields NextArea End If End If If Obj.Type Like "*TextField*" And Obj.changeable = True Then Obj.Text = "" ElseIf Obj.Type = "GuiCheckBox" Then Obj.Selected = False End If Next i End Sub
相信你們已經被這個問題困擾很久了,趕緊用上面的方法試下吧。對了,如果你是python愛好者,如何把上面這段VBA腳本轉成python版本,相信你已經有自己的答案了(*^_^*)。
歡迎掃碼關注我的公眾號 獲取更多爬蟲、數據分析的知識!


