SAPは会社などの基幹システムとして多く採用されています。一方で、社員が通常使用うする情報処理ツールは Excel なので、SAP と Excel 両方を使って仕事をするケースが多いです。
しかし、SAP の操作方法は一般のアプリとかなり異なる仕様となっていて Excel との相性はあまり良くありません。
日常業務で何度も SAP と Excel を操作する人にとってはこの相性の悪さはかなり困った問題です。
そこで、この記事では SAP と Excel の操作を自動化して業務を効率化する方法をご紹介したいと思います。
上手くいけば今までコツコツと時間をかけてやっていた作業をあっという間に終わらせることができるかもしれませんので、是非参考にしてみて下さい。
自動化に使うツール
SAP は RPA と相性が悪いという問題
RPA(Robotic Process Automation)はキーボードやマウスの操作をそのまま記録して、再生できるので業務の自動化に活用が広まりつつあります。
しかし、冒頭でもご説明した通り、SAPの操作方法は独特で、この RPAツールとも相性が悪いケースがあります。
RPAツールで SAP の操作を記録していても、細かいところでつまづいてしまい、結局問題が解決できないという壁にぶつかってしまった方も多いのでは無いかと思います。
アプリケーションの相性の問題はユーザで解決できないケースがほとんどですので、RPAツールを使って壁にぶつかってしまうより、SAP が正式にサポートする方法を活用する方が素直です。
SAP が正式サポートする Microsoft の VBScript
実は SAP はユーザーの操作を VBScript にそのまま記録する機能がついています。SAP が正式にサポートする機能ですので、上手く動かないはずはありません。
更に VBScript は Microsoft が提供するスクリプト言語ですから、Excel も問題なく操作できます。
以上のような理由で、この記事では VBScript を活用した自動化ツールを作る方法を解説していきます。
SAP はログインも特殊、sapshcut.exe を使う
SAP を使っている方ならお気付きかと思いますが、SAP はログインするための別のアプリを立ち上げる必要があります。
このログイン処理も VBScript や RPA で組もうとすると中々上手くいかないケースがあります。そこで、これも SAP から提供されているログイン用の専用のコマンド sapshcut.exe を活用することにします。
使いやすいように、以下の内容の BAT ファイルを作成します。
rem SAPLOGON.BAT
set SAPSystemId=<システムID>
set SAPClient=<クライアント番号>
set SAPUser=<ユーザ名>
set SAPPassword=<パスワード>
"C:\Program Files (x86)\SAP\FrontEnd\SapGui\sapshcut.exe" start -system=%SAPSystemId% -client=%SAPClient% -user=%SAPUser% -pw=%SAPPassword%
ここで、システムID、クライアント番号、ユーザー情報 はご自分の環境に合わせて編集して下さい。
この BAT ファイルをダブルクリックすると自動で SAP のログインまで完了します。
VBScript で SAP の操作を自動化
ここでは SAP のスクリプト記録の機能を活用します。
設定から必要なので、順に説明します。
必要な設定
次の手順で設定します。この設定により SAP のアプリでユーザの操作を記録、再生できるようになります。
記録されるものは VBScript のコードになります。
- SAP のメニューから「オプション」を選択
- 「アクセシビリティ & スクリプト」 を展開
- 「スクリプト」 を選択
- 「スクリプト有効化」にチェック
- 「スクリプトがSAP GUI にアタッチする時に通知」のチェックを外す
- 「スクリプトが接続を開く時に通知」 のチェックを外す
SAP の操作を記録する
では、早速 SAP の操作を記録してみましょう。Excel のマクロの記録とほとんど同じ感じになります。
- SAPのメニューから「オプション」を選択
- 「スクリプト記録と再生」 を選択
- 記録、再生ボタンのついてウィンドウが出てきますので、SAPの操作を始める前に「記録」ボタンを押します
- SAP の操作が完了したら「停止」ボタンを押します
- そうすると「保存先」の “*.vbs” ファイルに SAP の操作が全て VBScript で記録されます。
SAP 操作の VBScript を解読する
記録された VBScript をメモ帳などのテキストエディタで開いてみましょう。
すると図のような内容になっているのが分かります。
ユーザー操作の記録は比較的単純で、マウス操作ならボタンを次々と押していく操作が一つずつ記録されているだけです。
そのマウス操作の記録は図のように解読すると、理解が早いので、頭に入れておきましょう。
これで VBScript の中身が理解できたら後は Excel と連携させた動作をどう組み立てるかを考えれば良い訳です。
VBScript で Excel の操作を自動化
VBScript で SAP を操作するコードは前の項で理解できたので、続いては Excel の操作です。
基本的な操作さえ把握できれば十分実用できますですので、それらを紹介します。
SAP と Excel の連携は、Excelファイルを開いてセルの内容を繰り返し SAP に入力するとか、逆に繰り返し値を Excel に転記するとかをイメージしています。
ファイルを開く
VBScript で Excel ファイルを開くには以下のようにします。
Set exl = CreateObject("Excel.Application")
Set wb = exl.Workbooks.Open("C:\temp\test.xlsx")
セルの値の読み書き
セルの値の読み書きは以下のようにします。
Set ws = wb.Sheets("Sheet1")
Set cl = ws.Range("A1")
cltext = cl.Text
VBScript の繰り返し処理
プログラム言語で繰り返し処理は大きく分けて2つありますので、それぞれを紹介します。
回数が決まってない時の Do Loop
これは例えば Excel のシートで上のセルから順番に処理していって、空のセルになるまで下に移動していくような処理になります。
以下のようにするとセルの値が空になるまで繰り返し処理を行います。
ここで注意すべきは変数 i を繰り返しループの中で必ず一回以上増減させることです。変数 i が変化しないと無限ループに入って終わらなくなってしまいます。
' Do_Loop_Test.vbs
'
' 初期化
Set exl = CreateObject("Excel.Application")
Set wb = exl.Workbooks.Open("C:\temp\test.xlsx")
Set ws = wb.Sheets("Sheet1")
Set cl = ws.Range("A1")
i = 0
cltxt = ""
' Do ~ Loop の繰り返し処理 ****************************************************
Do While cl.Offset(i, 0).Text <> ""
cltxt = cltxt & cl.Offset(i, 0).Text
i = i + 1 ' ***【注意】変数を変化させないと無限ループになってしまいます! ***
Loop
' ******************************************************************************
' 終了処理
wb.Close
exl.Quit
Set exl = Nothing
' 最後にセルから取得したテキストを表示
msgbox cltxt
実行結果は図のようになります。
回数が決まっていたら For Next
これはあらかじめ3回繰り返すなど、繰り返す回数が決まっている場合の処理になります。
以下はセルの値を3回読み込む処理をコードにしたものです。
' For_Next_Test.vbs
'
' 初期化
Set exl = CreateObject("Excel.Application")
Set wb = exl.Workbooks.Open("C:\temp\test.xlsx")
Set ws = wb.Sheets("Sheet1")
Set cl = ws.Range("A1")
cltxt = ""
' For ~ Next の繰り返し処理 ****************************************************
For i = 0 To 2
cltxt = cltxt & cl.Offset(i, 0).Text
Next
' ******************************************************************************
' 終了処理
wb.Close
exl.Quit
Set exl = Nothing
' 最後にセルから取得したテキストを表示
msgbox cltxt
実行結果は図のようになります。
自動化コマンドを作成
ここまでで VBScript で SAP と Excel の両方をコントロールできるようになりました。
これを組み合わせれば SAP に Excel ファイルに記入された値を繰り返し入力する処理などを作成できます。
ここでは SAP と Excel を起動して、自動処理をした上で最後には SAP と Excel を終了するところまでを完全自動化します。
BAT ファイルを作成
前述の通り SAP の起動には sapshcut.exe を使いますので、BATファイルにこのコマンドを記入します。
また、VBScript ファイルの実行には cscript コマンドを使います。
最後に SAP LOGON のアプリを終了する処理もまた VBScript では上手くできないので、taskkill コマンドを使います。
最終的にBATファイルのコードは以下のようになります。
set SAPSystemId=<システムID>
set SAPClient=<クライアント番号>
set SAPUser=<ユーザ名>
set SAPPassword=<パスワード>
"C:\Program Files (x86)\SAP\FrontEnd\SapGui\sapshcut.exe" start -system=%SAPSystemId% -client=%SAPClient% -user=%SAPUser% -pw=%SAPPassword%
rem ログオン処理を5秒待つ
timeout /t 5 /nobreak >nul
rem SAP 自動処理の VBScript を実行
cscript C:\temp\sap_automate.vbs
rem SAP LOGON のアプリを終了
taskkill /IM saplogon.exe
VBScript ファイルを作成
VBScript では以下の順に処理を行います。
- SAPオブジェクトの初期化
- SAP入力画面までの遷移
- Excelファイルを開く
- 繰り返し処理
- Excel ファイルを閉じる
- SAP GUI Client の終了
コードは以下のようになります。
' SAPオブジェクトの初期化
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
' SAP入力画面までの遷移
session.findById(“wnd[0]/tbar[0]/okcd”).text = “A33”
session.findById(“wnd[0]”).sendVKey 0
session.findById(“wnd[0]/usr/ctxtRPG50-VBELN”).text = 16
session.findById(“wnd[0]/usr/btnBT_SUCH”).press
' Excel ファイルを開く
Set exl = CreateObject("Excel.Application")
Set wb = exl.Workbooks.Open("C:\temp\test.xlsx")
Set ws = wb.Sheets("Sheet1")
Set cl = ws.Range("A1")
' 繰り返し処理
Do While cl.Offset(i, 0).Text <> ""
’ SAP に繰り返し入力する処理
session.findById(“wnd[0]/usr/ctxtRPG50-VBELN”).text = c.Text
session.findById(“wnd[0]/usr/btnBT_SUCH”).press
i = i + 1
Loop
' Excelファイルを閉じる
wb.Close
exl.Quit
Set exl = Nothing
' SAP GUI Client の終了
session.findById(“wnd[0]/tbar[0]/btn[15]”).press
コメントしてある部分はご自分の環境の合わせて記入して下さい。
SAP GUI Client を終了する VBScript のコードを作成する工夫
SAP でスクリプト記録モードに入って様々な操作をした上で SAP を終了させてしまうと、スクリプトの記録はファイルに記録されずに消えてしまいます。
この問題を解決する工夫は終了処理を最後にキャンセルするという方法です。
SAP GUI Client でログオフボタンを押すと確認のダイアログが出てきます。ここで「いいえ」を選択してスクリプトの記録を終了します。
するとスクリプトの記録の最後が以下のようになっていると思います。
session.findById("wnd[0]/tbar[0]/btn[15]").press
session.findById("wnd[1]/usr/btnSPOP-OPTION2").press
SAP の VBScript の解読ができた方なら想像つくと思いますが、最後の「いいえ」ボタンを押すところを「はい」ボタンを押すように変更すれば良いのです。
以下のようにOption の数字を 2 から 1 に変えるだけです。これでログオフまでスムーズに VBScript で実行できるようになります。
session.findById("wnd[0]/tbar[0]/btn[15]").press ‘「ログオフ」ボタンを押す
session.findById("wnd[1]/usr/btnSPOP-OPTION1").press ‘「はい」ボタンを押す
動かしてみる
作成した SAPEX.BAT ファイルをダブルクリッククリックします。すると全ての処理が次々と進んで終了すると思います。
人間が操作するとかなり時間がかかるのですが、プログラムにやらせると あっと言う間です。何よりもコンピュータが面倒な作業をしてくれますので人への負担が全くありません。
これで効率化した労力を他の仕事に回すか、残業を減らすか、皆さんがご自由に使ってください。
まとめ
この記事では会社などで基幹システムとして使われている SAP と、一般ユーザーが最も良く使う Excel を自動操作して作業を完全自動化する方法をご紹介しました。
プログラムが処理するので、ミスも無く、処理も速く、何よりもユーザーの負担が大いに軽減するのがメリットです。
この仕組みは一度作成してしまえば何度でも利用出来ますし、少し編集すれば別の自動処理をさせることも出来るようになります。
これを足掛かりに様々な処理を自動化して業務の大幅な効率化を図ってみてはいかがでしょうか?