5
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

AccessのクエリをVBAのSQLに変換する方法 How To Tranform Query SQL to VBA SQL Code

Last updated at Posted at 2018-04-30

#クエリの文字列の変換の仕方

  1. 変換したいクエリをデザインモードで開き、SQLビューにする。SQLビューを開く方法はリンク先最下段参照
  2. NOTEPAD.Exe(メモ帳を開く)。
  3. SQLをすべてコピーし、メモ帳に貼り付ける
  4. メモ帳の変換機能(CTRL+H)を呼び出す。
  5. ダブルクォーテーションを二重にする
  6. 改行している部分の末尾に" & vbCrLf & _をくわえる
  7. 一番最後の行だけ、ダブルクォーテーションで閉じる。

#Dbはこんな感じ

col1,col2,col3,col4
1,a,\1000,2018/4/9
2,b,\2000,2018/4/28
3,c,\3000,2018/5/12
4,c,\3000,2018/5/12
5,c,\3000,2018/5/12
6,c,\6000,2018/5/12

##選択クエリ
aさんかcさんが2018年4月1日から5月31日の間に3000以上払ったレコード

SELECT T_Master.Col1, T_Master.Col2, T_Master.Col3, T_Master.Col4
FROM T_Master
WHERE (((T_Master.Col2)="a" Or (T_Master.Col2)="c") AND ((T_Master.Col3)>=3000) AND ((T_Master.Col4) Between #4/1/2018# And #5/31/2018#));

これをメモ帳に貼り付け、ダブルクォーテーションをダブルクォーテーションダブルクォーテーションに変換します

SELECT T_Master.Col1, T_Master.Col2, T_Master.Col3, T_Master.Col4
FROM T_Master
WHERE (((T_Master.Col2)=""a"" Or (T_Master.Col2)=""c"") AND ((T_Master.Col3)>=3000) AND ((T_Master.Col4) Between #4/1/2018# And #5/31/2018#));

次に最終行以外の末尾に" & VBCRLF & _ をくわえ、行頭に"をくわえます

"SELECT T_Master.Col1, T_Master.Col2, T_Master.Col3, T_Master.Col4" & VBCRLF & _ 
"FROM T_Master" & VBCRLF & _ 
"WHERE (((T_Master.Col2)=""a"" Or (T_Master.Col2)=""c"") AND ((T_Master.Col3)>=3000) AND ((T_Master.Col4) Between #4/1/2018# And #5/31/2018#));"

アンダーバー_は継続文字というらしいのですが、1変数の代入で24行までしか使えません。それ以上になる場合には複数の変数に分割するか、追記します。

##型枠
選択クエリを作るVBAのコードを作っておきます

Function Macro_MakeSelectQuery()
Call MakeSelectQuery
End Function
Sub MakeSelectQuery()
Dim cDB as Dao.Database : set cdb= Currentdb
Dim Q as QueryDef,tdf as dao.Tabledef
Dim sSQL as string
Const Qname =""
Set Q = cdb.CreateQueryDef(Qname)
sSQL = ""
Q.SQl =sSQL
cDB.QueryDefs.Refresh
Application.RefreshDatabaseWindow
End Sub

##当てはめ
####クエリ名、SQLを代入します

Function Macro_MakeSelectQuery() 
'アクションマクロでSubプロシージャを呼び出すための関数
Call MakeSelectQuery
End Function
Sub MakeSelectQuery()
Dim cDB As DAO.Database: Set cDB = CurrentDb
Dim Q As QueryDef, tdf As DAO.TableDef
Dim sSQL As String
Const Qname = "QS_T_Master"
Set Q = cDB.CreateQueryDef(Qname)
Q.SQL = "SELECT T_Master.Col1, T_Master.Col2, T_Master.Col3, T_Master.Col4" & vbCrLf & _
"FROM T_Master" & vbCrLf & _
"WHERE (((T_Master.Col2)=""a"" Or (T_Master.Col2)=""c"") AND ((T_Master.Col3)>=3000) AND ((T_Master.Col4) Between #4/1/2018# And #5/31/2018#));"
cDB.QueryDefs.Refresh
Application.RefreshDatabaseWindow
End Sub

##ピリオドと特殊文字の例外(2018/6/23追記)
ファイル名.拡張子で、すべて英数文字の場合、ピリオドは予期しない挙動をします。
このため選択クエリの抽出条件は
https://qiita.com/Q11Q/items/18f2f6c420475314b2b1


sSQL = "SELECT X.[filename] FROM X WHERE (((X.[filename])=""PrinterStatus"" & "".vbs""));"

のように ""ファイル名"" & ".vbs"のようにファイル名 & "ピリオド+拡張子" のように変える必要があります。

###特殊文字
これ以外でも特殊文字、ワイルドカード、#ナンバー記号などが注意する必要があります。こちらはよく知られています。

Accessワイルドカード文字リファレンス

*を含むデータを抽出したい - relief

アスタリスク (*)、疑問符 (?)、シャープ記号 (#)、開き角かっこ ([)、またはハイフン (-) など他のワイルドカード文字を検索するには、それらを角かっこで囲む必要があります。
「*」を含むデータのあるフィールドの[抽出条件]欄に
「Like "*" & "[*]" & "*"」
「&」を使わずに「Like "*[*]*"」と記述しても同じ結果となります

公式はちょろっとしか書いていない
ワイルドカード文字の例

疑問符 (?)、シャープ記号 (#)、アスタリスク (*) などの特殊文字を検索するには、これらの文字を角かっこで囲みます。

##一般的な例
特に日付関係はいろいろなものが紹介されています
クエリの抽出条件の例

##公式のクエリの解説の入り口
Access > クエリ
こちらからクエリの基本からSQLの解説までそろっています。

5
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?