#クエリの文字列の変換の仕方
- 変換したいクエリをデザインモードで開き、SQLビューにする。SQLビューを開く方法はリンク先最下段参照
- NOTEPAD.Exe(メモ帳を開く)。
- SQLをすべてコピーし、メモ帳に貼り付ける
- メモ帳の変換機能(CTRL+H)を呼び出す。
- ダブルクォーテーションを二重にする
- 改行している部分の末尾に
" & vbCrLf & _
をくわえる - 一番最後の行だけ、ダブルクォーテーションで閉じる。
#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"のようにファイル名 & "ピリオド+拡張子" のように変える必要があります。
###特殊文字
これ以外でも特殊文字、ワイルドカード、#ナンバー記号などが注意する必要があります。こちらはよく知られています。
アスタリスク (*)、疑問符 (?)、シャープ記号 (#)、開き角かっこ ([)、またはハイフン (-) など他のワイルドカード文字を検索するには、それらを角かっこで囲む必要があります。
「*」を含むデータのあるフィールドの[抽出条件]欄に
「Like "*" & "[*]" & "*"」
「&」を使わずに「Like "*[*]*"」と記述しても同じ結果となります
公式はちょろっとしか書いていない
ワイルドカード文字の例
疑問符 (?)、シャープ記号 (#)、アスタリスク (*) などの特殊文字を検索するには、これらの文字を角かっこで囲みます。
##一般的な例
特に日付関係はいろいろなものが紹介されています
クエリの抽出条件の例
##公式のクエリの解説の入り口
Access > クエリ
こちらからクエリの基本からSQLの解説までそろっています。