VBAからの汎用モジュール実行

《要 点》
特に難しい点は無く、実行できる汎用モジュールにも制限などはない。
また呼び出し方・実行後の結果取得共に完全に決まりきった形式であり、
流れさえ覚えれば後は流用可能。

サンプルプログラム

 
Option Explicit

Public Function FUNC_CALL()

' --------------------------------------------------------------
' 変数宣言部
' --------------------------------------------------------------

' R/3 接続用変数 - - - - - - - - - - - - - - - - -

Dim R3          As Object ' R/3接続用
Dim rfcFunc     As Object ' 汎用モジュール実行用

' 実行する汎用モジュール用変数 - - - - - - - - - -
' R/3側と同じものを準備する

Dim QUERY_TABLE As Object ' IMPORTパラメータ 1
Dim DELIMITER   As Object ' IMPORTパラメータ 2
Dim NO_DATA     As Object ' IMPORTパラメータ 3
Dim ROWSKIPS    As Object ' IMPORTパラメータ 4
Dim ROWCOUNT    As Object ' IMPORTパラメータ 5

                          ' EXPORTパラメータ(なし)

Dim OPTIONS As Object     ' TABLESパラメータ 1
Dim FIELDS  As Object     ' TABLESパラメータ 2
Dim DATA    As Object     ' TABLESパラメータ 3


' Excel内部変数 - - - - - - - - - - - - - - - - - -
' 今回実行する汎用モジュールの結果受信用

Dim Result  As Boolean  ' 実行結果判定用

Dim iRow    As Integer  ' 処理対象行
Dim iColumn As Integer  ' 処理対象列

Dim iField  As Integer  ' データ格納場所
Dim iStart  As Integer  ' データ開始位置
Dim iLength As Integer  ' データ長
Dim vField  As Variant  ' データ値


'---------------------------------------------------------------
'R/3 への接続処理
'---------------------------------------------------------------

' 接続のパラメータ入力
Set R3 = CreateObject("SAP.Functions")        ' 決まり文句
R3.Connection.ApplicationServer = ServerAddr  ' xxx.xxx.xxx.xxx など
R3.Connection.Client            = ClientNum   ' クライアント番号
R3.Connection.User              = UserID      ' ユーザID
R3.Connection.Password          = Password    ' ログインパスワード
R3.Connection.Language          = "JA"        ' 言語

' ログイン実行
If R3.Connection.Logon(0, True) <> True Then
    MsgBox "R/3 ログインに失敗しました"
    Exit Function
End If


'---------------------------------------------------------------
'汎用モジュール実行
'---------------------------------------------------------------

' ※ Set関数を利用し、各値に簡単にアクセス出来るようにする

' 実行する汎用モジュールの指定
Set rfcFunc = R3.Add("RFC_READ_TABLE")

' モジュールパラメータの設定
Set QUERY_TABLE = rfcFunc.exports("QUERY_TABLE") ' EXPORTパラメータ設定
Set DELIMITER   = rfcFunc.exports("DELIMITER")
Set NO_DATA     = rfcFunc.exports("NO_DATA")
Set ROWSKIPS    = rfcFunc.exports("ROWSKIPS")
Set ROWCOUNT    = rfcFunc.exports("ROWCOUNT")
Set OPTIONS     = rfcFunc.Tables("OPTIONS")      ' TABLESパラメータ設定
Set FIELDS      = rfcFunc.Tables("FIELDS")

' パラメータに値を設定する(とりあえず必要最低限のみ)
QUERY_TABLE.Value = "T001W"                 ' テーブル T001Wを読み込む
DELIMITER.Value   = ""                      ' 各列の値はカンマ区切りで返される     
NO_DATA           = " "                     ' データの無い列も取得
ROWCOUNT          = 100                     ' 最大100行取得
ROWSKIPS          = 0                       ' 先頭から連続で100行取得する

' 汎用モジュールの実行
Result = rfcFunc.Call

' 実行結果の成否判定
If Result = True Then
    ' 成功 → 値の取得準備を実施
    Set DATA    = rfcFunc.Tables("DATA")
    Set FIELDS  = rfcFunc.Tables("FIELDS")
    Set OPTIONS = rfcFunc.Tables("OPTIONS")
Else
    ' 失敗 → メッセージを表示し、ログアウトして終了
    MsgBox rfcFunc.Exception
    R3.Connection.Logoff
    Exit Function
End If

' 実行が終わったので接続は終了する
R3.Connection.Logoff


'---------------------------------------------------------------
' 実行結果を表示する
'---------------------------------------------------------------

' ※ 戻り値のデータの構造はR/3側の定義ものそのままとなる
'
' “この汎用モジュールの”実行結果は、DATAテーブルのWA列に
' カンマ区切りで入っているので切り出す。

' 取得したデータ件数分だけループ
For iRow = 1 To DATA.ROWCOUNT

    ' データフィールド数だけループ
    For iField = 1 To FIELDS.ROWCOUNT
        iStart = FIELDS(iField, "OFFSET") + 1   ' データ開始位置
        iLength = FIELDS(iField, "LENGTH")      ' データの長さ
        
        ' テーブルデータへのアクセスは 変数名(行番号, 列名) にて行える
        If iStart > Len(DATA(iRow, "WA")) Then
            vField = Null ' 値なし
        Else
            vField = Mid(DATA(iRow, "WA"), iStart, iLength)
    End If

    ' Sheet1に取得値を出力
    Sheet1.Cells(iRow, iField).Value = Trim(vField)
    
    Next
Next
    
End Function
戻る

inserted by FC2 system