Excel VBAからSAP GUI Scriptingを使うには、SAPサーバーとPC側の両方で利用が許可されていること、対象セッションと画面項目IDを確認することが必要です。まず表示済みのテキスト項目をExcelへ読む小さな処理から始め、環境ごとの画面遷移や抽出操作を追加します。
準備:PC側のチェックだけでは有効にならない
| 確認場所 | 必要な確認 |
|---|---|
| SAPサーバー | 管理者がsapgui/user_scriptingと利用ユーザーの制限を確認 |
| SAP GUI for Windows | Scriptingコンポーネントが導入され、Options → Accessibility & Scripting → Scriptingの利用が許可されている |
| SAPアカウント | 対象システム・クライアント・照会処理の権限がある |
| Excel | 組織が許可するマクロ実行方法と保存先を確認 |
根拠はSAPのScripting利用条件です。サーバー設定がPCの設定より優先し、サーバー側の有効化変更は既に実行中のセッションに反映されないため、案内に従って再ログオンします。サーバー設定を一般利用者が一律に変更したり、マクロの制限をすべて解除したりする手順ではありません。
対象画面のIDを録画で確認する
- 許可された検証環境でSAPへ手動ログオンし、照会画面を開く。たとえば品目照会では必要な画面・ビューの表示を手動で確認する。
- More → SAP GUI – Settings + Actions → Script Recording and Playbackを開き、必要な照会操作だけを記録する。
- 記録にあるsession.findById(“…”)のIDと、現在表示している項目を照合する。
- 取得対象が単独テキスト項目なのか、テーブル/ALVグリッドなのかを確認する。
録画機能の場所と利用条件はSAPの公式メニュー説明を参照してください。画面番号・ビュー・アドオンでIDは変わります。「MM03」というトランザクション名だけで他環境の固定IDが一致するとは限りません。画面の技術情報とScriptingの階層IDも同じものとして扱わず、録画されたIDを確認します。
VBA例:表示中のテキストをB2へ取得する
この例は既に表示した項目を読む処理です。ログインや品目検索を自動で完了するコードではありません。検証用の.xlsmにSheet1を作り、A2〜A5を文字列として入力します。出力先B2には必要なデータを置かないでください。
| セル | 入力する内容 |
|---|---|
| A2 | 録画で確認した取得対象のScripting ID(wnd[0]/usr/から始まる実際のIDなど) |
| A3 | 対象SAPシステム名(SystemName) |
| A4 | 対象クライアント番号(Client)。先頭ゼロを保持して文字列で入力 |
| A5 | ログオンしている対象ユーザー名(User) |
| B2 | 取得結果の出力先。このセルの値と表示形式を変更する |
Option Explicit
Sub ReadOpenSapField()
Dim sapGui As Object, sapApp As Object
Dim conn As Object, ses As Object, target As Object, ctrl As Object
Dim ws As Worksheet
Dim fieldId As String, expectedSystem As String
Dim expectedClient As String, expectedUser As String
Dim matches As Long, textValue As String
On Error GoTo Failed
Set ws = ThisWorkbook.Worksheets("Sheet1")
fieldId = Trim$(CStr(ws.Range("A2").Value2))
expectedSystem = Trim$(CStr(ws.Range("A3").Value2))
expectedClient = Trim$(CStr(ws.Range("A4").Value2))
expectedUser = Trim$(CStr(ws.Range("A5").Value2))
If fieldId = "" Or expectedSystem = "" Or _
expectedClient = "" Or expectedUser = "" Then
MsgBox "A2~A5に対象IDと接続条件を入力してください。"
Exit Sub
End If
Set sapGui = GetObject("SAPGUI")
Set sapApp = sapGui.GetScriptingEngine
For Each conn In sapApp.Children
For Each ses In conn.Children
If Not ses.Busy Then
If StrComp(ses.Info.SystemName, expectedSystem, vbTextCompare) = 0 And _
StrComp(ses.Info.Client, expectedClient, vbTextCompare) = 0 And _
StrComp(ses.Info.User, expectedUser, vbTextCompare) = 0 Then
matches = matches + 1
Set target = ses
End If
End If
Next ses
Next conn
If matches <> 1 Then
MsgBox "対象が1セッションに絞れません。接続条件と通信状態を確認してください。"
Exit Sub
End If
Set ctrl = target.FindById(fieldId)
Select Case ctrl.Type
Case "GuiTextField", "GuiCTextField", "GuiLabel"
textValue = CStr(ctrl.Text)
Case Else
MsgBox "この例はテキスト項目用です。表やグリッドは専用APIを確認してください。"
Exit Sub
End Select
ws.Range("B2").NumberFormat = "@"
ws.Range("B2").Value2 = textValue
MsgBox "表示値をB2へ取得しました。SAP画面の元データと照合してください。"
Exit Sub
Failed:
MsgBox "取得中止: " & CStr(Err.Number) & " / " & Err.Description
End Sub
複数のSAP接続がある場合は、Children(0)だけで操作対象を決めず、SystemName・Client・Userを照合します。 この例では条件に一致し、通信中でないセッションが一つだけの場合に読みます。同じシステム・ユーザーで複数セッションを開いている場合は中止するため、対象以外を整理するか、用途に合わせた選択条件を追加してください。
GetObject、GetScriptingEngine、Children、Info、Busy、FindByIdとテキスト項目の仕様はSAP GUI Scripting APIの公式資料で確認できます。IDが違う、Scriptingが禁止される、SAPが起動していないなどの例外は、エラー番号と説明を表示して終了します。
表・ALVグリッドから取得する場合は別のAPIを使う
上の.Textは単独のテキスト項目の例です。ALVグリッドやテーブルの全データを、同じIDの.Text一つで取得できるとは限りません。対象コントロールの型、行・列の識別子、表示されていない行の扱いを公式APIと録画結果で確認します。
一覧に正式なエクスポート機能がある場合は、必要な抽出条件でファイル出力し、Excelへ取り込む流れも検討できます。大量データを画面のセル単位で取得する前に、利用が許可されたレポート出力やインターフェースと比較してください。
動かないときの切り分け
| 止まる場所 | 確認すること |
|---|---|
| GetObject(“SAPGUI”) | SAP GUI for Windowsが起動しているか |
| GetScriptingEngine/接続の列挙 | サーバー・PC側の設定、コンポーネント、ユーザー制限、通知 |
| 対象が1セッションに絞れない | A3〜A5の条件、複数ログオン、SAPの通信中状態 |
| FindById | 必要な画面・ビューが開いているか、モーダル画面や録画IDの違い |
| 対象型が異なる | テーブル/グリッド等に適したAPIが必要か |
| 値が違う | 選択した品目・条件・単位・画面状態と元のSAP表示を照合 |
照会の自動化へ広げる前に確認すること
表示値の取得が確認できたら、録画した照会の画面遷移、検索条件入力、応答待ちを段階的に追加します。ボタンを押した後は画面要素が変わるため、古いオブジェクトを使い回さず、遷移後のIDを再取得します。固定の待ち秒数だけに依存せず、通信状態や結果画面、メッセージを確認します。
- 本番への書き込みやパスワード保存を含めず、まず照会だけの検証をする
- 取得日時・対象システム・条件・件数・エラーを記録する
- SAPの表示値とExcelの結果を少量のデータで照合し、先頭ゼロ・日付・単位を確認する
- 途中で失敗した結果を完全取得として扱わず、再試行時の重複と出力先を確認する
このGUIの例はSAPへログオンして画面が存在することが前提です。タスクスケジューラへ登録するだけで無人運転が成立するとは限りません。定期的な大量抽出が目的なら、管理者と正式な出力・連携方式を選び、対話セッションや認証・保守の条件も確認します。

コメント