【エクセルVBAでAccess連携】SQLのSELECT,FROM,WHEREによる様々なデータ抽出方法


jigsaw-puzzle

photo credit: puzzle via photopin (license)

みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。

エクセルVBAでAccessデータベースを操作する方法についてシリーズでお伝えしています。

前回はコチラの記事です。

【エクセルVBA&Access連携】SQL文でデータを抽出する最も簡単なプログラム
エクセルVBAでAccessデータベースを操作する方法についてシリーズでお伝えしています。今回はデータベース言語SQLとADODB.Recordsetオブジェクトでデータベースからデータを抽出します。

SQLでAccessデータベースからデータを抽出する最も簡単なプログラムについてお伝えしました。

データベースからデータを抽出するにはSELECTというSQL文を使います。

前回は全てのデータをまるっと全て抽出するSQL文しか紹介していませんでしたので、今回はAccessデータベースのテーブルから色々なパターンでデータを抽出するSELECTの使い方についてお伝えしたいと思います。

スポンサーリンク

前回のおさらい:データベースから全てのデータを抽出する

まず前回のプログラムのおさらいです。

Sub SelectDB()

Dim strFileName As String
strFileName = "test.accdb"

Dim adoCn As Object 'ADOコネクションオブジェクト
Set adoCn = CreateObject("ADODB.Connection") 'ADOコネクションオブジェクトを作成
adoCn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.Path & "\" & strFileName & ";" 'Accessファイルに接続

Dim adoRs As Object 'ADOレコードセットオブジェクト
Set adoRs = CreateObject("ADODB.Recordset") 'ADOレコードセットオブジェクトを作成

Dim strSQL As String
strSQL = "SELECT * FROM データ"

adoRs.Open strSQL, adoCn 'SQLを実行して対象をRecordSetへ
Worksheets(1).Range("A1").CopyFromRecordset adoRs

adoRs.Close 'レコードセットのクローズ
adoCn.Close 'コネクションのクローズ

Set adoRs = Nothing
Set adoCn = Nothing  'オブジェクトの破棄

End Sub

Accessデータベースに接続をして「データ」という名前のテーブルから抽出したデータをワークシートに張り付けるという動作をします。

どのようなデータを抽出するかというのは、14行目で指定しているSQL文で決まります。

SELECTで全てのフィールドを抽出する

Accessで作ったテーブル「データ」はこちらです。

Accessデータベースのテーブル

都道府県の人口や面積などのデータです。

上記プログラムのSQL文は

SELECT * FROM データ

ですから、「データ」という名前のテーブルから、「*」つまり全てのフィールドを抽出せよ、という命令になります。

出力結果としては

Accessから取得したテーブルのデータ

となりますね。

SQL文を変更すれば、色々な抽出の仕方ができるようになりますので、今回はいくつかのパターンについて紹介していきたいと思います。

SELECTで特定のフィールドのみ抽出する

まず、SELECT文で特定のフィールドのみを抽出してみようと思います。

SELECT文は

SELECT フィールド名 FROM テーブル名

と記述します。

フィールド名は複数の場合はカンマ区切りで複数を指定することができます。

例えばテーブル名「データ」から「都道府県」「推計人口」の二つのフィールドを取り出す場合は

SELECT 都道府県,推計人口 FROM データ

とします。

このSQL文をセットしてプログラムを実行すると

AccessデータベースからSQLのSELECT文でデータを抽出

このように、都道府県と推計人口のフィールドのみが抽出できます。

WHERE句で特定の条件を満たすレコードのみ抽出

次に、フィールドの値が特定の条件のもののみ抽出をしてみます。

この場合、先ほどのSELECT文にWHEREという句を追加して条件を指定します。

SELECT フィールド名 FROM テーブル名 WHERE 条件文

と書きます。

例えば、フィールド「区」の数が1つ以上あるレコードのみを抽出する場合は

SELECT 都道府県,区の数 FROM データ WHERE 区の数>0

とします。

実行結果としてはこちらです。

AccessデータベースからSQLのSELECTとWHEREでデータを抽出

SQLで使える比較演算子

SQLで使える比較演算子としては以下のようなものがあります。

演算子 説明
= 等しい
<> または != 等しくない
< 小さい
> 大きい
<= 大きいか、等しい
>= 小さいか、等しい
IS NULL NULLである
LIKE 文字値がパターンに一致する
BETWEEN 下限値から上限値の範囲に含まれる
IN 集合のいずれかのメンバーと等しい

ちょくちょくお世話になりそうですね。

WHERE句で複数の条件を指定する

WHERE句で複数の条件を指定したい場合はどうすれば良いでしょうか?

その場合は、論理演算子を使ってWHERE句に複数の式を指定することができます。

例えば

  • 「区の数」が1以上
  • 「面積」が5,000以上

で条件をつける場合、ANDで条件文を並列して

SELECT 都道府県,区の数,面積 FROM データ WHERE 区の数>0 AND 面積>=5000

とします。

実行結果としては

AccessデータベースからSQLのSELECTとWHEREでデータを抽出2

となります。

SQLで使える論理演算子

ANDのほかに、SQLではOR、NOTの論理演算資を使用することができます。

  • AND:論理積「かつ」
  • OR:論理和「または」
  • NOT:否定

まとめ

エクセルVBAでSQLのSELECT文を使ってAccessデータベースから様々なデータ抽出の仕方をする方法についてお伝えしました。

  • 「*」を使って全てのフィールドを抽出する
  • 抽出するフィールドをカンマで複数指定
  • WHERE句で条件にあったレコードを抽出
  • WHERE句に複数の条件を指定してレコードを抽出

というテクニックをお伝えしました。

これだけでも、かなり色々なパターンの抽出が可能になるのですが、次回は複数のテーブルを組み合わせて抽出する方法です。

【エクセルVBAでAccess連携】SQLのJOINを使って複数のテーブルを組み合わせてデータを取り出す
エクセルVBAでAccessデータベースを操作する方法についてシリーズでお伝えしています。今回はSQL文にJOINを使うことで複数のテーブルを組み合わせてデータを取り出す方法についてお伝えします。

どうぞお楽しみに!

連載目次:エクセルVBAでエクセルからAccessデータベースを操作する

エクセルと相性の良いデータベースとして第一候補として挙がるAccess。エクセルをインターフェース、AccessをデータベースとしてエクセルVBAを使って連携する方法とその様々なテクニックについてお伝えしていきます。
  1. なぜエクセルとAccessデータベースを連携するのが良いのか、またその際の注意点
  2. エクセルVBAでAccessデータベースと接続する最もシンプルなプログラム
  3. 【エクセルVBA&Access連携】SQL文でデータを抽出する最も簡単なプログラム
  4. 【エクセルVBAでAccess連携】SQLのSELECT,FROM,WHEREによる様々なデータ抽出方法
  5. 【エクセルVBAでAccess連携】SQLのJOINを使って複数のテーブルを組み合わせてデータを取り出す
  6. 【エクセルVBAでAccess連携】データベースのテーブルにレコードを追加するシンプルな方法
  7. エクセルVBAでAccessデータベースに複数のレコードを追加する方法とその実行速度について
  8. 【エクセルVBAでAccess連携】データベースに特定条件のデータが存在するかどうかを判定する
  9. エクセルVBAからAccessデータベースのレコードを呼び出して修正して上書き更新する方法
  10. エクセルVBAでAccessデータベースの複数のレコードをまとめて上書き更新する方法
  11. エクセルVBAでAccessデータベースの複数のレコードを上書き更新する場合の実行速度について
  12. エクセルVBAでAccessのデータをORDER BYで並び替えをして取り出す
  13. エクセルVBAでADODBレコードセットをSortメソッドで並び替えする方法
  14. エクセルVBAでAccessデータをグループで集計して抽出するGROUP BY句と集計関数の使い方
  15. エクセルVBAでAccessデータを集合関数による条件で抽出するHAVING句の使い方
  16. エクセルVBAでAccessデータベースからFormat関数によるSQL文で特定の日付で抽出
  17. エクセルVBAでのAccessデータベース操作にトランザクション処理を入れる

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