Access VBA ADOを用いてSQL文(選択クエリ)を実行する方法

ADO

Accessでデータベースを構築した後、VBAで処理を行う際に一時的に選択クエリを作成して必要情報を抽出することで処理スピードを格段に上げることができます。

また、クエリを複数作成すると何の機能に用いているか分からなくなる等、保守性が悪くなることも往々にして目にします。こういったことも視野に入れてADOとSQL文を上手く組み合わせることが一つの対策になります。

ここで、ADOを使用するためには、予め「参照設定」が必要となります。具体的な設定方法は以下の記事で紹介していますので、ご参照ください。

なお、SQL文の言語については以下の書籍を参考にしていただければと思いますが、今回は選択クエリとしてSELECT文を用いた処理の例を見ていきましょう。

スッキリわかるSQL入門 第2版 ドリル222問付き! スッキリわかる入門シリーズ
Amazonで中山清喬, 飯田理恵子のスッキリわかるSQL入門 第2版 ドリル222問付き! スッキリわかる入門シリーズ。アマゾンならポイント還元本が多数。一度購入いただいた電子書籍は、KindleおよびFire端末、スマートフォンやタブレットなど、様々な端末でもお楽しみいただけます。

スポンサーリンク

サンプルデータについて

今回は、「T_選択クエリ作成」テーブルを作成します。

このテーブルには「氏名」、「生年月日」及び「性別」のフィールドを設定し、それぞれ「短いテキスト」、「日付/時刻型」及び「短いテキスト」のデータ型を設定します。

次に、表1に示すようにサンプルデータを登録します。

表1 サンプルデータ

氏名生年月日性別
坂本 花子1998/01/06
山本 寛治1978/04/05
森本 真一1997/12/07
相川 ふみ2001/06/19

以上でサンプルデータの準備ができましたので、次から選択クエリについて、確認していきましょう。

SELECT文によるレコード抽出

今回のサンプルデータには「性別」フィールドを用意しています。そこで「女」と登録されているレコードのみを抽出するSQL文を考えていきます。

具体的には次のように表現することができます。

SELECT * FROM T_選択クエリ作成 WHERE 性別 = ‘女’;

このように、条件抽出をSQL文で設定して出力処理をした場合、予め条件抽出をしなかった場合に比べてスピーディな処理が期待できます。(今回の場合レコード数が少ないため、大差はありませんが数万件と規模が大きくなると効果が出てきます。)

VBAによるSQL文の実装

続いて、VBAによりADOによるSQLを用いたレコード抽出と、その抽出結果を用いてレコードの確認をしていきます。

具体的に次のコードを標準モジュールに実装してください。

Private Sub ADO_SQL()

'ADOを使うための変数宣言
Dim cn As New ADODB.Connection
Dim rs As New ADODB.Recordset

'SQL文を格納するための変数宣言
Dim mySQL As String

'「性別」フィールドから「女」のみを抽出するSELECT文
mySQL = "SELECT * FROM T_選択クエリ作成 WHERE 性別 = '女';"

'カレントデータベースに接続する。
Set cn = CurrentProject.Connection

'SQL文を開く
rs.Open mySQL, cn, adOpenKeyset, adLockOptimistic

'ループ文で対象レコードの値を用いて繰り返しイミディエイトウィンドウに
'値を表示させる。
Do Until rs.EOF = True

    'イミディエイトウィンドウに値を表示
    Debug.Print rs!氏名 & " の生年月日は" & rs!生年月日 & "です。"
    
    'レコードを移動する。
    rs.MoveNext

Loop

'レコードセットを閉じる。
rs.Close

'データベース接続を閉じる。
cn.Close
Set cn = Nothing

End Sub

作成したコードを一つずつ見ていきましょう。まずは、ADOを使うため及びSQL文を格納するための変数宣言をしています。

次に、「性別」フィールドで「女」が登録されているレコードのみを抽出するSELECT文をmySQL変数に格納しています。

この後、ADOによるデータベース接続、mySQLに格納したSELECT文でレコードセットを開き
ループ文を用いて、抽出したレコードの各フィールドの値を用いて繰り返しイミディエイトウィンドウに値を表示させています。

なお、ループ文はレコードセットがエンドオブファイル(EOF)になった段階で抜け出すようにしています。ループ文を抜け出した後は、レコードセットを閉じ、データベース接続を切ります。

これで、一通りの処理に対する実装ができましたので、VBAを実行して処理結果を確認しましょう。

VBAの実行

作成したVBAによる処理を実行してみましょう。

結果は図1に示すとおりです。

図1 ADO・SELECT文の組み合わせによる処理

イミディエイトウィンドウに女性分のレコードのみの情報が表示されていることが分かります。

まとめ

今回は、ADOを用いてSELECT文により抽出したレコードセットの情報を用いて出力処理をする方法を紹介しました。

予め、必要情報を抽出しておくことで、スピーディな処理ができるようになり、業務効率の改善を図ることもできますので、本記事を参考にしていただければと思います。

紹介した内容は以下の書籍でも説明がありますので、是非ご参考になさってください。

スポンサーリンク

コメント

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