首页 > 其他分享 >VBA驱动SAP GUI自动化:查找页面元素FindAllByName

VBA驱动SAP GUI自动化:查找页面元素FindAllByName

时间:2022-11-28 17:33:32浏览次数:55  
标签:VBA 元素 GUI 到期日 ZFBDT FindAllByName session SAP

  我们在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自动化,该方法真心好用,强推~~

   欢迎扫码关注我的公众号 获取更多爬虫、数据分析的知识!

标签:VBA,元素,GUI,到期日,ZFBDT,FindAllByName,session,SAP
From: https://www.cnblogs.com/new-june/p/16932809.html

相关文章

  • WORD VBA 办公助手
    Sub设置页面()''设置页面和页码宏''WithSelection.PageSetup.LineNumbering.Active=False.Orientation=wdOrientPortrait.T......
  • WORD VBA 插入页码
    Sub插入页码()ActiveDocument.PageSetup.OddAndEvenPagesHeaderFooter=False'关闭奇偶页相同(防止上回启用奇偶页不同后没有关闭此项设置)WithActiveWindow.Active......
  • 让uniGUI支持https
    今天在专家的帮助下,成功的让uniGUI支持https了。首先,去申请个免费的证书。我同事去阿里申请的,申请回是一个zip文件,里面有两个文件,一个扩展是per,一个key然后,把这两个证书......
  • WORD VBA 设置页面
    Sub设置页面()''设置页面和页码宏''WithSelection.PageSetup.LineNumbering.Active=False.Orientation=wdOrientPortrait.T......
  • Unity-UGUI按钮点击失效
      在Canvas中的三个按钮,不知为什么怎么点击都不响应点击事件,查找资料说是幕布顺序displayorder的问题,将按钮移动至Canvas最下方即可。......
  • 【药材识别】基于色差色温特征结合SVM实现药材炮制程度判断系统附GUI界面
    ✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进。......
  • VBA工作薄引用 方法
    工作簿的引用方法引用不同的工作簿有如下的方法:1、使用工作簿名称工作簿名称是指Excel文件的文件名,可以使用Workbooks集合引用方式来引用工作簿。Subtest()Msg......
  • VBA 技巧二
    PublicSub技巧()'保存并关闭工作薄DimwbAsWorkbookSetwb=ThisWorkbook'可指定任意工作簿wb.Closesavechanges:=FalseSetwb=Nothing......
  • 使用offsetMin和offsetMax来控制UGUI节点的坐标
    首先需要理解anchorMin,anchorMaxanchorMin.x为0.1就是:与parent左边相距10%宽度位置,即图中的leftanchorMin.y为0.2就是:与parent下边相距20%高度的位置,即图中的bottomanc......
  • VBA 技巧一
    PublicSub技巧()#判断单元格是否有公式DimmyRangeAsRangeSetmyRange=Range("A1")'指定任意单元格IfmyRange.HasFormula=TrueThen......