VBA驅動SAP GUI自動化:查找頁面元素FindAllByName

  我們在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自動化,該方法真心好用,強推~~

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