みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。
エクセルVBAでAccessデータベースを操作する方法についてシリーズでお伝えしています。
前回はコチラの記事です。
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で作ったテーブル「データ」はこちらです。
都道府県の人口や面積などのデータです。
上記プログラムのSQL文は
ですから、「データ」という名前のテーブルから、「*」つまり全てのフィールドを抽出せよ、という命令になります。
出力結果としては
となりますね。
SQL文を変更すれば、色々な抽出の仕方ができるようになりますので、今回はいくつかのパターンについて紹介していきたいと思います。
SELECTで特定のフィールドのみ抽出する
まず、SELECT文で特定のフィールドのみを抽出してみようと思います。
SELECT文は
と記述します。
フィールド名は複数の場合はカンマ区切りで複数を指定することができます。
例えばテーブル名「データ」から「都道府県」「推計人口」の二つのフィールドを取り出す場合は
SELECT 都道府県,推計人口 FROM データ
とします。
このSQL文をセットしてプログラムを実行すると
このように、都道府県と推計人口のフィールドのみが抽出できます。
WHERE句で特定の条件を満たすレコードのみ抽出
次に、フィールドの値が特定の条件のもののみ抽出をしてみます。
この場合、先ほどのSELECT文にWHEREという句を追加して条件を指定します。
と書きます。
例えば、フィールド「区」の数が1つ以上あるレコードのみを抽出する場合は
SELECT 都道府県,区の数 FROM データ WHERE 区の数>0
とします。
実行結果としてはこちらです。
SQLで使える比較演算子
SQLで使える比較演算子としては以下のようなものがあります。
演算子 | 説明 |
---|---|
= | 等しい |
<> または != | 等しくない |
< | 小さい |
> | 大きい |
<= | 大きいか、等しい |
>= | 小さいか、等しい |
IS NULL | NULLである |
LIKE | 文字値がパターンに一致する |
BETWEEN | 下限値から上限値の範囲に含まれる |
IN | 集合のいずれかのメンバーと等しい |
ちょくちょくお世話になりそうですね。
WHERE句で複数の条件を指定する
WHERE句で複数の条件を指定したい場合はどうすれば良いでしょうか?
その場合は、論理演算子を使ってWHERE句に複数の式を指定することができます。
例えば
- 「区の数」が1以上
- 「面積」が5,000以上
で条件をつける場合、ANDで条件文を並列して
SELECT 都道府県,区の数,面積 FROM データ WHERE 区の数>0 AND 面積>=5000
とします。
実行結果としては
となります。
SQLで使える論理演算子
ANDのほかに、SQLではOR、NOTの論理演算資を使用することができます。
- AND:論理積「かつ」
- OR:論理和「または」
- NOT:否定
まとめ
エクセルVBAでSQLのSELECT文を使ってAccessデータベースから様々なデータ抽出の仕方をする方法についてお伝えしました。
- 「*」を使って全てのフィールドを抽出する
- 抽出するフィールドをカンマで複数指定
- WHERE句で条件にあったレコードを抽出
- WHERE句に複数の条件を指定してレコードを抽出
というテクニックをお伝えしました。
これだけでも、かなり色々なパターンの抽出が可能になるのですが、次回は複数のテーブルを組み合わせて抽出する方法です。
どうぞお楽しみに!
連載目次:エクセルVBAでエクセルからAccessデータベースを操作する
エクセルと相性の良いデータベースとして第一候補として挙がるAccess。エクセルをインターフェース、AccessをデータベースとしてエクセルVBAを使って連携する方法とその様々なテクニックについてお伝えしていきます。- なぜエクセルとAccessデータベースを連携するのが良いのか、またその際の注意点
- エクセルVBAでAccessデータベースと接続する最もシンプルなプログラム
- 【エクセルVBA&Access連携】SQL文でデータを抽出する最も簡単なプログラム
- 【エクセルVBAでAccess連携】SQLのSELECT,FROM,WHEREによる様々なデータ抽出方法
- 【エクセルVBAでAccess連携】SQLのJOINを使って複数のテーブルを組み合わせてデータを取り出す
- 【エクセルVBAでAccess連携】データベースのテーブルにレコードを追加するシンプルな方法
- エクセルVBAでAccessデータベースに複数のレコードを追加する方法とその実行速度について
- 【エクセルVBAでAccess連携】データベースに特定条件のデータが存在するかどうかを判定する
- エクセルVBAからAccessデータベースのレコードを呼び出して修正して上書き更新する方法
- エクセルVBAでAccessデータベースの複数のレコードをまとめて上書き更新する方法
- エクセルVBAでAccessデータベースの複数のレコードを上書き更新する場合の実行速度について
- エクセルVBAでAccessのデータをORDER BYで並び替えをして取り出す
- エクセルVBAでADODBレコードセットをSortメソッドで並び替えする方法
- エクセルVBAでAccessデータをグループで集計して抽出するGROUP BY句と集計関数の使い方
- エクセルVBAでAccessデータを集合関数による条件で抽出するHAVING句の使い方
- エクセルVBAでAccessデータベースからFormat関数によるSQL文で特定の日付で抽出
- エクセルVBAでのAccessデータベース操作にトランザクション処理を入れる