Last Update : 2008/03/24

Q.モジュールの中でSQL文を組み立ててレコードセットを作ったのですが、思ったとおり抽出されません・・・
このコンテンツに関連したおすすめ書籍: Access VBA逆引き大全600の極意―2002/2003/2007対応

コメント: VBAでなにができるのか、どんなときに使うのか。3バージョン対応って、MSよりよっぽど親切。(暴言)
Dim Mydb as DataBase
Dim MyRec as Recordset
Dim SQL as string

Set Mydb = CurrentDB()

SQL = "Select * from TableA"
SQL = SQL & " Where A1 = Forms![フォーム1]![テキスト1] and A2 = forms![フォーム1]![テキスト2]"

set MyRec = Mydb.OpenRecordset(SQL)

「こうすると、『パラメータが不足しています』とか言われちゃうんです・・・フォームのコントロールを参照するクエリーってモジュールじゃ使えないんですかね? そう思って・・・」

Dim wkA1 as string
Dim wkA2 as sring

wkA1 = Forms![フォーム1]![テキスト1]
wkA2 = Forms![フォーム1]![テキスト2]

SQL = "Select * from TableA"
SQL = SQL & " Where A1 = 'wkA1' and A2 = 'wkA2'"

set MyRec = Mydb.OpenRecordset(SQL)

「こうしてみたんですけど、エラーは出ないんですが一件も抽出されません。モジュールの中で作ったSQL文からはレコードセットは作れないんですか?」

・・・うーん。とっても惜しいんですよねぇ。あと一歩なんです。
ここまでできていているんですから、どうせなら

SQL = "Select * from TableA"
SQL = SQL & " Where A1 = '" & Forms![フォーム1]![テキスト1] & "' and A2 = '" & Forms![フォーム1]![テキスト2] & "'"

set MyRec = Mydb.OpenRecordset(SQL)

こう書きましょうよ!!
これは、Debug.Print等で、変数「SQL」の中身を見てみれば解ってもらえると思うんですが、

SQL = "Select * from TableA"
SQL = SQL & " Where A1 = Forms![フォーム1]![テキスト1] and A2 = forms![フォーム1]![テキスト2]

これの中身は、
Select * from TableA Where A1 = Forms![フォーム1]![テキスト1] and A2 = forms![フォーム1]![テキスト2]
に、なります。

wkA1 = Forms![フォーム1]![テキスト1]
wkA2 = Forms![フォーム1]![テキスト2]
SQL = "Select * from TableA"
SQL = SQL & " Where A1 = 'wkA1' and A2 = 'wkA2'"

これの中身は、
Select * from TableA Where A1 = 'wkA1' and A2 = 'wkA2'"
になります。


上記2つに対し、
SQL = "Select * from TableA"
SQL = SQL & " Where A1 = '" & Forms![フォーム1]![テキスト1] & "' and A2 = '" & Forms![フォーム1]![テキスト2] & "'"

これの中身は、
Select * from TableA Where A1 = 'A001' and A2 = 'A222'"
になります。全然違いますよね。

モジュール内で、SQL 文をクエリー・Docmd.RunSQL 以外の方法で実行する場合、フォームのコントロールの値だとか、変数の値だとかを参照することはできません
QueryDef オブジェクト作って Parameters コレクションとか使えば可能ですが、クエリーのデザインを変更することになるのでこれをあんまり頻繁にやりますと MDB ファイルが肥大する原因にもなりますのでお勧めしません。
つまり、SQL文に対し、変数を渡してやって値を参照してもらうのでなく、モジュールの中で変数を値に変換して、SQL を作ってあげなければダメなのです。

注意:Forms![フォーム1]![テキスト1]の値:A001
   Forms![フォーム1]![テキスト2]の値:A222
   だとします。

なお、SQL 文内に入っている ”'” この記号は、比較対象の列のデータ型が「テキスト型」のときだけ必要です。それ以外の時につけるとちゃんと比較できずエラーになります。


この件に関しましてご質問がございましたら、こちらまで。


この情報は、お客様の疑問・問題解決のお役に立ちましたか?
満足度を左から右へ高い順へご選択ください。


←役に立った 9 8 7 6 5 4 3 2 1 役に立たない→
この情報へのご意見、ご要望がございましたらこちらへご記入ください。
( 全角 500 文字以内 )








Top へもどる