| |
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
|