今回の記事では、VBAを使用して、Microsoft Accessのファイル内に登録されているクエリのSQL文字列を、一気にテキストファイルに出力する方法を紹介します。
クエリのSQL文字列って何さ?
Accessにおける「クエリ」は、データベースに対するデータの抽出や更新、追加などの処理を、GUIで作成できる便利な機能です。
本来データベースのデータを操作する場合は、SQLの知識は不可欠なのですが、「クエリ」ではSQLの知識がなくても扱えます。
クエリの作成画面では、テーブルの列と列をドラッグして結合設定をしたり、SQLを意識する必要のない作りになっていますが、内部的にはSQLが生成されています。
過去の記事で、クエリ内部のSQL文を表示する方法を紹介していますが、このようにすべてのクエリはSQLに置き換えることができます。
クエリは数が増えると管理が大変
クエリは前述したとおり大変便利な機能ですが、Accessで業務アプリケーションを作成し、データベースへの参照や更新などの処理にクエリを多用していた場合に、後から色々と問題が出てきます。
大きな問題としては、
ところです。
もしVBA内でSQLを書いてデータベースへの参照処理や更新処理を実装している場合は、VBEでテーブル名などの調べたい文字列を元に検索すれば、対象の処理は容易に探せます。
ただ、クエリの場合はそのように文字列で検索することができないので、参照先のテーブルや参照条件などを調べようとした場合は、クエリを一つ一つ開いてデザイナー画面で確認するしかありません。
クエリが数個程度であればそういった対応も可能ですが、クエリが数十個ぐらいの数になると、正確にクエリを管理するのは困難です。
そのため、今回紹介するVBAのサンプルコードを使用して、クエリで使われているSQL文をテキストファイルに一気に出力して、出力したテキストファイルをテキストエディタで開いて検索したり調査できるようにします。
クエリのSQLを出力するVBAサンプルコード
当項では、クエリのSQLを出力するVBAのサンプルコードを紹介します。
また、当コードでは「DAO」を使用します。
DAOの参照設定についても紹介します。
DAOの参照設定
今回の処理では、Accessのクエリの一覧とそのSQL文を取得するために、DAOを使用しています。
尚、DAOはAccessのバージョンによって、参照設定上の名前が異なります。
Microsoft DAO 3.6 Object Libirary
Microsoft Office 1x.0 Access database engine Object Library
VBE画面から参照設定を確認し、上記項目にチェックが入っていなければ入れておいてください。
サンプルコード
今回のサンプルコードでは、以下のように処理を実装しています。
- クエリの出力先を指定
- カレントデータベースに接続
- ファイルシステムオブジェクト生成
- CreateTextFileメソッドでTextStream取得
- カレントデータベースのクエリの数分ループ
- ループ処理内でクエリ名とSQL文をテキストに書き込み
- TextStreamとデータベース接続を閉じて終了
Private Sub QueryStringExport()
Dim db As DAO.Database
Dim qdf As DAO.QueryDef
Dim sqlString As String
Dim objFS As Object
Dim writeFileName As String
Dim objStm As Object
'クエリの出力先を指定します。
writeFileName = "C:\work\QueryString.txt"
'対象のデータベースを指定します。
Set db = CurrentDb
'FileSystemObjectを生成します。
Set objFS = CreateObject("Scripting.FileSystemObject")
'指定したファイルが存在しなければ作成し、存在すれば作り直して
'TextStreamオブジェクトで開きます。
Set objStm = objFS.CreateTextFile(writeFileName, True)
'クエリの数分ループします。
For Each qdf In db.QueryDefs
'クエリ名を書き込みます。
objStm.WriteLine qdf.Name
'クエリのSQL文字列を書き込みます。
objStm.WriteLine qdf.sql & vbCrLf
Next
'開いていたファイルを閉じます。
objStm.Close
'データベースを閉じます。
db.Close
'オブジェクトを破棄します。
Set qdf = Nothing
Set db = Nothing
Set objStm = Nothing
Set objFS = Nothing
End Sub
上記のサンプルコードを作り替えていただくことで、データベースの接続先をカレントデータベースではなく、別のAccessファイルを指定することもできますし、クエリの個数分回すループのなかで、特定のクエリ名に当てはまるものだけを出力対象にするといったことも容易に行えます。
是非ご自身の使いやすいように改変してご利用ください。
最後に
今回はDAOを使用して、ローカルデータベースの全クエリのSQL文をテキストファイルに出力するVBAサンプルコードを紹介しました。
私自身はAccessで業務アプリケーションを作成する場合は殆どクエリを使わないのですが、前任者など他者が作成したAccessを引き継いでメンテナンスをせざるを得ない場合も多く、そういったときにこの処理を活用しています。
是非皆さまも活用して頂ければ幸いです。

