Excel VBAでSAPからデータを自動取得する具体的手順と活用ポイント

Excel VBAからSAP GUI Scriptingを使うには、SAPサーバーとPC側の両方で利用が許可されていること、対象セッションと画面項目IDを確認することが必要です。まず表示済みのテキスト項目をExcelへ読む小さな処理から始め、環境ごとの画面遷移や抽出操作を追加します。

目次

準備:PC側のチェックだけでは有効にならない

確認場所必要な確認
SAPサーバー管理者がsapgui/user_scriptingと利用ユーザーの制限を確認
SAP GUI for WindowsScriptingコンポーネントが導入され、Options → Accessibility & Scripting → Scriptingの利用が許可されている
SAPアカウント対象システム・クライアント・照会処理の権限がある
Excel組織が許可するマクロ実行方法と保存先を確認

根拠はSAPのScripting利用条件です。サーバー設定がPCの設定より優先し、サーバー側の有効化変更は既に実行中のセッションに反映されないため、案内に従って再ログオンします。サーバー設定を一般利用者が一律に変更したり、マクロの制限をすべて解除したりする手順ではありません。

対象画面のIDを録画で確認する

  1. 許可された検証環境でSAPへ手動ログオンし、照会画面を開く。たとえば品目照会では必要な画面・ビューの表示を手動で確認する。
  2. More → SAP GUI – Settings + Actions → Script Recording and Playbackを開き、必要な照会操作だけを記録する。
  3. 記録にあるsession.findById(“…”)のIDと、現在表示している項目を照合する。
  4. 取得対象が単独テキスト項目なのか、テーブル/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へログオンして画面が存在することが前提です。タスクスケジューラへ登録するだけで無人運転が成立するとは限りません。定期的な大量抽出が目的なら、管理者と正式な出力・連携方式を選び、対話セッションや認証・保守の条件も確認します。

この記事を書いた人

実務の現場で詰まりがちなポイントを地図にするITブログ「IT trip」を運営。Windows/Office(Teams・Excel)からSQL、サーバ運用、ガジェットまで、再現性のある手順と“なぜそうなるか”を丁寧に解説します。読んだらすぐ試せること、そして迷った人の次の一歩が見えることを大切にしています。

コメント

コメントする

目次