SAP購買発注の一覧と詳細を表示するExcelマクロ

SAP購買発注の一覧・詳細を表示するExcelマクロ

SAP S/4HANAを使って購買業務を行っている企業にとって、購買発注伝票の管理は、毎日の業務の中でも欠かせないもののひとつである。

本記事では、SAP ERPの購買発注の情報をExcel上で手軽に確認できるようにする方法として、Excelマクロ(VBA)とBAPIを組み合わせて、購買発注伝票の一覧や詳細情報を表示する仕組みを紹介する。

あわせて、購買関連のテーブルBAPIについても解説するので、購買データを扱う上で必要な知識を、効率よく押さえることができる内容となっている。

なお、本記事で紹介するExcelマクロファイルは「便利ツール」からダウンロードできるので、本記事と併せて活用してほしい。


購買発注を登録するBAPI
目次

購買関連のBAPI

購買関連BAPI一覧

以下は、SAPが提供する購買業務向けの主要なBAPIの一覧である(名称順)。

BAPI名説明
BAPI_CONTRACT_CREATE購買契約を新規作成する。
BAPI_CONTRACT_GETDETAIL既存の購買契約の詳細情報を取得。
BAPI_INFORECORD_GETLIST購買情報レコード(Info Record)の一覧を取得。
BAPI_PO_CREATE1購買発注伝票を新規作成。
BAPI_PO_GETDETAIL購買発注の詳細情報を取得。
BAPI_PO_GETITEMS購買発注の一覧を取得。
BAPI_REQUISITION_CREATE購買依頼を新規作成。
BAPI_REQUISITION_GETDETAIL購買依頼の詳細情報を取得。

本マクロでは、次の2つのBAPIを使用している。

BAPI_PO_GETITEMS

BAPI_PO_GETITEMS は、複数の購買発注伝票をまとめて取得できるBAPIである。

抽出条件(Importパラメータ)として、購買発注伝票番号、仕入先コード、プラント、品目コード、購買組織、購買グループ、発注日付などを指定できる。これらの条件に一致する購買発注の「発注明細」データを、テーブル形式で取得する。

今回のマクロでは、これらの抽出条件はExcelのワークシートから入力できるようにしており、条件に一致した購買発注の主要明細の一覧を、ワークシート上に表示する。

BAPI_PO_GETDETAIL

BAPI_PO_GETDETAIL は、指定した購買発注の詳細情報を取得できるBAPIである。

詳細情報は、標準トランザクション T-CD: ME23N で照会できるデータとほぼ同等である。取得する詳細データは、フラグを指定することで、ヘッダのみ、明細のみ、納入日程行のみと、必要な情報だけを取得できるようになっている。

本マクロでは、パフォーマンスにそれほど影響がなかったため、フラグはすべて指定し、取得した詳細情報をワークシートごとに表示している。

Excelマクロ(VBA)でSAP購買発注データを表示する実装例

以下に、実際にSAPから購買発注データを取得してExcelに一覧表示するためのVBAコードの例を示す。

SAPシステムへのログオン

SAPシステムにログオンするための設定はワークシート「Logon Setting」上に、ログインするためのVBAコードは標準モジュール「Common」に実装している。

他のプロシージャからは、次のように関数「SapChkAndLogon」として呼び出される。

‘SAPログオン状態の確認
If SapChkAndLogon() <> 0 Then Exit Sub

SAPシステムにログインするための設定とVBAコードは、以下の記事で作成したものを流用しているので、「Logon Setting」の設定方法については以下の記事を参考にしてほしい。

購買発注一覧の取得と表示

指定された条件に一致する購買発注データを取得し、ワークシート「購買発注」に一覧表示する。

プロシージャ「Exec_BAPI_PO_GETITEMS」として、標準モジュール「Main」内に実装されている。このプロシージャはワークシート「購買発注一覧」上のボタン「購買発注一覧の取得」に登録されており、同ボタンを押すと呼び出される。

'****************************************************************************************
' 処理名 :Exec_BAPI_PO_GETITEMS
' 機能  :購買発注の一覧を取得する
' 返り値 :なし
' 引数  :なし
'****************************************************************************************
Public Sub Exec_BAPI_PO_GETITEMS()

    On Error GoTo Err_Exec_BAPI_PO_GETITEMS

    Dim wsPO As Worksheet
    Dim oRFC As Object
    Dim RowData As Integer
    Dim aFields() As Variant
    Dim aPO_ITEMS() As Variant
    Dim RowCount As Integer
    Dim RowLast As Long
    Dim ColHeaderL As Integer
    Dim ColHeaderR As Integer
    Dim FlgCondition As Boolean
    Dim RowStart As Integer  '開始行
    Dim Col As Integer
    Dim PO_Number As String
    
    '処理対象のワークシートを変数にセット
    Set wsPO = ActiveSheet

    'SAPログオン状態の確認
    If SapChkAndLogon() <> 0 Then Exit Sub

    '呼び出すBAPIのセット
    goSapFunction.RemoveAll
    Set oRFC = goSapFunction.Add("BAPI_PO_GETITEMS")
    
    '*** Importパラメータの設定
    '購買伝票番号
    PO_Number = Trim(wsPO.Range("PO_NUMBER"))
    If PO_Number <> "" Then
        '購買発注番号が数字のみの場合は先頭ゼロ埋め
        If IsNumeric(PO_Number) Then
            PO_Number = Right("0000000000" & PO_Number, 10)
        End If
        oRFC.Exports("PO_NUMBER") = PO_Number
        FlgCondition = True
    End If
    
    'サプライヤ
    If Trim(wsPO.Range("VENDOR")) <> "" Then
        oRFC.Exports("VENDOR") = Trim(wsPO.Range("VENDOR"))
        FlgCondition = True
    End If
    
    'プラント
    If Trim(wsPO.Range("PLANT")) <> "" Then
        oRFC.Exports("PLANT") = Trim(wsPO.Range("PLANT"))
        FlgCondition = True
    End If
    
    '品目コード
    If Trim(wsPO.Range("MATERIAL")) <> "" Then
        oRFC.Exports("MATERIAL") = Trim(wsPO.Range("MATERIAL"))
        FlgCondition = True
    End If
    
    '購買組織
    If Trim(wsPO.Range("PURCH_ORG")) <> "" Then
        oRFC.Exports("PURCH_ORG") = Trim(wsPO.Range("PURCH_ORG"))
        FlgCondition = True
    End If
    
    '購買グループ
    If Trim(wsPO.Range("PUR_GROUP")) <> "" Then
        oRFC.Exports("PUR_GROUP") = Trim(wsPO.Range("PUR_GROUP"))
        FlgCondition = True
    End If
    
    '発注日
    If Trim(wsPO.Range("DOC_DATE")) <> "" Then
        If IsDate(wsPO.Range("DOC_DATE")) Then
            oRFC.Exports("DOC_DATE") = CDate(wsPO.Range("DOC_DATE"))
            FlgCondition = True
        End If
    End If
    
    If FlgCondition = False Then
        '検索条件が未入力の時
        wsPO.Range("PO_NUMBER").Select
        MsgBox "検索条件を一つ以上設定してください。", vbExclamation, ThisWorkbook.Name
        Exit Sub
    End If
    
    '*** 列見出しの列番号と行番号を取得
    '左端の列
    ColHeaderL = wsPO.Range("PO_ITEMS").Column
    '右端の列
    ColHeaderR = ColHeaderL + wsPO.Range("PO_ITEMS").Columns.Count - 1
    'データ貼り付けの開始行
    RowStart = wsPO.Range("PO_ITEMS").Row + wsPO.Range("PO_ITEMS").Rows.Count

    '*** BAPI実行
    If oRFC.Call = False Then
        'BAPI実行時エラー
        MsgBox oRFC.Exception, vbExclamation
        Exit Sub
    End If
    
    'シートの列見出し(セル範囲"PO_ITEMS")から項目名を取得する
    aPO_ITEMS = wsPO.Range("PO_ITEMS")
    
    '結果を貼り付ける領域の事前消去
    RowLast = CInt(wsPO.Cells(1, 1).SpecialCells(xlLastCell).Row)
    If RowLast > wsPO.Range("PO_ITEMS").Row + wsPO.Range("PO_ITEMS").Rows.Count - 1 Then
        wsPO.Rows(CStr(RowStart) & ":" & CStr(RowLast)).ClearContents
    End If
    
    '*** 結果を貼り付けるための配列に値をセットする
    With oRFC.Tables("PO_ITEMS")
        
        'テーブルPO_ITEMSの件数の取得
        RowCount = .RowCount
        
        If RowCount = 0 Then
            'テーブルの件数=0の時、処理終了
            MsgBox "条件に合う購買発注データが存在しません。", vbExclamation, ThisWorkbook.Name
            GoTo Exit_Exec_BAPI_PO_GETITEMS
        End If
        
        '購買発注のレコードを、ワークシートに貼り付けるための配列の定義
        ReDim aFields(0 To RowCount - 1, 0 To ColHeaderR - ColHeaderL)

        '購買発注テーブルの値を配列にセット
        For RowData = 1 To RowCount
            For Col = ColHeaderL To ColHeaderR
                aFields(RowData - 1, Col - ColHeaderL) = .Value(RowData, CStr(aPO_ITEMS(1, Col - ColHeaderL + 1)))
            Next
        Next
    
    End With
    
    'ワークシートに配列を貼り付け
    With wsPO
        .Range(.Cells(RowStart, ColHeaderL), .Cells(RowStart + RowCount - 1, ColHeaderR)) = aFields
    End With
    
Exit_Exec_BAPI_PO_GETITEMS:

    'ログオフ
    Call SapLogoff
    
    Exit Sub
    
Err_Exec_BAPI_PO_GETITEMS:
    
    'エラー発生時
    MsgBox Err.Description, vbCritical, ThisWorkbook.Name
    
End Sub

このコードのポイント

BAPI: BAPI_PO_GETITEMS の追加

BAPI_PO_GETITEMS を使用可能にするため、オブジェクトgoSapFunctionに次のコードで追加する。

Set oRFC = goSapFunction.Add(“BAPI_PO_GETITEMS”)

goSapFunctionは、クラス Connection にある共通関数 SapLogon によって生成された、SAPとの接続に使用するオブジェクト である。

Importパラメータの設定

BAPI_PO_GETITEMS のImport(入力パラメータ=購買発注データの抽出条件)を設定する。

BAPI_PO_GETITEM は抽出条件を設定しなければ実行できない。抽出条件として、ワークシート「購買発注一覧」の入力項目(セル値)より、購買発注番号やサプライヤコードなどの条件を設定する。

入力値をチェックし、どのセルにも値が入力されていない場合は、警告を表示して処理を終了する。

また、BAPIにとってのImportパラメータは、VBAでは次のようにExportsとして記述する。

'サプライヤ
If Trim(wsPO.Range("VENDOR")) <> "" Then
    oRFC.Exports("VENDOR") = Trim(wsPO.Range("VENDOR"))
    FlgCondition = True
End If
BAPIの実行

Callメソッドを呼び出してBAPIを実行する。実行時例外が発生するとFalseを返す。Falseの場合は、Exceptionプロパティにエラーメッセージがセットされる。

'*** BAPI実行
If oRFC.Call = False Then
    'BAPI実行時エラー
    MsgBox oRFC.Exception, vbExclamation
    Exit Sub
End If
データテーブル PO_ITEMS から値を取り出す

BAPIの実行が成功すると、戻り値としてデータテーブル PO_ITEMS に購買発注の一覧がセットされる。

PO_ITEMS にある項目名は、ワークシート「購買発注一覧」の列見出し(セル範囲「PO_ITEMS」)から取得する。セル範囲 PO_ITEMS の上段にある項目名を使ってデータテーブルから値を取り出し、ワークシートに貼り付けるための配列にセットしている。

    'シートの列見出し(セル範囲"PO_ITEMS")から項目名を取得する
    aPO_ITEMS = wsPO.Range("PO_ITEMS")

    '購買発注のレコードを、ワークシートに貼り付けるための配列の定義
    ReDim aFields(0 To RowCount - 1, 0 To ColHeaderR - ColHeaderL)

    '購買発注テーブルの値を配列にセット
    For RowData = 1 To RowCount
        For Col = ColHeaderL To ColHeaderR
            aFields(RowData - 1, Col - ColHeaderL) = oRFC.Tables("PO_ITEMS").Value(RowData, CStr(aPO_ITEMS(1, Col - ColHeaderL + 1)))
        Next
    Next

購買発注詳細データの取得

ワークシート「購買発注一覧」で選択中の行の、購買発注の詳細データを取得し、各ワークシートに表示する。

プロシージャ「Exec_BAPI_PO_GETDETAILS」として、標準モジュール「Main」内に実装されている。このプロシージャはワークシート「購買発注一覧」上のボタン「購買発注詳細」に登録されており、同ボタンを押すと呼び出される。

処理が成功すると、ワークシート「購買発注詳細」がアクティブになる。

'****************************************************************************************
' 処理名 :Exec_BAPI_PO_GETDETAILS
' 機能  :選択中の購買発注の詳細データを取得する
' 返り値 :なし
' 引数  :なし
'****************************************************************************************
Public Sub Exec_BAPI_PO_GETDETAILS()

    On Error GoTo Err_Exec_BAPI_PO_GETDETAILS

    Dim wsPO As Worksheet
    Dim PO_Number As String
    Dim oRFC As Object
    
    'SAPログオン状態の確認
    If SapChkAndLogon() <> 0 Then Exit Sub

    '購買発注一覧のワークシートを変数にセット
    Set wsPO = ActiveSheet

    '選択中の行の購買発注番号を取得
    PO_Number = Trim(wsPO.Cells(ActiveCell.Row, wsPO.Range("PO_ITEMS").Column))
    
    If PO_Number = "" Then
        '購買発注番号が取得できない時、処理を中断
        MsgBox "購買発注番号を取得できません。", vbExclamation, ThisWorkbook.Name
        Exit Sub
    End If
    
    '呼び出すBAPIのセット
    goSapFunction.RemoveAll
    Set oRFC = goSapFunction.Add("BAPI_PO_GETDETAIL")
    
    '購買発注番号が数字のみの場合は先頭ゼロ埋め
    If IsNumeric(PO_Number) Then
        PO_Number = Right("0000000000" & PO_Number, 10)
    End If
    
    '購買発注番号のセット
    oRFC.Exports("PURCHASEORDER") = PO_Number

    'データを取得するためのフラグをセット
    '明細データ取得
    oRFC.Exports("ITEMS") = "X"
    '勘定設定取得フラグ
    oRFC.Exports("ACCOUNT_ASSIGNMENT") = "X"
    '納入日程行
    oRFC.Exports("SCHEDULES") = "X"
    '購買発注履歴取得フラグ
    oRFC.Exports("HISTORY") = "X"
    '明細テキスト取得フラグ
    oRFC.Exports("ITEM_TEXTS") = "X"
    'ヘッダテキスト取得フラグ
    oRFC.Exports("HEADER_TEXTS") = "X"
    'サービスおよび制限値取得フラグ
    oRFC.Exports("SERVICES") = "X"
    '確認取得フラグ
    oRFC.Exports("CONFIRMATIONS") = "X"
    'サービステキスト取得フラグ
    oRFC.Exports("SERVICE_TEXTS") = "X"
    'カスタマ独自の項目も提供
    oRFC.Exports("EXTENSIONS") = "X"
    
    '*** BAPI実行
    If oRFC.Call = False Then
        'BAPI実行時エラー
        MsgBox oRFC.Exception, vbExclamation
        GoTo Exit_Exec_BAPI_PO_GETDETAILS
    End If
    
    If oRFC.Tables("PO_ITEMS").RowCount = 0 Then
        '明細データの件数=0の時、処理中止
        MsgBox "明細データが見つかりません。", vbExclamation, ThisWorkbook.Name
        GoTo Exit_Exec_BAPI_PO_GETDETAILS
    End If
    
    '購買明細の表示
    If SetRfcTableData(Worksheets("購買発注明細"), oRFC.Tables("PO_ITEMS")) <> 0 Then
        'エラー発生時は処理中断
        GoTo Exit_Exec_BAPI_PO_GETDETAILS
    End If

    '勘定設定
    If SetRfcTableData(Worksheets("勘定設定"), oRFC.Tables("PO_ITEM_ACCOUNT_ASSIGNMENT")) <> 0 Then
        GoTo Exit_Exec_BAPI_PO_GETDETAILS
    End If

    '納入日程行
    If SetRfcTableData(Worksheets("納入日程行"), oRFC.Tables("PO_ITEM_SCHEDULES")) <> 0 Then
        GoTo Exit_Exec_BAPI_PO_GETDETAILS
    End If

    '購買発注履歴
    If SetRfcTableData(Worksheets("購買発注履歴"), oRFC.Tables("PO_ITEM_HISTORY")) <> 0 Then
        GoTo Exit_Exec_BAPI_PO_GETDETAILS
    End If
    
    '明細テキスト
    If SetRfcTableData(Worksheets("明細テキスト"), oRFC.Tables("PO_ITEM_TEXTS")) <> 0 Then
        GoTo Exit_Exec_BAPI_PO_GETDETAILS
    End If
    
    'ヘッダテキスト
    If SetRfcTableData(Worksheets("ヘッダテキスト"), oRFC.Tables("PO_HEADER_TEXTS")) <> 0 Then
        GoTo Exit_Exec_BAPI_PO_GETDETAILS
    End If
    
    'サービス
    If SetRfcTableData(Worksheets("サービス"), oRFC.Tables("PO_ITEM_SERVICES")) <> 0 Then
        GoTo Exit_Exec_BAPI_PO_GETDETAILS
    End If
    
    '確認
    If SetRfcTableData(Worksheets("確認"), oRFC.Tables("PO_ITEM_CONFIRMATIONS")) <> 0 Then
        GoTo Exit_Exec_BAPI_PO_GETDETAILS
    End If
    
    'サービステキスト
    If SetRfcTableData(Worksheets("サービステキスト"), oRFC.Tables("PO_SERVICES_TEXTS")) <> 0 Then
        GoTo Exit_Exec_BAPI_PO_GETDETAILS
    End If
    
    'カスタマ独自の項目
    If SetRfcTableData(Worksheets("カスタマ独自の項目"), oRFC.Tables("EXTENSIONOUT")) <> 0 Then
        GoTo Exit_Exec_BAPI_PO_GETDETAILS
    End If

    'ワークシート購買明細をアクティブに
    Worksheets("購買発注明細").Select


Exit_Exec_BAPI_PO_GETDETAILS:

    'ログオフ
    Call SapLogoff
    
    Exit Sub
    
Err_Exec_BAPI_PO_GETDETAILS:
    
    'エラー発生時
    MsgBox Err.Description, vbCritical, ThisWorkbook.Name
    
End Sub

このコードのポイント

BAPI_PO_GETDETAIL へのパラメータの設定

詳細データを取得するためのフラグはすべてセットしている。

BAPI_PO_GETDETAIL Import Parameters
'データを取得するためのフラグをセット
'明細データ取得
oRFC.Exports("ITEMS") = "X"
'勘定設定取得フラグ
oRFC.Exports("ACCOUNT_ASSIGNMENT") = "X"
'納入日程行
oRFC.Exports("SCHEDULES") = "X"
'購買発注履歴取得フラグ
oRFC.Exports("HISTORY") = "X"
'明細テキスト取得フラグ
oRFC.Exports("ITEM_TEXTS") = "X"
'ヘッダテキスト取得フラグ
oRFC.Exports("HEADER_TEXTS") = "X"
'サービスおよび制限値取得フラグ
oRFC.Exports("SERVICES") = "X"
'確認取得フラグ
oRFC.Exports("CONFIRMATIONS") = "X"
'サービステキスト取得フラグ
oRFC.Exports("SERVICE_TEXTS") = "X"
'カスタマ独自の項目も提供
oRFC.Exports("EXTENSIONS") = "X"
購買発注番号の設定

数値であるかを検査し、数値だった場合は先頭にゼロを埋めて10桁となるようにしている。

これは、ABAPプログラムと違い、外部プログラムからBAPIをコールする場合は「アルファ変換が自動的に行われないためである。

'購買発注番号が数字のみの場合は先頭ゼロ埋め
If IsNumeric(PO_Number) Then
    PO_Number = Right("0000000000" & PO_Number, 10)
End If

'購買発注番号のセット
oRFC.Exports("PURCHASEORDER") = PO_Number
  • アルファ変換:文字列(CHAR型)データの前ゼロ補完や削除を行うための仕組み。
取得した購買詳細データのワークシートへの表示

BAPIを実行すると、購買詳細データはデータテーブルに戻り値として返される。

データテーブルは複数あるので、SetRfcTableData 関数(後述)を、ワークシートデータテーブルを引数として渡し、呼び出す。

購買発注の詳細データを表示するためのExcelワークシート
BAPI_PO_GETDETAIL Table Parameters
'購買明細の表示
If SetRfcTableData(Worksheets("購買発注明細"), oRFC.Tables("PO_ITEMS")) <> 0 Then
    'エラー発生時は処理中断
    GoTo Exit_Exec_BAPI_PO_GETDETAILS
End If

'勘定設定
If SetRfcTableData(Worksheets("勘定設定"), oRFC.Tables("PO_ITEM_ACCOUNT_ASSIGNMENT")) <> 0 Then
    GoTo Exit_Exec_BAPI_PO_GETDETAILS
End If

購買発注詳細データの表示

BAPI_PO_GETDETAIL で取得した購買発注の詳細データ(各データテーブル)を、各ワークシートに表示する。この処理は、関数「SetRfcTableData」によって行う。

'****************************************************************************************
' 処理名 :SetRfcTableData
' 機能  :取得したテーブル型のデータをワークシートに表示する
' 返り値 :エラー番号 (正常終了=0)
' 引数  :wsWork = ワークシート
'           oRfcTable = SAPから返されるテーブル型のデータ
'****************************************************************************************
Private Function SetRfcTableData(wsWork As Worksheet, ByRef oRfcTable As Object) As Long

    On Error GoTo Err_SetRfcTableData

    Dim RowLast As Long
    Dim RowCount As Integer
    Dim aDETAIL_ITEMS() As Variant
    Dim RowData As Integer
    Dim Col As Integer
    Dim aFields() As Variant
    Dim ColHeaderL As Integer
    Dim ColHeaderR As Integer
    Dim RowStart As Integer
    
    'データ貼り付けの開始行を取得
    RowStart = wsWork.Range("DETAIL_ITEMS").Row + wsWork.Range("DETAIL_ITEMS").Rows.Count

    '結果を貼り付ける領域の事前消去
    RowLast = CInt(wsWork.Cells(1, 1).SpecialCells(xlLastCell).Row)
    If RowLast > wsWork.Range("DETAIL_ITEMS").Row + wsWork.Range("DETAIL_ITEMS").Rows.Count - 1 Then
        wsWork.Rows(CStr(RowStart) & ":" & CStr(RowLast)).ClearContents
    End If
    
    'テーブルの件数を取得
    RowCount = oRfcTable.RowCount
    
    If RowCount = 0 Then
        'テーブル件数=0の時、処理を抜ける
        Exit Function
    End If
    
    'シートの列見出し(セル範囲"DETAIL_ITEMS")を配列にセット
    aDETAIL_ITEMS = wsWork.Range("DETAIL_ITEMS")

    '*** 列見出しの列番号を取得
    '左端の列
    ColHeaderL = wsWork.Range("DETAIL_ITEMS").Column
    '右端の列
    ColHeaderR = ColHeaderL + wsWork.Range("DETAIL_ITEMS").Columns.Count - 1
    
    'テーブルの値をシートに貼り付けるための配列の定義
    ReDim aFields(0 To RowCount - 1, 0 To ColHeaderR - ColHeaderL)

    'テーブルの値を配列にセット
    With oRfcTable
        For RowData = 1 To RowCount
            For Col = ColHeaderL To ColHeaderR
                aFields(RowData - 1, Col - ColHeaderL) = .Value(RowData, CStr(aDETAIL_ITEMS(1, Col - ColHeaderL + 1)))
            Next
        Next
    End With
    
    'ワークシートに配列を貼り付け
    With wsWork
        .Range(.Cells(RowStart, ColHeaderL), .Cells(RowStart + RowCount - 1, ColHeaderR)) = aFields
    End With

    Exit Function

Err_SetRfcTableData:

    'エラー発生時
    SetRfcTableData = Err.Number
    MsgBox Err.Description, vbError, ThisWorkbook.Name

End Function

このコードのポイント

ワークシートの見出し行から項目名を取得

データテーブルの項目にアクセスするための項目名は、ワークシートの列見出しの上段から取得する。

詳細データを表示するためのワークシートの列見出しには、すべてセル範囲「DETAIL_ITEMS」という共通の名前をつけている。セル範囲に同じ名前をつけることによって、どのワークシートからも DETAIL_ITEMS からテーブルの項目名を取得できるようになっている。

項目名をVBAコードに記述せず、セル範囲から取得するため、表示する項目を増やしたい(減らしたい)場合は、セル範囲 DETAIL_ITEMS 内にある列を増やす(減らす)だけでよい。

'シートの列見出し(セル範囲"DETAIL_ITEMS")を配列にセット
aDETAIL_ITEMS = wsWork.Range("DETAIL_ITEMS")

'*** 列見出しの列番号を取得
'左端の列
ColHeaderL = wsWork.Range("DETAIL_ITEMS").Column
'右端の列
ColHeaderR = ColHeaderL + wsWork.Range("DETAIL_ITEMS").Columns.Count - 1

'テーブルの値をシートに貼り付けるための配列の定義
ReDim aFields(0 To RowCount - 1, 0 To ColHeaderR - ColHeaderL)

'テーブルの値を配列にセット
With oRfcTable
    For RowData = 1 To RowCount
        For Col = ColHeaderL To ColHeaderR
            aFields(RowData - 1, Col - ColHeaderL) = .Value(RowData, CStr(aDETAIL_ITEMS(1, Col - ColHeaderL + 1)))
        Next
    Next
End With

'ワークシートに配列を貼り付け
With wsWork
    .Range(.Cells(RowStart, ColHeaderL), .Cells(RowStart + RowCount - 1, ColHeaderR)) = aFields
End With

まとめ:SAP購買発注データをBAPI+Excelマクロで手軽に利活用

本記事では、SAP S/4HANA環境での購買発注データを手軽に取得するための手法として、購買関連のBAPIの紹介と、Excelマクロ(VBA)+BAPI(BAPI_PO_GETITEMS, BAPI_PO_GETDETAIL)の実装方法を詳しく解説した。

S/4HANAでは、標準機能だけでは実現できないカスタム開発はABAPアドオンに傾きがちだが、こうしたVBAマクロによって、少し手軽にデータを利活用することができる。本記事をきっかけに、自社業務に最適なS/4HANAの機能拡張へと繋げていただければ幸いである。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

CAPTCHA

This site uses Akismet to reduce spam. Learn how your comment data is processed.

目次