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

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

 1. 変換したいクエリをデザインモードで開き、SQLビューにする。[SQLビューを開く方法はリンク先最下段参照](https://support.office.com/ja-jp/article/%e3%83%86%e3%82%ad%e3%82%b9%e3%83%88%e5%80%a4%e3%81%ab%e6%8a%bd%e5%87%ba%e6%9d%a1%e4%bb%b6%e3%82%92%e9%81%a9%e7%94%a8%e3%81%99%e3%82%8b-202548b6-b065-4387-800b-2456a7099bca?ui=ja-JP&rs=ja-JP&ad=JP)
 2. NOTEPAD.Exe(メモ帳を開く)。
 3. SQLをすべてコピーし、メモ帳に貼り付ける
 4. メモ帳の変換機能(CTRL+H)を呼び出す。
 5. ダブルクォーテーションを二重にする
 6. 改行している部分の末尾に`" & vbCrLf & _`をくわえる
 7. 一番最後の行だけ、ダブルクォーテーションで閉じる。


# Dbはこんな感じ

```text
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以上払ったレコード

```sql
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#));

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

```sql
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 & _ ` をくわえ、行頭に`"`をくわえます

```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#));"
```

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


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

```visualbasic
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を代入します

```vb
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

```vb

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

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

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

[Accessワイルドカード文字リファレンス](https://support.office.com/ja-jp/article/access-%E3%83%AF%E3%82%A4%E3%83%AB%E3%83%89%E3%82%AB%E3%83%BC%E3%83%89%E6%96%87%E5%AD%97%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9-af00c501-7972-40ee-8889-e18abaad12d1)
[](https://support.microsoft.com/ja-jp/help/826763/error-message-when-you-use-special-characters-in-access-databases)

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

公式はちょろっとしか書いていない
[ワイルドカード文字の例](https://support.office.com/ja-jp/article/%E3%83%AF%E3%82%A4%E3%83%AB%E3%83%89%E3%82%AB%E3%83%BC%E3%83%89%E6%96%87%E5%AD%97%E3%81%AE%E4%BE%8B-939e153f-bd30-47e4-a763-61897c87b3f4)
>疑問符 (?)、シャープ記号 (#)、アスタリスク (*) などの特殊文字を検索するには、これらの文字を角かっこで囲みます。

## 一般的な例
特に日付関係はいろいろなものが紹介されています
[クエリの抽出条件の例](https://support.office.com/ja-jp/article/%E3%82%AF%E3%82%A8%E3%83%AA%E3%81%AE%E6%8A%BD%E5%87%BA%E6%9D%A1%E4%BB%B6%E3%81%AE%E4%BE%8B-3197228c-8684-4552-ac03-aba746fb29d8)

## 公式のクエリの解説の入り口
[Access > クエリ](https://support.microsoft.com/ja-jp/office/%E3%82%AF%E3%82%A8%E3%83%AA-93fb69b7-cfc1-4f3e-ab56-b0a01523bb50?ui=ja-JP&rs=ja-JP&ad=JP)
こちらからクエリの基本からSQLの解説までそろっています。