![見出し画像](https://assets.st-note.com/production/uploads/images/169897513/rectangle_large_type_2_7b2189b805694a8a1d1174bbceb71d4f.png?width=1200)
エクセル小技:IBMiからSQLでデータ取得するマクロ
かなり以前に、投げ捨て型SQLのサンプルを作りましたが、今回はデータ取得のサンプルです。
最低限のコードサンプルになってますので、エラー処理やら項目編集やらSQL編集やらは、適当に改造して下さい。
サンプルコード
は、QGPL/QAUOOPT の内容をエクセルシートに1項目ずつ貼り付けています。
SQLを元にレコードセット作ったら、レコード読んで項目単位の処理をする感じです。
繋げるまでが面倒ですけど、ほぼお約束なので、SQL文を渡してレコードセットを返すようなサブルーチンを用意しておくのが良いかと思います。
Sub Reference_SQL()
'セル設定
Cur_Row = ActiveCell.Row
Cur_Col = ActiveCell.Column - 1
'ODBC接続
Set L_ADOcon = CreateObject("ADODB.Connection")
L_ADOcon.ConnectionString = "DRIVER=IBM i Access ODBC Driver;SYSTEM=192.168.0.1;UID=QSECOFR;PWD=QSECOFR;TRANSLATE=1"
L_ADOcon.Open
'レコードセット作成
Set L_RecordSet = CreateObject("ADODB.Recordset")
L_RecordSet.CursorType = 0 'adOpenForwardOnly
L_RecordSet.LockType = 1 'adLockReadOnly
L_RecordSet.Open "select * from QGPL.QAUOOPT", L_ADOcon, , , &H1 'adCmdText
'カラムテキスト
For i = 1 To (L_RecordSet.Fields.Count)
Cells(Cur_Row, Cur_Col + i) = Trim(L_RecordSet(i - 1).Name)
Next
'データセット
Do While (Not L_RecordSet.EOF)
Cur_Row = Cur_Row + 1
'↓↓↓ ここいら辺に、一行ずつの処理を入れる。
For i = 1 To (L_RecordSet.Fields.Count)
Cells(Cur_Row, Cur_Col + i) = Trim(L_RecordSet(i - 1))
Next
'↑↑↑ ここいら辺に入れる。
L_RecordSet.MoveNext
Loop
'接続解除
L_RecordSet.Close
Set L_RecordSet = Nothing
L_ADOcon.Close
Set L_ADOcon = Nothing
End Sub
参考にしたサイト
IBM i Access ODBC - 接続ストリング・キーワード
https://www.ibm.com/docs/ja/i/7.5?topic=details-connection-string-keywords