AS400/IBMi からデータを取得 ExcelVBA カラム名COLHDG取得編

IT関連

注意

これは私の環境下における私の備忘録です。お使いの環境によっては内容が異なる場合があります。システム管理者でない方は絶対にやらないでください。システムにはログが残るものなので、万が一があればクビになるかもしれません。私は何も責任を負いませんのでご了承のうえご覧ください。

 

内容

前回の記事で載せた続きです。テーブルの内容を全件引っ張るだけではつまらないので、カラム名や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行目に代入していきます。

ただそれだけです。

 

 

変数のネーミングセンスとか気にしないでください。私もネットで得た知識の備忘録なので。

大事なことは

  1. oRstがテーブルのオブジェクト。
  2. oRst.Fields(カラム名もしくは列番号)で、カラムのデータにアクセスできる。
  3. Properties(7)でカラム名、Properties(3)でCOLHDGの値を取得できる

です。Fieldsとか略せるみたいですが、一応正式に書いておきます。

 

oRstがテーブルのデータですが、1行1行取り出す場合は、こんな感じです。

'最終行までループ
Do Until oRst.EOF
    
      '取り出し方
      cells(?,?).value = oRst.Fields(カラム名もしくは列番号).value
                      
      '次行を読む
      oRst.MoveNext

Loop

 

Do~Loopをぐるぐる回る間にテーブルのレコードを読んでいくわけですが、MoveNextが行送りの命令です。これを忘れると無限ループしますのでご注意を。

コメント

タイトルとURLをコピーしました