データ検索 ADO 覚書

参照設定する方がよい。

  • Microsoft ActiveX Data Objects Recordset 6.0 Library
  • Microsoft ActiveX Data Objects 6.1 Library
Option Explicit

Public Sub adotest()
    Const adOpenKeyset = 1
    Const adLockReadOnly = 1
    Dim cn As Object
    Dim aRs As Object
    Dim query As String
    
    Set cn = CreateObject("ADODB.Connection")
    cn.Provider = "Microsoft.ACE.OLEDB.12.0"
    cn.Properties("Extended Properties") = "Excel 12.0;HDR=YES;IMEX=1"
    'レコードセット作成
    Set aRs = CreateObject("ADODB.Recordset")
    ' コネクションオープン、接続先は自分自身
    cn.Open ThisWorkbook.FullName
    query = " SELECT ID, NAME, VALUE " _
        & " FROM [Sheet1$] " _
        & " ORDER BY ID"
        
    aRs.Open query, cn, adOpenKeyset, adLockReadOnly
        
    If Not aRs Is Nothing Then
        If aRs.RecordCount > 0 Then
            Do Until aRs.EOF
                MsgBox (aRs("ID") & " :" & aRs("NAME") & " :" & aRs("VALUE"))
                aRs.MoveNext
            Loop
        End If
    End If

End Sub

ADOの参照を設定して、コネクションを設定し、レコードセットを作成。

コネクション
Microsoft.ACE.OLEDB.12.0 --> Office2007以降
Office2003 --> Microsoft.ACE.OLEDB.4.0

拡張プロパティ
cn.Properties("Extended Properties") = "Excel 12.0 --> Office2007以降
Office2003 --> cn.Properties("Extended Properties") = "Excel 8.0
HDR=Yes --> 1行目ヘッダー HDR=No --> ヘッダーなし
IMEX=1 --> 書き込み、 2 --> 読み込み、 3 --> 書き込みと読み込み

エクセル対象にする場合は、接続先は自分自身
 ThisWorkbook.FullName
From句はシート名 + $


参照設定をした方が速度も速いらしいが、なによりも入力支援機能が使えるなど開発しやすい。
でも、参照設定をすると、後日違うPCから実行したらエラーを吐くかもしれない。
上の例では、Objectで宣言して、CreateObjectにより、実行時バインディングしているので大丈夫。

参照設定を利用する事前バインディングでは、

 Dim cn As ADODB.Connection    'ADOコネクションオブジェクト
 Dim aRs As ADODB.Recordset    'ADOレコードセットオブジェクト

 Set cn = New ADODB.Connection      'ADOコネクションのインスタンス作成

 Set aRs = New ADODB.Recordset       'ADOレコードセットのインスタンス作成

他のBookにデータがある場合はConnectionStringにData Sourceを登録する。

Option Explicit

Public Sub test()
    Const adOpenKeyset = 1
    Const adLockReadOnly = 1
    Dim cn As Object
    Dim aRs As Object
    Dim query As String
    Dim dataFile As String               '抽出対象のデータが登録されたExcelファイル
    
     '抽出対象のデータが登録されたExcelファイル
    dataFile = ActiveWorkbook.Path & "\testADO_Data.xlsx"
    
    Set cn = CreateObject("ADODB.Connection")
    cn.Provider = "Microsoft.ACE.OLEDB.12.0"
    cn.Properties("Extended Properties") = "Excel 12.0;HDR=YES;IMEX=1"
    'レコードセット作成
    Set aRs = CreateObject("ADODB.Recordset")
    
    ' コネクションオープン、接続先は他のBook
    With cn
        .Provider = "Microsoft.ACE.OLEDB.12.0"
        .Properties("Extended Properties") = "Excel 12.0;HDR=YES;IMEX=1"
        .ConnectionString = "Data Source = " & dataFile & _
        ";Extended Properties =Excel 12.0;"
        .Open
    End With
    query = " SELECT ID, NAME, VALUE " _
        & " FROM [Sheet1$] " _
        & " ORDER BY ID"
        
    aRs.Open query, cn, adOpenKeyset, adLockReadOnly
        
    If Not aRs Is Nothing Then
        If aRs.RecordCount > 0 Then
            Do Until aRs.EOF
                MsgBox (aRs("ID") & " :" & aRs("NAME") & " :" & aRs("VALUE"))
                aRs.MoveNext
            Loop
        End If
    End If

End Sub