ERPシステムであるSAPを保守していると、データ一覧を取得したいと思うことがありませんか?
データ一覧を取得するために、トランザクション:SE16Nなどを使ってテーブルを検索し、スプレッドシートにダウンロードしますが、それが「時間もかかるし面倒くさい!」という時に、Excelマクロ(VBA)を使って簡単に取得する方法を紹介します。
ちなみに今回のサンプルコードは、下記の環境で作成しています。
・Windows10 ver1903(64bit)
・SAP GUI 740
・Excel 2016(32bit)
SAP RFCについて
SAPシステムには、RFC(Remote Function Call)と呼ばれる汎用モジュールがあります。
通常、汎用モジュールは、ABAP(Advanced Business Application Programming)を使って呼び出されるように設計されたSAPシステムのAPI(BAPI:Bussiness Application Programing Interface)ですが、RFCに対応したBAPIは、ABAP以外からも呼び出すことが可能です。今回はExcelマクロを使ったBAPI呼び出しを紹介します。
【前提】
・SAP GUIがWindowsマシンにインストールされていること。
・SAPシステムにアクセスできるユーザーIDを持っていること。
テーブルを読み込む汎用モジュール
テーブルを読み込むには、RFC対応のBAPI「RFC_READ_TABLE」を使います。
パラメータとして、読み込みたいテーブルやフィールドを指定することで、簡単にテーブルの内容を取得できます。具体的には、ImportパラメータやTableパラメータを使用しますが、詳細はABAP開発を学習いただきたく思います。
ExcelマクロでBAPIを呼び出すサンプルコード
Excelマクロを使って、BAPI「RFC_READ_TABLE」を呼び出すサンプルコードは以下になります。
品目マスタ(MARA:一般商品データ)から、品目コード・品目タイプ・基準単位を取得するサンプルです。件数を絞るために、品目コードの頭が”AA-“で始まるものを条件にしています。取得した品目情報は、Excel上に新しいシートを作って転記するようにしています。
(そのままExcelマクロのモジュールに貼り付けできます)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 |
Sub GET_MARA() Sheets.Add After:=ActiveSheet Dim functionctrl As Object Dim sapConnection As Object Dim Result As Boolean Dim iRow, iColumn, iStart, iStartRow, iField, iLength As Integer Dim vField As String Dim RFC As Object Dim I_QUERY_TABLE As Object Dim I_DELIMITER As Object Dim I_NODATA As Object Dim I_ROWSKIPS As Object Dim I_ROWCOUNT As Object Dim IT_OPTIONS As Object Dim IT_FIELDS As Object Dim IT_DATA As Object ' SAPコンポーネント Set functionctrl = CreateObject("SAP.Functions") ' R/3接続 Set sapConnection = functionctrl.Connection ' ログイン実行 If sapConnection.Logon(0, False) <> True Then MsgBox "ログイン失敗", vbCritical Application.Cursor = xlDefault Set functionctrl = Nothing Set sapConnection = Nothing Exit Sub End If On Error GoTo MyError 'BAPI定義 Set RFC = functionctrl.Add("RFC_READ_TABLE") ' importパラメータ Set I_QUERY_TABLE = RFC.exports("QUERY_TABLE") Set I_DELIMITER = RFC.exports("DELIMITER") Set I_NODATA = RFC.exports("NO_DATA") Set I_ROWSKIPS = RFC.exports("ROWSKIPS") Set I_ROWCOUNT = RFC.exports("ROWCOUNT") ' tableパラメータ Set IT_OPTIONS = RFC.Tables("OPTIONS") Set IT_FIELDS = RFC.Tables("FIELDS") Set IT_DATA = RFC.Tables("DATA") I_QUERY_TABLE.Value = "MARA" I_DELIMITER.Value = " " I_NODATA = " " I_ROWSKIPS = 0 I_ROWCOUNT = 0 IT_FIELDS.appendrow IT_FIELDS(1, "FIELDNAME") = "MATNR" IT_FIELDS.appendrow IT_FIELDS(2, "FIELDNAME") = "MTART" IT_FIELDS.appendrow IT_FIELDS(3, "FIELDNAME") = "MEINS" IT_OPTIONS.appendrow IT_OPTIONS(1, "TEXT") = "MATNR LIKE '" & "AA-%" & "'" Result = RFC.Call If Not Result Then ' エラーだったらエラーコード表示 MsgBox "実行エラー:" & RFC.Exception, vbCritical GoTo EndSyori Else End If '列名をExcelシートに出力 For iField = 1 To IT_FIELDS.RowCount Cells(1, iField).Value = IT_FIELDS(iField, "FIELDNAME") Next 'データをExcelシートに出力 iField = 1 For iRow = 1 To IT_DATA.RowCount For iField = 1 To IT_FIELDS.RowCount iStart = IT_FIELDS(iField, "OFFSET") + 1 iLength = IT_FIELDS(iField, "LENGTH") If iStart > Len(IT_DATA(iRow, "WA")) Then vField = Null Else vField = Mid(IT_DATA(iRow, "WA"), iStart, iLength) End If Select Case IT_FIELDS(iField, "TYPE") Case "C" Cells(iRow + 1, iField).Value = "'" & vField Case "D" Cells(iRow + 1, iField).Value = Format(vField, "@@@@/@@/@@") Case "T" Cells(iRow + 1, iField).Value = Format(vField, "@@:@@:@@") End Select Next Next MsgBox "ダウンロード件数 = " & IT_DATA.RowCount GoTo EndSyori 'エラー処理 MyError: MsgBox Err.Number & Err.Description, vbCritical EndSyori: sapConnection.Logoff Application.Cursor = xlDefault Application.StatusBar = False Set functionctrl = Nothing Set sapConnection = Nothing Set RFC = Nothing Set I_QUERY_TABLE = Nothing Set I_DELIMITER = Nothing Set I_NODATA = Nothing Set I_ROWSKIPS = Nothing Set I_ROWCOUNT = Nothing Set IT_OPTIONS = Nothing Set IT_FIELDS = Nothing Set IT_DATA = Nothing End Sub |
簡単に解説します。
22 |
Set functionctrl = CreateObject("SAP.Functions") |
SAPシステムのActiveXコンポーネントオブジェクトを作成します。SAP GUIがWindowsにインストールされていれば、一緒にActiveXコンポーネントもインストールされているので、そのまま使えます。
41 |
Set RFC = functionctrl.Add("RFC_READ_TABLE") |
ここで、使用したいBAPIを指定します。
55 |
I_QUERY_TABLE.Value = "MARA" |
ここで、読み込みを行いたいテーブル名を指定します。今回は品目マスタの一般商品データを読み込むので、”MARA”を指定します。
61 62 63 64 65 66 |
IT_FIELDS.appendrow IT_FIELDS(1, "FIELDNAME") = "MATNR" IT_FIELDS.appendrow IT_FIELDS(2, "FIELDNAME") = "MTART" IT_FIELDS.appendrow IT_FIELDS(3, "FIELDNAME") = "MEINS" |
ここで、取得したいテーブル内のフィールドを指定します。今回は品目コード・品目タイプ・基準単位を取得したいので、”MATNR”・”MTART”・”MEINS”を指定します。項目を増やしたい場合は、IT_FIELDオブジェクトにappendrowメソッドで行を追加して、任意の項目を追加してください。
68 69 |
IT_OPTIONS.appendrow IT_OPTIONS(1, "TEXT") = "MATNR LIKE '" & "AA-%" & "'" |
ここで、取得する条件を指定します。今回は品目コードが”AA-“で始まるものを条件にしていますので、”MATNR LIKE ‘AA-%'”となるように指定しています。条件を増やしたい場合は、IT_OPTIONSオブジェクトにappendrowメソッドで行を追加して、任意の条件を追加してください。この部分を可変にすることで、条件を変更することも可能です。
マクロを実行してみる
マクロを実行してみます。
まず、SAP GUIで定義されている環境選択が表示されますので、利用したい環境を選択します。
その後、クライアント・ユーザー・パスワードなどを入力するダイアログが表示されますので、ご自身のID情報を入力します。
そうすると、Excel上に新しいシートが作成されて、項目名に続いてデータの内容が2行目以降に表示されます。
これで、簡単にSAPシステムのテーブル内容を取得することが出来ます。
最後に
今回は単純にテーブルの内容を取得するBAPIを紹介しました。SAPシステムにはRFCで利用できるBAPIが多数用意されていますので、今回のサンプルコードを応用してチャレンジしてみてください。(更新系のBAPIを使って、SAPシステムのデータを破壊しないようにご注意ください!)
執筆者プロフィール

- tdi パナソニック事業部
-
工場系生産管理・営業系販売予測のシステム開発・導入に従事。
スクラッチ開発からOracle EBS導入プロジェクト、SAP導入プロジェクトを経験。
現在はマーケティング分野に取り組み中。
この執筆者の最新記事
ERP2021年1月28日ExcelマクロでSAPシステムからデータを取得してみよう!