
| 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 文内に入っている ”'” この記号は、比較対象の列のデータ型が「テキスト型」のときだけ必要です。それ以外の時につけるとちゃんと比較できずエラーになります。 |
この情報は、お客様の疑問・問題解決のお役に立ちましたか? 満足度を左から右へ高い順へご選択ください。 |