プロが教える店舗&オフィスのセキュリティ対策術

フォーム内のコンボボックス処理について

現在ACCESS2002でDBを構築しております。
初心者です。

フォーム内でテキストボックスから値【a】をもらい、その【a】を抽出条件として抽出結果を
コンボボックスに表示したいと考えております。
※like関数を使用

Private Sub テキスト1_AfterUpdate()

DoCmd.Requery "コンボ1"

Me!テキスト1.Requery

End Sub

コンボボックスの値集合ソースの抽出条件で
((テーブル.カラム) like "'*" & Forms!フォーム!テキスト1 & "*'")
上記で指定したのですが、何も抽出されません。

イコールで下記を実行すると値は抽出されます。
((テーブル.カラム) = Forms!フォーム!テキスト1 )

LIKE関数の使い方が悪いのでしょうか。

お手数ですが、ご教授願います。

A 回答 (1件)

【要旨】


値集合ソースやクエリのSQL文では、

 ((テーブル.カラム) like "'*" & Forms!フォーム!テキスト1 & "*'")

と、「'」は入れずに、

 ((テーブル.カラム) like "*" & Forms!フォーム!テキスト1 & "*")

としてください。


【詳細】

VBA上でSQL文を扱う場合や、DMaxなどの定義域集計関数の引数にする
場合は、確かに「*」と同時に「'」を使用しますが、クエリ(又は値集合ソースへの
直接入力)に使用する場合は「'」は使用せず「*」だけを指定します。


ちょっとわかりにくいかもしれませんが(汗)、完全一致の場合も、

 ((テーブル.カラム) = "'" & Forms!フォーム!テキスト1 & "'" )

ではなく

 ((テーブル.カラム) = Forms!フォーム!テキスト1 )

と、「'」を使用せずに指定しないと正しい結果が得られないのと同様と
考えて戴ければいいかと思います。


くどくなるのを承知で(汗)、さらに説明すると・・・

VBAでは、例えば「Me.氏名」に「鈴木」という値が入っていたとして、

 strSQL = "Select * From テーブル1 Where 氏名 Like *" & Me.氏名 & "*;"

という変数への記録を行った場合、実際のWhere句は

 氏名 Like *鈴木*

となって

 氏名 Like "*鈴木*"

とはなってくれません。 
(「*」がワイルドカード文字ではなく乗算の演算子として扱われてしまう、と)
これを防ぐため、VBA上でSQL文を扱う場合は、「'」を(又は「"」を重ねて)
使用する必要があります。

一方、クエリやSQL文を直接編集する場合は、

 氏名 Like "*鈴木*"

とか

 氏名 Like "*" & Forms!フォーム!テキスト1 & "*"

といったように、予め「*」を「"」で括って文字列(ワイルドカード文字)として
明示していることになります。

なので、逆にここに「'」を追加すると、その「'」まで「検索文字列」として
指定したことになってしまうので、意図した抽出結果が得られなくなる、
ということです。


・・・以上、長くなりましたが、参考まで。

なお、余談になりますが、この「Like」は「関数」ではなく「演算子」になります。
    • good
    • 1

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

関連するカテゴリからQ&Aを探す