SAP S/4HANAは強力なERPシステムだが、その膨大なテーブルや項目情報を扱うのは容易ではない。特に、業務要件に応じたデータ構造の把握や、テーブルの詳細な項目情報を迅速に確認する必要がある場合、SAP GUIで手動操作を繰り返すのは非効率的だ。
そこで本記事では、Excelマクロ(VBA)からSAP S/4HANAやECCに接続し、指定したテーブルの項目情報を一括で取得、一覧表示する方法を紹介する。この手法を活用すれば、SAP GUIを開くことなく、簡単にSAPシステムのテーブル項目情報をExcelワークシート上で確認できるようになる。SAPテーブルの項目一覧表をExcelで作成したい方にとって、非常に役立つ内容となっている。
SAPシステムとExcelを連携させることで、どのように手間を省き、生産性を最大化できるのか? その答えをぜひ本記事で見つけてほしい。
テーブル項目の一覧を取得する汎用モジュール
RPY_TABLE_READ は、SAPシステムのテーブルの情報を取得するための汎用モジュール(BAPI)である。このBAPIの使い方は至って簡単。入力パラメータにテーブルを指定すれば、そのテーブルが持つ全ての項目の情報を取得できる。取得できる情報は、項目の項目名はもちろん、項目のデータ型・長さ、テキスト名称、値のチェックテーブルまで取得できる。
また、入力パラメータに指定できるテーブルは、透過テーブルだけでなく、ビューや構造もOKである。
今回は、この RPY_TABLE_READ をExcelマクロから呼び出し、テーブルの項目情報を一括取得してExcelワークシート上に表示する。
SAPテーブルの項目情報を取得する手順
RPY_TABLE_READ を実行するExcelマクロのプロシージャ “Exec_RPY_TABLE_READ” は、以下のステップで実行される。
Excelワークシート「Field List」の「テーブル名」より、テーブル名を読み取る(テーブル名が空白の場合はマクロ終了)。
テーブル名が入力されている場合は大文字に変換する(大文字でないとテーブル名として認識されないため)。
Excelワークシート「Logon Setting」より、SAPシステムに接続するためのユーザID、パスワードなどを読み取り、SAPシステムにログオンする。
テーブル名を RPY_TABLE_READ の入力パラメータ「TABLE_NAME」に設定し、実行。
テーブルの項目の情報一式がテーブル形式で返されるので、Excel上に展開・表示。
SAPテーブルの項目情報を取得するExcelマクロ
準備するもの
PCにはExcel以外に、SAP GUI for Windows をインストールしておくこと。
SAPシステムとの通信に、SAP GUI for Windows に含まれるコントロールを利用するためである。
Excelマクロファイル
マクロ・プロシージャ “Exec_RPY_TABLE_READ” を含むExcelファイル「RPY_TABLE_READ_Sample.xlsm」は、「便利ツールと資料」に置いてあるので、ダウンロードして使用してほしい。コードは公開してあるので、アレンジすることも可能だ。
このExcelファイルでは、ボタン「テーブル情報の取得」を押すと、マクロ(プロシージャ)”Exec_RPY_TABLE_READ“が実行される。
ダウンロードしたExcelファイルのマクロがブロックされた場合の対処法は以下の記事をご参考に。
マクロ(VBA)コード
RPY_TABLE_READ を実行する、Excelマクロ(VBA)プロシージャ “Exec_RPY_TABLE_READ“のコードは以下。
Option Explicit
Public Sub Exec_RPY_TABLE_READ()
On Error GoTo Err_Exec_RPY_TABLE_READ
Dim oRFC As Object
Dim wsFL As Worksheet
Dim Table_Name As String
Dim RowData As Integer
Dim aFields() As Variant
Dim RowCount As Integer
Dim RowLast As Integer
Const ROW_START As Integer = 6 '開始行
Const COL_START As Integer = 2 '開始列
Const COL_MAX As Integer = 34 'ワークシート貼付用の配列の最大要素数
'処理対象のワークシートを変数にセット
Set wsFL = Worksheets("Field List")
'入力されているテーブル名の検査
Table_Name = Trim(wsFL.Range("TABLE_NAME"))
If Table_Name = "" Then
wsFL.Range("TABLE_NAME").Select
MsgBox "テーブル名を入力してください。", vbExclamation
Exit Sub
End If
'テーブル名を大文字に変換
Table_Name = UCase(Table_Name)
wsFL.Range("TABLE_NAME") = Table_Name
'テーブル説明の事前消去
wsFL.Range("TABLE_SHORTTEXT").ClearContents
'SAPログオン状態の確認
If SapChkAndLogon() <> 0 Then Exit Sub
'呼び出すBAPIのセット
goSapFunction.RemoveAll
Set oRFC = goSapFunction.Add("RPY_TABLE_READ")
'テーブル名
oRFC.Exports("TABLE_NAME") = Table_Name
'言語(ログオン中の言語とする)
oRFC.Exports("LANGUAGE") = gstrSapLanguage
'BAPI実行
If Not oRFC.CALL Then
'BAPI実行時エラー
MsgBox oRFC.Exception, vbExclamation
Exit Sub
End If
'テーブル説明の表示
wsFL.Range("TABLE_SHORTTEXT") = oRFC.Imports("TABL_INF").Value("SHORTTEXT")
'結果を貼り付ける領域の事前消去
RowLast = wsFL.Cells(ROW_START, 1).SpecialCells(xlCellTypeLastCell).Row
wsFL.Rows(CStr(ROW_START) & ":" & CStr(RowLast)).ClearContents
'結果を貼り付けるための配列への値セット
With oRFC.Tables("TABL_FIELDS")
RowCount = .RowCount
ReDim aFields(0 To RowCount - 1, 0 To COL_MAX - 1)
For RowData = 1 To RowCount
aFields(RowData - 1, 0) = .Value(RowData, "FIELDNAME")
aFields(RowData - 1, 1) = .Value(RowData, "DTELNAME")
aFields(RowData - 1, 2) = .Value(RowData, "CHECKTABLE")
aFields(RowData - 1, 3) = .Value(RowData, "KEYFLAG")
aFields(RowData - 1, 4) = .Value(RowData, "POSITION")
aFields(RowData - 1, 5) = .Value(RowData, "REFTABLE")
aFields(RowData - 1, 6) = .Value(RowData, "REFFIELD")
aFields(RowData - 1, 7) = .Value(RowData, "INCLNAME")
aFields(RowData - 1, 8) = .Value(RowData, "NOTNULL")
aFields(RowData - 1, 9) = .Value(RowData, "DOMANAME")
aFields(RowData - 1, 10) = .Value(RowData, "PARAMID")
aFields(RowData - 1, 11) = .Value(RowData, "LOGFLAG")
aFields(RowData - 1, 12) = .Value(RowData, "HEADLEN")
aFields(RowData - 1, 13) = .Value(RowData, "SCRLEN_S")
aFields(RowData - 1, 14) = .Value(RowData, "SCRLEN_M")
aFields(RowData - 1, 15) = .Value(RowData, "SCRLEN_L")
aFields(RowData - 1, 16) = .Value(RowData, "DATATYPE")
aFields(RowData - 1, 17) = .Value(RowData, "LENGTH")
aFields(RowData - 1, 18) = .Value(RowData, "OUTPUTLEN")
aFields(RowData - 1, 19) = .Value(RowData, "DECIMALS")
aFields(RowData - 1, 20) = .Value(RowData, "LOWERCASE")
aFields(RowData - 1, 21) = .Value(RowData, "SIGNFLAG")
aFields(RowData - 1, 22) = .Value(RowData, "LANGFLAG")
aFields(RowData - 1, 23) = .Value(RowData, "VALUETAB")
aFields(RowData - 1, 24) = .Value(RowData, "CONVEXIT")
aFields(RowData - 1, 25) = .Value(RowData, "DDTEXT")
aFields(RowData - 1, 26) = .Value(RowData, "REPTEXT")
aFields(RowData - 1, 27) = .Value(RowData, "SCRTEXT_S")
aFields(RowData - 1, 28) = .Value(RowData, "SCRTEXT_M")
aFields(RowData - 1, 29) = .Value(RowData, "SCRTEXT_L")
aFields(RowData - 1, 30) = .Value(RowData, "VALUEEXIST")
aFields(RowData - 1, 31) = .Value(RowData, "ADMINFIELD")
aFields(RowData - 1, 32) = .Value(RowData, "INTLENGTH")
aFields(RowData - 1, 33) = .Value(RowData, "INTTYPE")
Next
End With
'ワークシートに結果を貼り付け
With wsFL
.Range(.Cells(ROW_START, COL_START), .Cells(ROW_START + RowCount - 1, COL_START + COL_MAX - 1)) = aFields
End With
'ログオフ
Call SapLogoff
Exit Sub
Err_Exec_RPY_TABLE_READ:
MsgBox Err.Description, vbCritical, ThisWorkbook.Name
End Sub
シート「Logon Setting」の補足
シート「Logon Setting」の上段に「UseSAPLogonIni」という項目があるが、この値は「X」(有効)に設定することを推奨する。

この項目を有効にすると、SAP GUI for Windows に設定済みの接続情報(SystemID)を使ってSAPシステムにログオンする。言い換えると、「ApplicationServer」や「SystemNumber」など、多くの項目の設定を省略できる。設定が必要になるのは、「Use SAP Landscape」の列が「X」の項目のみである。
設定の手間を省けるだけでなく、SAP GUI for Windowsで接続したことのある設定を利用するので、SAPシステムに確実に接続しやすい。
マクロで取得したSAPテーブルの項目一覧の例
Excelマクロによって作成したテーブル項目一覧のExcelワークシートは、こんな感じである。この例では、品目マスタの主要テーブル「MARA」の情報を取得し、一覧表示している。

まとめ: SAPテーブルの情報はExcel上で見よう
SAP S/4HANAのテーブルの情報を効率的に取得するために、Excelマクロ(VBA)から、BAPI: RPY_TABLE_READ を呼び出し、Excel上に項目一覧表を作成する手法を紹介した。SAP GUIでの手動操作に比べ、Excel上で一括してデータを取得・表示することで、業務のスピードが格段に向上する。
本記事の手法を応用することで、他のBAPIを活用したデータ取得や、Excelを使ったカスタムレポート作成も可能だ。
SAPとExcelを連携させた効率化の第一歩として、今回の手法をぜひ試してみてほしい。SAPシステムの構築・導入プロジェクトにおいて、手間を減らし、生産性を高めるための強力なツールとなるだろう。
テーブル項目の一覧表ができたら、次は生成AI(ChatGPT)を使った各項目の「解説」自動化だ!

テーブルの中身を見るデータブラウザSE16の使い方を解説した記事は以下。SE16Hによるテーブル結合の手順も絶賛紹介中。




コメント