SAP S/4HANAは強力なERPシステムだが、その膨大なテーブルや項目情報を扱うのは容易ではない。特に、業務要件に応じたデータ構造の把握や、テーブルの詳細な項目情報を迅速に確認する必要がある場合、SAP GUIで手動操作を繰り返すのは非効率的だ。
そこで本記事では、Excelマクロ(VBA)からSAP S/4HANAやECCに接続し、指定したテーブルの項目情報を一括で取得、一覧表示する方法を紹介する。この手法を活用すれば、SAP GUIを開くことなく、簡単にSAPシステムのテーブル項目情報をExcelワークシート上で確認できるようになる。SAPテーブルの項目一覧表をExcelで作成したい方にとって、非常に役立つ内容となっている。
SAPシステムとExcelを連携させることで、どのように手間を省き、生産性を最大化できるのか? その答えをぜひ本記事で見つけてほしい。
RPY_TABLE_READ
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“が実行される。
マクロ(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システムの構築・導入プロジェクトにおいて、手間を減らし、生産性を高めるための強力なツールとなるだろう。
コメント