注意
これは私の環境下における私の備忘録です。お使いの環境によっては内容が異なる場合があります。システム管理者でない方は絶対にやらないでください。システムにはログが残るものなので、万が一があればクビになるかもしれません。私は何も責任を負いませんのでご了承のうえご覧ください。
内容
前回の記事で載せた続きです。テーブルの内容を全件引っ張るだけではつまらないので、カラム名やCOLHDG(注記)も引っ張る方法を載せます。
下記が前回のコードです。
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
CopyFromRecordsetという命令でテーブルのレコードを全件バチコーンと張り付けましたが、今回もそれを使います。
1行目にカラム名、2行目にCOLHDGを挿入しようと思いますので、CopyFromRecordsetは3行目を指定して、3行目にレコードを張り付けるようにします。
| name | age | birth |
|---|---|---|
| 名前 | 年齢 | 生年月日 |
| 田中 | 29 | 2018/09/10 |
| 渡辺 | 44 | 1956/09/10 |
こんな感じですね。1行目にカラム名、2行目にCOLHDG、3行目以降にレコードです。
サンプルコードは、
Sub test()
'ADODBクラスインスタンス
Dim oADOcn As New ADODB.Connection
Dim oRst As New ADODB.Recordset
'変数定義
Dim sSQL As String
Dim i As Long '行用変数
Dim r As Integer '列用変数
'定数定義
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
'セルA3を起点にデータ一括貼り付け
ActiveSheet.Cells(3, 1).CopyFromRecordset oRst
'行変数を1からスタート
i = 1
'列数をCountで取得して、全列に対して処理(0からスタート)
For r = 0 To oRst.Fields.Count - 1
'カラム名
Cells(1,i).Value = oRst.Fields(r).Properties(7)
'COLHDG名
Cells(2,i).Value = oRst.Fields(r).Properties(3)
'行変数を加算
i = i + 1
Next r
End Sub
概要は、まずCopyFromRecordsetで3行目の1列目に全レコードの値を張り付けた後に、各カラムの情報を1つ1つ取得して、1行目と2行目に代入していきます。
ただそれだけです。
変数のネーミングセンスとか気にしないでください。私もネットで得た知識の備忘録なので。
大事なことは
- oRstがテーブルのオブジェクト。
- oRst.Fields(カラム名もしくは列番号)で、カラムのデータにアクセスできる。
- Properties(7)でカラム名、Properties(3)でCOLHDGの値を取得できる
です。Fieldsとか略せるみたいですが、一応正式に書いておきます。
oRstがテーブルのデータですが、1行1行取り出す場合は、こんな感じです。
'最終行までループ
Do Until oRst.EOF
'取り出し方
cells(?,?).value = oRst.Fields(カラム名もしくは列番号).value
'次行を読む
oRst.MoveNext
Loop
Do~Loopをぐるぐる回る間にテーブルのレコードを読んでいくわけですが、MoveNextが行送りの命令です。これを忘れると無限ループしますのでご注意を。
コメント