注意
これは私の環境下における私の備忘録です。お使いの環境によっては内容が異なる場合があります。システム管理者でない方は絶対にやらないでください。システムにはログが残るものなので、万が一があればクビになるかもしれません。私は何も責任を負いませんのでご了承のうえご覧ください。
環境
普通AS400は企業にしかありませんので企業のPCということで。
この話のお題はExcelなので、WindowsPCのExcel上にAS400のデータをダウンロードしたいという話です。
設定するものはユーザーPCです。AS400には一切触りません。
使うもの
まずパソコンにODBCドライバーの導入が必要です。
クライアントアクセスというAS400にアクセスするエミュレータをインストールすればODBCドライバーは勝手に入ります(インストールのときODBCを利用する選択が必要です)
インストーラーは管理者の方が持っているでしょう。
ODBCが入っているかの確認
Winキーを押すと出てくる「ここに入力して検索」にodbcと入力してエンターキーを押します。するとODBCデータソースアドミニストレータというのが出てきます。
クライアントアクセスがないときはこんな感じです。
クライアントアクセスをインストールしたらこんな感じです。Client Access ODBC Driverと、iSeries Access ODBC Driverの2つが入りました。
さらにパッチを当てると、IBM i Access ODBC Driverも入りました。合計3つ。違いが解りませんが、私はパッチ時にインストールされた、このIBM i Access ODBC Driverを使うようにしています。
エクセル側で設定
- Microsoft Visual Basic for Applications Editor(VBE)を開く
- ツールの参照設定を開く
- Microsoft ActiveX Data Objects 2.8 Libraryにチェックを入れる
以上。これをやらないとADODBクラスが使えないので、下記コードはいくらやっても動きません。ちなみにバージョンは2.8以外にも6.1とかあるけど、違いがよく解りません。
VB.NETの設定
VB.NETも同じような感じ。
- プロジェクトタブ
- 参照の追加
- COMタブ
- Microsoft ActiveX Data Objects 2.8 Libraryを選ぶ
サンプルコード(VBA)
セルA1を起点にテーブルのデータをバチコーンと張り付けるコードです。
Sub test() 'ADODBクラスインスタンス Dim oADOcn As New ADODB.Connection Dim oRst As New ADODB.Recordset '変数定義 Dim sSQL As String '定数定義 Const HOST As String = "マシンノアイピーアドレス" Const USERID As String = "ログインアイディー" Const PASSWORD As String = "パスワード" 'データベースOPEN oADOcn.Open "Provider=IBMDA400; Data Source=" & HOST & ";", USERID, PASSWORD 'SQL文組み立て sSQL = "エスキューエル" 'テーブルOPEN oRst.Open sSQL, oADOcn, adOpenKeyset, adLockReadOnly 'セルA1にデータ一括貼り付け ActiveSheet.Cells(1, 1).CopyFromRecordset oRst End Sub
- マシンノアイピーアドレス(AS400のIPアドレス)
- ログインアイディー(データベースへのログインID)
- パスワード(データベースへのパスワード)
- エスキューエル(SQL文)
この4つは環境によって違うので、適当なものに替えてください。システム管理者なら解るはずです。
SQL文は簡単なので勉強してください。ちなみに書くと、
sSQL = “SELECT * FROM ライブラリ名.ファイル名”
こんな感じです。普通SQL文の末尾にはセミコロン「;」をつけるものですが、エクセルの場合は付けたら動きません。
sSQLとかoADOcnとかoRstなどは変数名なので、もっと解りやすい文字に変更しても大丈夫です。
Provider=IBMDA400は決まり文句のようです。
cells(1,1)を変更すれば、貼り付けの起点をずらすことができます。CopyFromRecordsetがレコードを全件一気に張り付ける命令ですが、カラム名は張り付きません。あくまでレコードだけです。
データベースOPENとテーブルOPENの2つがあります。
データベースOPENはデータベースそのものなのでログイン情報が必要、テーブルを開く場合はテーブルを指定する必要があるのでSQL文が必要、そういうことです。
データベースを開き、テーブルを開いた後、レコードやカラムに対して処理を行っていく手はずということです。
ループ文で1行1行取得したり、カラム名やCOLHDG名を取得したり、クラス化したり、いろいろできますが、これは設定編なのでこの辺で。
VB.NETのサンプルコードはありません。まぁ大体似たようなものです。
コメント