我們在VBA中嵌入SAP原生的【指令碼錄製與回放】功能生成的VBS指令碼,可以實現很多自動化操作。但只有我們對SAP做了一系列動作,才會得到這些動作的指令碼。然而,一旦我們需要用程式碼提前做一些判斷,然後再決定後續的動作時,這個判斷的程式碼就無法透過【指令碼錄製與回放】功能錄製得到。這個時候,我們需要學會看SAP GUI Scripting API。
舉個小爬在實際工作中碰到的例子。我們有時候會利用指令碼驅動事務程式碼F-02完成SAP憑證的批次錄入。在憑證的行專案錄入介面中,某些科目下,SAP需要我們維護【到期日】【基準日】;有些行專案下,則沒有這個選項讓使用者維護,如下圖所示:
我們需要先判斷有沒有【到期日】這個元素,再決定是不是要給這個元素傳值。這個判斷的程式碼就無法去錄製程式碼得到了。
這也就是小爬今天要分享的知識點:利用FindAllByName()方法去判斷是否存在某個元素。這些方法就是透過SAP GUI Scripting API學習得來。
之所以這裡用到FindAllByName()而不是我們熟悉的FindById()方法,是因為當我們使用FindById()去查詢某個頁面中沒有的元素時,程式會直接報錯異常,而VBA的異常響應能力天生不足,使用FindAllByName()則完全不會存在這個問題。
從上圖中可以看到,FindAllByName()方法接收兩個引數,一個是元素的Name,另一個是元素的Type,而返回值是一個GuiComponentCollection物件,相當於一個陣列。當我們沒有找到對應的元素時,會返回一個空陣列,並不會報錯。
以【到期日】這個欄位為例,我們還是需要藉助萬能的Scripting Tracker工具先找到元素的Name和Type。我們可以點選工具中的望遠鏡圖示【查詢物件】,輸入關鍵詞【到期日】,此時工具會自動幫我們定位到對應物件(灰色背景),如下圖所示:
這裡可以看到,【到期日】物件對應的Name:BSEG-ZFBDT,對應的Type:GuiLabel(注意,這裡不用輸入Type括號後面的數字)。只要判斷有這個【到期日】label元素,就可以斷定頁面中是否有【到期日】這個GuiCTextField輸入框元素。
有了這兩點,我們可以這樣來組織我們的VBA程式碼,避免程式出錯和寫不必要的異常響應,程式碼示例如下:
1 Sub Main() 2 3 Dim SapGuiAuto As Object 4 Dim app As Object 5 Dim connection As Object 6 Dim session As Object 7 Dim ZFBDT_collection As Object, cnt As Long 8 9 Set SapGuiAuto = GetObject("SAPGUI") 10 Set app = SapGuiAuto.GetScriptingEngine 11 app.HistoryEnabled = False 12 Set connection = app.Children(0) 13 If connection.DisabledByServer = True Then 14 Exit Sub 15 End If 16 Set session = connection.Children(0) 17 If session.Busy = True Then 18 Exit Sub 19 End If 20 If session.Info.IsLowSpeedConnection = True Then 21 Exit Sub 22 End If 23 24 25 session.findById("wnd[0]").maximize 26 Set ZFBDT_collection = session.findById("wnd[0]/usr").FindAllByName("BSEG-ZFBDT", "GuiLabel") '基於Name和Type 查詢【到期日】元素 27 cnt = ZFBDT_collection.Count 28 If cnt = 0 Then 29 MsgBox "【到期日】元素在當前SAP會話中不存在!" 30 Else: 31 Debug.Print ZFBDT_collection(0).Text '列印對應的元素的Text屬性,佐證是否為【到期日】 32 session.findById("wnd[0]/usr/ctxtBSEG-ZFBDT").Text = "2022.01.01" '找到對應的元素,傳值 33 End If 34 End Sub
除了FindById,是時候開始學學FindAllByName來查詢SAP GUI元素了。尤其是在VBA中做SAP GUI自動化,該方法真心好用,強推~~
歡迎掃碼關注我的公眾號 獲取更多爬蟲、資料分析的知識!