注意
これは私の環境下における私の備忘録です。お使いの環境によっては内容が異なる場合があります。システム管理者でない方は絶対にやらないでください。システムにはログが残るものなので、万が一があればクビになるかもしれません。私は何も責任を負いませんのでご了承のうえご覧ください。
内容
前回の記事で載せた続きです。テーブルの内容を全件引っ張るだけではつまらないので、カラム名や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が行送りの命令です。これを忘れると無限ループしますのでご注意を。
コメント