2015年10月22日木曜日

VBA:ADOを使ってデータベースにアクセスする

データベースというのは例えばMS Accessのようなものを指し、大量のデータ(10万とか20万とか)を扱うためのものです。MS accessのようなデータベースでデータを管理していれば、データの集計、計算、検索などをとても簡単に行うことができます。

さらに、データベースにエクセルを接続すれば、ADOやSQLなどを用いてデータベースのデータを直接扱う結構複雑なアプリケーションを作ることもできます。

このデータベースに接続するアプリケーションを作る技術は意外と重宝されるものですから、がんばって勉強しましょう。

つぎのようにVBEに書き込むことで、MSaccess(データベース)へとアクセスし、データをExcelへと持ってくることができるようになります。

なお、下記のコードはADOを利用していますのでそのまま貼りつけるだけでなく参照設定も少し変えないと動きません。これをしないで動かそうとするエラーが出ます。参照設定の説明はコードのあとで。

見本ダウンロード:
https://www.dropbox.com/s/w9nsf7hxds4ubva/DB%E6%A4%9C%E7%B4%A2%EF%BC%88%E8%A1%A8%E7%A4%BA%E3%81%AE%E3%81%BF%EF%BC%89.zip?st=bh565q7q&dl=0
(見本はzipに入っている状態だと動きません。zipを解凍してから実行してください)
-----------------------------------------------------------------------
Sub Test()

    Dim adoCON      As New ADODB.Connection
    Dim adoRS       As New ADODB.Recordset
    Dim strSQL      As String
    Dim odbdDB      As Variant
    Dim wSheetName  As Variant
    Dim i           As Integer
   
    odbdDB = ActiveWorkbook.Path & "\DB_name.accdb"

    adoCON.ConnectionString = "provider=Microsoft.ACE.OLEDB.12.0;" _
                        & "Data Source=" & odbdDB & ""
    adoCON.Open

    adoCON.BeginTrans
    'BeginTransはトランザクションを始めるものです。adoCON.CommitTransはトランザクションを終了します。トランザクションはデータの扱いの正確性を保障するためのものなので無くてもプログラム自体は動きます。
    adoRS.CursorLocation = adUseClient

   'データベース検索のためのSQL文
        strSQL = "SELECT * FROM table_name ORDER BY table_name.ID;"
'もし変数を使って検索したいのであれば、次のように書いてください。
'strSQL = "SELECT table_name.* FROM table_name WHERE subject_of_the_table = " & TextBox1.Value & ";" 
'もしTextBox1.Value(変数)のなかの値が文字列だった場合、次のように書いてください。  
'strSQL = "SELECT * FROM table_name WHERE subject_of_the_table  LIKE '" & TextBox1.Value & "';" 
'文字列の場合はこう書かないとエラーになります。

    adoRS.Open strSQL, adoCON, adOpenDynamic
 
    i = 1

    Do Until adoRS.EOF
        With Worksheets("Sheet1")
            .Cells(i, 1).Value = adoRS!ID
            .Cells(i, 2).Value = adoRS!Name
            .Cells(i, 3).Value = adoRS!age
        End With
        i = i + 1
        adoRS.MoveNext
    Loop

    adoCON.CommitTrans
 '先述のとおりこれはトランザクション用。トランザクションを閉じています。  

    adoRS.Close
    Set adoRS = Nothing
    adoCON.Close
    Set adoCON = Nothing
   
End Sub
---------------------------------------------------------------------
上記でデータベースからデータを持ってくることが可能ですが、青い部分は個人個人それぞれ記入するものが違いますので、それぞれの場合に応じて書き換えなければいけません。

なお、

---------------------------------------------------------------------
    Do Until adoRS.EOF
        With Worksheets("Sheet1")
            .Cells(i, 1).Value = adoRS!ID
            .Cells(i, 2).Value = adoRS!Name
            .Cells(i, 3).Value = adoRS!age
        End With
        i = i + 1
        adoRS.MoveNext
    Loop
---------------------------------------------------------------------

の部分を以下のように書けば、activeのシートを対象に動きます。

---------------------------------------------------------------------
    Do Until adoRS.EOF
        With Worksheets(ActiveSheet.Name)
            .Cells(i, 1).Value = adoRS!ID
            .Cells(i, 2).Value = adoRS!Name
            .Cells(i, 3).Value = adoRS!age
        End With
        i = i + 1
        adoRS.MoveNext
    Loop
---------------------------------------------------------------------


参照設定について


なお、参照設定は以下のように設定します。
1、まず、VBEの画面を出します。(そもそもVBEの画面の出し方が分からない場合は開発タブが追加されていないのだと思います。その場合は開発タブを追加してから手順を進めてください)
開発タブってこれ

2、「ツール」を見つけてクリック、ここから「参照設定」をクリックします。「参照設定」が押せない場合はおそらくなんらかのマクロが動かしっぱなしになっています。その場合はマクロを止めてから「参照設定」をクリックしてください。
参照設定はここ

参照設定がクリックできない場合はなんらかのマクロが動いている可能性が高いです。
四角いボタンを押して止めてください。


3、「参照設定」をクリックしたらライブラリ等を追加できる画面がでます。ここで「Microsoft ActiceX Data objects ○○ Library」ってやつを探してください。これがADOってやつです。おそらくひとつだけじゃなくたくさんのバージョンが見つかると思いますが、基本的には最新のバージョンを使えばいいでしょう。
こんな画面

これを探します。

4、チェックをいれたらOKを押します。OKを押せば、これでADOが使えるようになります。お疲れさまでした。