小爬之前写过一系列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(Application) 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
(●'◡'●)是不是发现程序员的活儿其实某种程度上也没那么难?还不快快拿着代码愉快地实践一番,好好检验一下?
欢迎扫码关注我的公众号 获取更多爬虫、数据分析的知识!