- 締切済み
SAPデータ取得 エクセルVBA
いつもここでお世話になっております。 次のサイトで掲載されていたVBAで、SAPのデータ(テーブルデータ)をエクセルで取得することができることがわかりましたが、例えばですがSQLを利用するようなVBAを追記して、任意のフィールド、任意のデータを指定して、それに合致するものだけをエクセルに表示させることはできないでしょうか(イメージとして、SELECT フィールド FROM QUERY_TABLE WHERE データのような感じ)。 何度も試行錯誤をしたのですが、うまくいきません。なにとぞよろしくお願い申し上げます。 ※SAPテーブル取得のエクセルVBA : http://d.hatena.ne.jp/sikakura/20100702/1278053742 -ーーー【以下、テーブルデータ取得のためにVBA】---- Sub ログインR3_LOGON() Set R3 = CreateObject("SAP.Functions") 'R3.Connection.System = "172.31.220.42" 'R3.Connection.client = "100" 'R3.Connection.User = "SAP*" 'R3.Connection.Password = "" 'R3.Connection.Language = "EN" '自動ログインする場合は、Connection.Logon(0,True)にして、 '上のパラメータを設定すればOK. If R3.Connection.Logon(0, False) <> True Then MsgBox "ログインを中止しました" Exit Sub End If 'IMPORTパラメータ Dim QUERY_TABLE As Object Dim DELIMITER As Object Dim NO_DATA As Object Dim ROWSKIPS As Object Dim ROWCOUNT As Object '条件式 Dim OPTIONS As Object Dim FIELDS As Object 'データ Dim DATA As Object '結果保持用 Dim ROW As Object Dim Result As Boolean Dim iRow, iColumn, iStart, iStartRow, iField, iLength As Variant '***************************************************** 'RFC_READ_TABLEを指定します '***************************************************** Set MyFunc = R3.Add("RFC_READ_TABLE") Set QUERY_TABLE = MyFunc.exports("QUERY_TABLE") Set DELIMITER = MyFunc.exports("DELIMITER") Set NO_DATA = MyFunc.exports("NO_DATA") Set ROWSKIPS = MyFunc.exports("ROWSKIPS") Set ROWCOUNT = MyFunc.exports("ROWCOUNT") Set DATA = MyFunc.Tables("DATA") Set OPTIONS = MyFunc.Tables("OPTIONS") Set FIELDS = MyFunc.Tables("FIELDS") QUERY_TABLE.Value = "CSKT" DELIMITER.Value = " " NO_DATA = " " ROWSKIPS = 0 ROWCOUNT = 0 Result = MyFunc.Call If Result = True Then Set DATA = MyFunc.Tables("DATA") Set FIELDS = MyFunc.Tables("FIELDS") Set OPTIONS = MyFunc.Tables("OPTIONS") Else MsgBox MyFunc.EXCEPTION Exit Sub End If '列名をExcelシートに出力 For iField = 1 To FIELDS.ROWCOUNT Worksheets("Sheet2").Cells(1, iField).Value = FIELDS(iField, "FIELDTEXT") Next 'データをExcelシートに出力 iField = 1 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 Worksheets("Sheet2").Cells(iRow + 1, iField).Value = vField Next Next ' **************************************************** ' Release Object ' **************************************************** Set MyFunc = Nothing Set QUERY_TABLE = Nothing Set DELIMITER = Nothing Set NO_DATA = Nothing Set ROWSKIPS = Nothing Set ROWCOUNT = Nothing Set OPTIONS = Nothing Set FIELDS = Nothing End Sub Private Function Split(ByVal inp As String, Optional delim As String = ",") As Variant Dim outarray() As Variant Dim arrsize As Integer While InStr(inp, delim) > 0 ReDim Preserve outarray(0 To arrsize) As Variant outarray(arrsize) = Left(inp, InStr(inp, delim) - 1) inp = Mid(inp, InStr(inp, delim) + 1) arrsize = arrsize + 1 Wend ReDim Preserve outarray(0 To arrsize) As Variant outarray(arrsize) = inp Split = outarray End Function ーーーーーーーーーーーーーーーーーーーーーー
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- imogasi
- ベストアンサー率27% (4737/17069)
SAPという言葉を初めに出して、質問すれば、回答は出ないのではないかと 予想した。こういうコーナーを見ていて、SAPの回答をできる人は、いないだろう。 世の中のこのコーナーの読者の層を想像して、質問表現をを工夫すべきだ。 また実際はエクセルVBAの質問ではないのか。 SAPからエクセルへのデータを持ってくるのは、特有の橋渡しのメッソッドなどが 要るでしょうが。 SAPを利用できているということは、勤務先が相当なお金を払っているはず。 SAPやそのパートナー企業は、相談員(カスタマエンジニア?)がいて、教えて くれるのではないか。質問者は会社のシスエム部の担当者でなく、依頼ができないのかな? あるいはSAPのSEの人もエクセルVBAなどは詳しいとは限らないかも。 SAPではないが,昔にExcelなんてというSEもいたが。 本件は、質問者ができるエクセルのシートにデータを落として、データ選別まがいのことを して、エクセルシートデータを作りたいのだろうが、エクセルVBAも詳しいのかな。 ーー SQLの例が出ているが、エクセルのシートデータになれば、シートの各行を順次 読んで、望みの項目に対しIF文で聞いて選別すれば済むことではないか? SAPデーターー>エクセルシートデータへは、プログラムで達成しているのですね。 (=質問のコードの前半はうまく行っているのですね)ここで前半処理と後半処理を 切り分けられると思う。 後半でSQLを使ってシートデータを別シートに選別できれば良いのでは。 ーー その後半のエクセルデータをSQLで選別するのは、余りVBAではやらないようだが、 (エクセルでは、IF文で選別やFilterなどもあるから。)SQLのように 集合処理ではなく、レコード処理(各行処理)がしやすい。 SQLが背後で動いているようなのは (1)MSクエリを使う (2)ADOでSQLを使う (3)Accessへデータを渡して(エクセルからでも簡単)、クエリを使う (うらではSQLが動いているようだ) などが考えられると思った。 ーー 前記の(2)のことを考えて、WEB照会して、下記のようなものが見つかったので 参考までに上げてみます。 WEBに記事はあってもコピペ程度で実行すると(やる人の力不足っで)うまく行かない場合が 多いので、多分そのままコピペで動くコードを上げてみる。。 (1)エクセルデータはWEBより住所録を借用して、その右列に住所の府県コードを 入れた。 ファイル名 住所録例.xlsx Sheet1 ID 名前 フリガナ 郵便番号 住所 電話番号 府県コード 1 伊藤 武 イトウ タケシ 612-8324 京都府京都市伏見区小豆屋町 075-5**-**** 1 2 井上 勝 イノウエ マサル 665-0014 兵庫県宝塚市青葉台 0797-8*-**** 2 3 榎本 幸治 エノモト コウジ 583-0842 大阪府羽曳野市飛鳥 0729-5*-**** 3 4 太田 博 オオタ ヒロシ 560-0015 大阪府豊中市赤阪 06-68**-**** 3 5 萱島 真 カヤシマ マコト 569-1146 大阪府高槻市赤大路町 0726-9*-**** 3 6 木下 宏道 キノシタ ヒロミチ 598-0014 大阪府泉佐野市葵町 0724-6*-**** 3 7 久部 明弘 クベ アキヒロ 541-0052 大阪府大阪市中央区安土町 06-67**-**** 3 8 児玉 智弘 コダマ トモヒロ 600-8071 京都府京都市下京区相之町 075-3**-**** 1 9 綾野 亜希 アヤノ アキ 573-0026 大阪府枚方市朝日丘町 072-84*-**** 3 10 江本 綾子 エモト アヤコ 545-0000 大阪府大阪市阿倍野区 06-67**-**** 3 11 岡田 優梨子 オカダ ユリコ 675-0026 兵庫県加古川市尾上町旭 0794-2*-**** 2 12 加藤 裕美 カトウ ユミ 631-0053 奈良県奈良市青垣台 0742-4*-**** 4 13 河野 恵美子 コウノ エミコ 601-1394 京都府宇治市池尾 0774-3*-**** 1 14 斎藤 美恵 サイトウ ミエ 532-0031 大阪府大阪市淀川区加島 06-63**-**** 3 15 篠原 信子 シノハラ ノブコ 591-8007 大阪府堺市北区奥本町 0729-3*-**** 3 16 田中 裕子 タナカ ユウコ 662-0063 兵庫県西宮市相生町 0798-6*-**** 2 (2)エクセルのVBE画面で、 ツールー参照設定 Microsoft Office 15.0 Object Library Microfoft Active Data Objects 2.8 library にチェックを入れて参照設定を行う。 (3)下記コードを、標準モジュールにコピペ ーーーー Sub ExcelにADO接続() 'パスワード付きのエクセルファイルに接続する Dim myCon As New ADODB.Connection, FileName As String, myPass As String Dim conStr As String '接続先のExcelファイルとパスワード MsgBox ThisWorkbook.Path FileName = ThisWorkbook.Path & "\" & "住所録例.xlsx" myPass = "password" 'エクセルファイルを開く (ファイルが開かれていないと接続できない) Workbooks.Open FileName, Password:=myPass '接続文字列 conStr = "Provider=Microsoft.Jet.OLEDB.4.0;" & _ "Extended Properties=Excel 8.0;" & _ "Data Source=" & FileName '接続 myCon.Open conStr MsgBox "Excelブックに接続完了!" '--- ' SQL文作成 Dim strSQL As String Dim dbRes 'strSQL = "SELECT * FROM [Sheet1$]" ' ←単純に全件転記ならこの記述 strSQL = "SELECT * FROM [Sheet1$] WHERE 府県コード=3 ORDER BY フリガナ;" ' RecordSet取得(表示用) Set dbRes = New ADODB.Recordset dbRes.CursorLocation = adUseClient dbRes.Open strSQL, myCon, adOpenDynamic, adLockOptimistic, adCmdText ' シートクリア Cells.ClearContents '--------------------------------------------------------------------------- ' 見出し作成(普通は要らない!) Dim col For col = 1 To dbRes.Fields.Count Cells(1, col).Value = dbRes.Fields(col - 1).Name Next col '--------------------------------------------------------------------------- ' 明細のセット 'Cells(2, 1).CopyFromRecordset dbRes ' ←単純に全件転記ならこの記述でOK! Dim GYO GYO = 1 Do Until dbRes.EOF GYO = GYO + 1 For col = 1 To dbRes.Fields.Count Cells(GYO, col).Value = dbRes.Fields(col - 1).Value Next col dbRes.MoveNext Loop ' 終了 dbRes.Close: Set dbRes = Nothing myCon.Close: Set myCon = Nothing '--- '接続を解除し、オブジェクトをクリア 'myCon.Close: Set myCon = Nothing 'Excelブックを閉じる Workbooks("住所録例.xlsx").Close End Sub ーーーー (4)実行 結果はSheet2に下記の通り。 府県コード「2}(大阪府)を抜き出し ID 名前 フリガナ 郵便番号 住所 電話番号 府県コード 9 綾野 亜希 アヤノ アキ 573-0026 大阪府枚方市朝日丘町 072-84*-**** 3 3 榎本 幸治 エノモト コウジ 583-0842 大阪府羽曳野市飛鳥 0729-5*-**** 3 10 江本 綾子 エモト アヤコ 545-0000 大阪府大阪市