Access上のコード内で引用符(")と単引用符(')の使い分けについて
掲示板での質問中のコードで、引用符(")と単引用符(')の使い分けを理解できてないものをよく目にします。
ACCESS VBA( 「"」 と「'」 、スペースの使い方について)次のコード... - Yahoo!知恵袋
の質問者さんもそのようです。
難易度:
VBAのコードとSQLのコードは似て非なるもの
この問題を複雑にしているのはVBAのコードとSQLのコードは似て非なるものだということです。Accessでは、この両方を扱うことができるで混乱しやすいですが、別物だということを意識しましょう。
この違いを認識していないと、Accessのコードをいつまでたっても読めるようにはならないでしょう。
VBAのコードに関して
1.VBAのコード内では、文字列は引用符(")で囲む。
※VBAコードでは ' で囲んでも文字列とはならない。
上記は構文エラーになります。
2.VBAのコード内の文字列内に引用符(")を入れたい場合は、"" と引用符を重ねる。
3.文字列の途中に変数を埋め込みたい場合は、変数は文字列("で囲まれた部分)の外に出し & で連結する。
文字列内にそのまま変数をいれてもそれは単なる文字で変数にはならない。
SQLのコードに関して
これは、Accessでは、クエリのデザインビューのフィールド欄、抽出条件欄、SQLビュー内で記述します。
また、フォームの「レコードソース」プロパティやコンボボックス、リストボックスの「値集合ソース」プロパティにも記述できます。
最初に触れたように、VBAのコードとは別物です。
1.SQLのコードで、文字列は " で囲むか、' で囲む。
VBAでは"だけですが、SQLでは"でも'でも許容します。
SQL文のWHERE句の記述例
上記の2つのSQLはどちらも同じ結果(名前に山田を含む社員を抽出する)になります。
2." で囲んだ文字列中で " を表示したい場合は、"" と重ねて記述する。
上記のSQLでは品名「A"B」の商品が抽出されます。
これも同じ結果になります。' で囲まれた文字列中なら " は重ねる必用はない。
3.' で囲んだ文字列中で ' を表示したい場合は、'' と重ねて記述する。
商品「A'B」が抽出される。
これも同じ結果になります。" で囲まれた文字列中なら ' は重ねる必用はない。
4.文字列の途中にパラメータを埋め込みたい場合は、文字列の外に出して & で連結する。
部分一致で曖昧抽出したい場合の例
どちらでもOKです。
VBAコード中に、SQL文やSQL条件式を記述する場合
ここからさらに複雑になりますが、VBAコード中に、SQL文やSQL条件式を記述する場合があります。
例えば、FindFirstメソッドの第一引数は、SQL条件式になります。
OpenRecordsetメソッドの第一引数にはテーブル名、クエリ名以外にSQL文も記述できます。
フォームのFilterプロパティにもSQL条件式を設定します。
定義域集計関数(DLookup, DCountなど)の第3引数にもSQL条件式を設定します。
この場合、SQL文やSQL条件式は、" で囲んだ文字列として記述します。
VBAはSQLをコードとして解釈できないので、文字列として生成して、それをDAOやADOを介してデータベースエンジンに渡して実行してもらうためです。
1.VBAコード内でSQL条件式の記述例
連結フォームで部分一致条件で検索するコード例
前者も後者も名前に「山」が含まれる社員が検索されます。
どちらでもいいのですが、後者の方が引用符を重ねる必用がなく、読みやすいので、こちらの書き方を使う方が多いようです。
2.VBAコード内のSQL条件式内に変数を埋め込む記述例
SQL条件式はVBAコード中では文字列ですので、変数は文字列の外に出して & で連結します。
前者も後者も同じ結果になります。