• ベストアンサー

アクセス VBA クエリSQL文変更

以前、教えていただいたにもかかわらず、作業が上手くいったことで、理解を深めることを疎かに してしまい、一部を修正したところ、わからなくなってしまいました。 申し訳ございませんが、教えてください。 Xと同一の構成である X1~という複数のテーブルから一つを選択して、クエリYを実行 クエリYは、フィールド1の値が BBBであるレコードの、フィールド1、3、5を抽出 Dim dbs As DAO.Database Dim qrdef As DAO.QueryDef Set dbs = Currentdb Set qrdef = dbs.QueryDefs("クエリY") qrdef.SQL = Replace(Expression:=qrdef.SQL _         , Find:="テーブルX" _         , Replace:="テーブルX1" _         , Compare:=vbTextCompare) Set qrdef = Nothing Set dbs = Nothing 実行時エラー3075  クエリ式'テーブルX1.フィールド1'の構文エラー:演算子がありません デバッグ qrdef.SQL = Replace(Expression:=qrdef.SQL _         , Find:="テーブルX" _         , Replace:="テーブルX1" _         , Compare:=vbTextCompare) 元となるクエリを直接実行すると正しく動作します。

質問者が選んだベストアンサー

  • ベストアンサー
  • Gin_F
  • ベストアンサー率63% (286/453)
回答No.2

> qrdef.SQL = Replace(Expression:=qrdef.SQL _ >         , Find:="テーブルX" _ >         , Replace:="テーブルX1" _ >         , Compare:=vbTextCompare) Find 引数・Replace 引数を固定で指定して、クエリのSQL文を上書きする ようになっています。 なので、 > 元となるクエリを直接実行すると正しく動作します。 これをテンプレートのような使い方をして、別のクエリを使うようにした方が いいと思います。 現在のクエリを「クエリY」としたら、「クエリZ」というのを適当に作成してください。 Dim dbs As DAO.Database Dim sqrdef As DAO.QueryDef Dim tqrdef As DAO.QueryDef Set dbs = Currentdb Set sqrdef = dbs.QueryDefs("クエリY") Set tqrdef = dbs.QueryDefs("クエリZ") tqrdef.SQL = Replace(Expression:=sqrdef.SQL _         , Find:="テーブルX" _         , Replace:="テーブルX1" _         , Compare:=vbTextCompare) Set sqrdef = Nothing Set tqrdef = Nothing Set dbs = Nothing のように。

nonboo
質問者

お礼

ご回答ありがとうございます。私の説明不足のようで、試したところまったく同じ結果でした。 伝え直すと、 , Replace:="テーブルX1" _ は , Replace:=変数A _ 元となるクエリを直接実行すると正しく動作 は クエリY⇒テーブルXを手動で実行すると正しく動作 です。 ど素人の感覚ですが、フィールド1の抽出条件が上手く反映されていないような感じです。 BBBという文字列を含むという単純な条件なのですが。 お手数おかけして恐縮です。

nonboo
質問者

補足

ありがとうございます。上手くいきました。>クエリZを適当に作成 不適当だったのかもしれません。 また、よろしくお願いします。とても助かりました。

その他の回答 (1)

  • nicotinism
  • ベストアンサー率70% (1019/1452)
回答No.1

Set qrdef = dbs.QueryDefs("クエリY") debug.print "OK " & qrdef.SQL qrdef.SQL = Replace(Expression:=qrdef.SQL _         , Find:="テーブルX" _         , Replace:="テーブルX1" _         , Compare:=vbTextCompare) debug.print "NG " & qrdef.SQL としてみてイミディエイトウィンドウに出力されたものを 見比べてみる。 手動で作成したうまく作動するテーブルX1のクエリのSQLビューと見比べる。 これで原因が調べられると思います。

nonboo
質問者

お礼

さっそくのご回答ありがとうございます。試したところ、テーブル名が変わっていませんでしたが、 正常な場合は、デバッグ箇所のところで既にテーブルX1になっているべきなのでしょうか? 実は、テーブル名は変数でフォーム入力で都度指定するようになっており、デバッグ時に、コード上 で該当箇所にカーソルを合わせると、指定した名称が正しく表示されます。 よくわかっていなくて申し訳ございません。

関連するQ&A