VBA驱动SAP GUI实现办公自动化(一)

  小爬之前写过一系列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(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 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

  (●’◡’●)是不是发现程序员的活儿其实某种程度上也没那么难?还不快快拿着代码愉快地实践一番,好好检验一下?

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