ここから本文です

ACCESS VBA( 「"」 と「'」 、スペースの使い方について) 次のコードがありま...

kajlapaofeirnaonfaさん

2017/1/1403:48:08

ACCESS VBA( 「"」 と「'」 、スペースの使い方について)

次のコードがあります(該当箇所のみ)。

Me.Recordset.FindFirst " 社員名 Like ' *" & Myname & "*' "

1.テキストを見ると、文字列やSQL文や「Like ・・・」の場合には「"」で囲んであります。また変数を使用する場合にも上記コードのように「"」や「'」で囲むことがあります。「"」や「'」で囲むのは他にはどのような場合でしょうか?(Access VBAのみ。Excel VBAは除く)

2.文字列は「"」でも「'」でもどちらで囲んでも構わないとテキストに書いてあります。上記のコードで「"」を「'」にすることはOKでしょうか?

3.基本的に一番外に「"」を使い、次に「'」、さらに変数や文字列など使用する場合には「"」と交互に使うものなのでしょうか?

4.例えば、文字列「ABC」を「"」で囲むとき、「" ABC"」と「”ABC”」は半角スペースが入っていないかどうかの違いだけですが、両者は違う文字列として扱われるのでしょうか?

テキストにはこの辺が全く記載されていないのと、ググッても分かりにくい情報が多かったので、質問しました。

分かりやすいURLも教えて頂けると助かります。
よろしくお願いいたします。

この質問は、活躍中のチエリアン・専門家に回答をリクエストしました。

閲覧数:
122
回答数:
3
お礼:
250枚

違反報告

ベストアンサーに選ばれた回答

プロフィール画像

カテゴリマスター

hatena1989さん

2017/1/1414:22:04

この問題を複雑にしているのはVBAのコードとSQLのコードは似て非なるものだということです。Accessでは、この両方を扱うことができるで混乱しやすいですが、別物だということは意識しましょう。質問者さんはこの違いを認識していないように思えます。

■まず、VBAのコードに関して、

1.VBAのコード内で、文字列は " で囲む。

コード例
Dim A As String
A = "あいうえお"
MsgBox A '「あいう」と表示される。

※VBAコードでは ' で囲んでも文字列とはならない。

Dim A As String
A = 'あいうえお'

上記は構文エラーになります。


2.VBAのコード内の文字列内に " を入れたい場合は、"" と重ねる。

Dim A As String
A = "あい""うえ""お"
MsgBox A '「あい"うえ"お」と表示される。


3.文字列の途中に変数を埋め込みたい場合は、変数は " の外に出し & で連結する。

Dim A As String
A = "あいう"
MsgBox "文字A文字" '「文字A文字」と表示される。
MsgBox "文字" & A & "文字" '「文字あいう文字」と表示される。



■つぎに、SQLのコードに関して、
これは、クエリのデザインビューのフィールド欄、抽出条件欄、SQLビュー内で記述するものです。
また、フォームの「レコードソース」プロパティやコンボボックス、リストボックスの「値集合ソース」プロパティにも設定できます。


1.SQLのコードで、文字列は " で囲むか、' で囲む。

SQL文のWHERE句の記述例

WHERE 社員名 Like "*山田*"

WHERE 社員名 Like '*山田*'

上記のどちらでも可。

2." で囲んだ文字列中で " を表示したい場合は、"" と重ねて記述する。

WHERE 品名 = "A""B"

「A"B」が抽出される。

※ WHERE 品名 = 'A"B' としても同じ結果になります。


3.' で囲んだ文字列中で ' を表示したい場合は、'' と重ねて記述する。

WHERE 品名 = 'A''B'

「A'B」が抽出される。

※ WHERE 品名 = "A'B" としても同じ結果になります。


4.文字列の途中にパラメータを埋め込みたい場合は、文字列の外に出して & で連結する。

WHERE 社員名 Like "*" & [氏名の一部分] & "*"

WHERE 社員名 Like '*' & [氏名の一部分] & '*'

どちらでもOKです。

■ここからさらに複雑になりますが、VBAコード中に、SQL文やSQL条件式を記述する場合があります。
例えば、質問にもあった FindFirstメソッドの第一引数は、SQL条件式になります。
OpenRecordsetメソッドの第一引数にはテーブル名、クエリ名以外にSQL文も記述できます。
フォームのFilterプロパティもSQL条件式を設定します。

この場合は、SQL文やSQL条件式は、" で囲んだ文字列として記述します。
VBAではSQLはコードとして実行できないので、文字列として生成して、それをDAOやADOのデータベースエンジンに渡して実行してもらうためです。

1.VBAコード内でSQL条件式の記述例

Dim A As String

A = "社員名 Like ""*山*"""
'「社員名 Like "*山*"」という文字列を生成

Me.Recordset.FindFirst A

A = "社員名 Like '*山*'"
'「社員名 Like '*山*'」という文字列を生成

Me.Recordset.FindFirst A

前者も後者も「山」が含まれる社員が検索されます。
SQLでは「社員名 Like "*山*"」も「社員名 Like '*山*'」も同じ意味になりますので。

ただ、後者の方が見やすいので、後者の書き方を使う場合が多いですね。


2.VBAコード内のSQL条件式内に変数を埋め込む記述例


Dim MyName As String
Dim A As String

MyName = "山"

A = "社員名 Like ""*" & Myname & "*"""
'「社員名 Like "*山*"」を生成
Me.Recordset.FindFirst A

A = "社員名 Like '*" & Myname & "*'"
'「社員名 Like '*山*'」を生成
Me.Recordset.FindFirst A

前者も後者も同じ結果になります。


■最後に、" ABC" と "ABC" の違いについて

" "(半角空白)も文字ですので、当然、文字列として別物です。

これはVBAの文字列でも、SQLの文字列でも同じです。

ただ、VBAコード中の文字列としてのSQLの場合、半角空白が無視できる場合があります。

Me.Recordset.FindFirst " 社員名 Like '*山*' "

は、

Me.Recordset.FindFirst "社員名 Like '*山*'"

と同じ結果になります。SQLコード中では半角空白は区切りの意味しかないからです。

しかし、

Me.Recordset.FindFirst "社員名 Like ' *山* '"



Me.Recordset.FindFirst "社員名 Like '*山*'"

は異なる結果になります。SQLの文字列内では半角空白は文字ですので。

質問した人からのコメント

2017/1/15 08:18:40

ありがとうございます。

文句なしにBAです。
こんなに分かりやすい説明はどこにもありません。

VBAとSQLで使い方が異なるのですね。
そもそもの所が理解できていなければ、そりゃー理解できませんよー
テキスト改善してほしい(いいテキストだけど)。

ベストアンサー以外の回答

1〜2件/2件中

並び替え:回答日時の
新しい順
|古い順

2017/1/1501:37:36

"ダブルクォーテーションで囲むと、
文字列(値)として認識されます。

'シングルクォーテーションは、そうではありません。
アルファベットと同じです。

"ABC"は、コンパイルされると
文字列のABCです。

"A'B'C"は、コンパイルされると
文字列のA'B'Cとなります。

と言う具合です。

VBAは頭が良いので、ダブルクォーテーションをシングルに変換してくれたり、シングルで囲むと、ダブルクォーテーションにしてくれたりしますが、
人間が混乱します。

その為、文字列を入れる時は常にダブルクォーテーションを使う。

文字列の中で、文字囲みを必要とする記述では、シングルクォーテーションを使う。

このようにする方が良いかなっと思います。

ちなみに、最初のコード
Me.Recordset.FindFirst " 社員名 Like ' *" & Myname & "*' "
は、コンパイルされると

仮に
Myname="佐藤"
の場合、

Me.Recordset.FindFirst " 社員名 Like ' *佐藤*' "
となります。

Me.Recordset.FindFirst命令に
文字列の社員名 Like ' *佐藤*' を引数として渡して実行すると言う考え方をすると良いかと思います。

hdumpさん

2017/1/1409:28:57

大前提、「"」で囲むのは文字列。「A = "かいとか"」と書けばAの中に「かいとか」を代入する。と言う意味。
その上で、もう一つルールが有ります、「"」で囲まれた範囲の中では「"」は単独では使えない。と言う物です。そりゃそうです。たとえば「かい"と"か」と言う内容をAに代入したいとき「A = "かい"と"か"」と書いたら何処から何処までを文字列として扱うのか判りません。そういう場合は「'」もしくは「""」で書き換えてやります。今回の例なら「A = "かい'と'か"」か「A = "かい""と""か"」になります。まぁ、見易さの関係で「'」の方が使われます。

因みに、この使い方はAccessもExcelもOutlookだってASPも、全部同じVisual Basicの最低限の基本ルールです。

ちなみに「" ABC"」と「"ABC"」の違いですが、明らかに違います。コンピューターの認識では「空白も文字」です。同じく、改行、タブなども文字です。文字コードと言う考え方を調べると判ります。

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問や知恵ノートは選択されたID/ニックネームのMy知恵袋で確認できます。