EXCELでSQLサンプル

こんな感じのEXCELのワークシートに対してSQL文を発行し、結果を取得する方法です。
1行目をフィールド名と見立てて、Where句でデータを絞り込んだり、ソートしたりすることが可能です。
以下のサンプルコードでは自ワークブック(*.xls,*.xlsm等)に対しADOでEXCELファイルをオープンし、SELECT文を発行しています。
実際に動くEXCEL VBAのサンプルプログラムは一番下にあります。
ここで使用しているSQLは、ANSI-92 SQLに準拠しています。
そのため、以下のような機能を使用することができます。
- WHERE句やLIKE演算子を使用した条件式
- ORDER BYによる並び替え
- GROUP BYによるSUMやCOUNTなどの集計機能
- 複数の表をJOIN演算子で結合
- サブクエリを使用して、クエリの内部で別のクエリを実行
- 特定の範囲を複数のテーブルとして結合
VBAコード例
Public Sub MyADOExcel()
Const adOpenKeyset = 1
Const adLockReadOnly = 1
Dim cn As Object
Dim rs As Object
Dim strSQL As String
Set cn = CreateObject("ADODB.Connection")
Set rs = CreateObject("ADODB.Recordset")
cn.Provider = "Microsoft.ACE.OLEDB.12.0"
'1行目がヘッダの場合はHDR=YESにする。NOの場合はF1,F2,F3・・・と番号が振られる。
'ヘッダに日本語やカッコが含まれていると誤動作の原因になるので損場合はNOにしたほうが無難
cn.Properties("Extended Properties") = "Excel 12.0;HDR=NO;IMEX=1"
cn.Open ThisWorkbook.FullName '自ワークブックのファイル名を指定しているが、
'もちろん別ワークブックでもOK!
'cn.Open "c:\tmp\sample.xls" 等とする
strSQL = ""
strSQL = strSQL & " SELECT F1,F2,F3,F4,F5 "
strSQL = strSQL & " FROM [Sheet1$A3:Z1000] " 'Sheet1のA2:Z100にデータがあると仮定する。
strSQL = strSQL & " WHERE F1 IS NOT NULL " '単にCells(1,1)からシート全体を取得したい場合は単に[Sheet2$]とすればいい。
strSQL = strSQL & " ORDER BY F2 "
rs.Open strSQL, cn, adOpenKeyset, adLockReadOnly
Sheet1.Cells(10, 3).CopyFromRecordset rs 'シート1のセル(10,3)からデータをセットする
rs.Close
Set rs = Nothing
cn.Close
Set cn = Nothing
End Sub
マクロ実行中に自分自身のワークシートを変更し、その変更されたワークシートに対してSQL文を発行したい場合
Excelワークブック内に、ユーザーインターフェース、データシート、そしてマクロを含めたすべての要素を配置している場合、マクロを実行しながら自分自身のワークシートを変更し、SQL文を発行することができます。
ただし、この方法では、データ取得には保存されたExcelファイルを使用する必要があるため、保存する必要があります。
しかし、作業中のExcelファイルを上書き保存したくない場合があるかもしれません。
この場合、ActiveWorkbook.SaveCopyAs文を使用して、一時ファイルに別名で保存し、そのファイルを開いてSQL文を発行することができます。
これにより、実行中のExcelファイルに影響を与えることなく、作業を続けることができます。
EXCELの自ワークシートに対してSQL問い合わせするサンプル
顧客台帳検索システムのサンプルを作成しました。このシステムは、会員情報を格納しているシートからデータを検索し、結果を別のシートに表示します。
このシステムでは、5000件のデータから検索を行うことができます。
使い方
都道府県、血液型、性別のうち、いずれか1つを選択し、検索実行ボタンをクリックしてください。

EXCELでSQLサンプルプログラム ダウンロード
“ExcelSqlSample.xls” をダウンロード ExcelSqlSample.xls – 14270 回のダウンロード – 2.22 MBセキュリティ警告が表示される場合がありますので、「編集を有効にする」を選択してください。

別のセキュリティの警告が表示されたときは
最近のWindowsはセキュリティが厳しくなってきているため、ダウンロードしたマクロ付きのExcelファイルを開いてもすぐにマクロを実行することはできません。
「セキュリティリスク このファイルのソースが信頼できないため、microsoftによりマクロの実行がブロックされました」
と表示されてしまう場合はいったんExcelファイルを閉じます。

エクスプローラーでダウンロードしたExcelファイルを右クリックしてプロパティを確認してください。
セキュリティのところの「許可する」にチェックを付ける必要があります。

再度ExcelSqlSample.xlsを開くとExcel側でも警告を受けますので「コンテンツの有効化」を選択します。

古いシステムの場合、以下のセキュリティの警告が出かもしれません。
「マクロを有効にする」を選択して下さい。

ここまでの手順を踏んでようやくネットからダウンロードしたマクロ付きのExcelファイルを正しく開くことができます。

簡易顧客台帳としても使えると思います。

ダウンロード
“ExcelSqlSample.xls” をダウンロード ExcelSqlSample.xls – 14270 回のダウンロード – 2.22 MB参考資料


コメント
Win10 エクセル2010では動きます。Win8.1エクセル2013では オブジェクト ‘可変長の名前付きセル範囲’ が見つかりませんでした。オブジェクトが存在していること、名前やパス名が正しいことを確認してください とエラーが出る どうしてでしょうか?
エラーになる原因、対策を教えて下さい。
Windows 10+Excel 2016で確認しましたが問題なく動作しました。
何処で落ちているのか、わかれば何らかの対処方法があると思いますが、
コメントで頂いた情報だけではこれ以上の事はわかりません。