• ベストアンサー

アクセス 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

  • Access VBAでパラメータクエリをSQL文へ

    すみません、、初めて質問しますが、 お手柔らかに宜しくお願い致します。 1.集計クエリ1    ID--Group化 出庫数--合計 日付--Where条件 2..集計クエリ2  ID--Group化 入庫数--合計 日付--Where条件 3.出力用クエリ  ID 商品名 集計クエリ1の合計 集計クエリ2の合計  IDと左結合で、上記のクエリを作成 デザインビューでは1~3は完成しており、 VBA上で1と2を3のSQLに置き換えるところで悩んでおります。。 どなたか教えてください。 ちなみに1.集計クエリの下記のように試してみましたが、 Dim dbs As DAO.Database Dim qdf As QueryDef Dim rst As DAO.Recordset Set qdf = dbs.QueryDefs("Q_データ抽出をしたいクエリ") With qdf .Parameters("[Forms]![f_DataEx]![txt_YearStart]") = "2011" .Parameters("[Forms]![f_DataEx]![txt_MonthStart]") = "02" .Parameters("[Forms]![f_DataEx]![txt_DayStart]") = "23" .Parameters("[Forms]![f_DataEx]![txt_YearEnd]") = "2011" .Parameters("[Forms]![f_DataEx]![txt_MonthEnd]") = "02" .Parameters("[Forms]![f_DataEx]![txt_DayEnd]") = "23" Set rst = .OpenRecordset End With 上記で求めた"rstを基にSQL文が実行できれば、実現できそうなんですが、 うまく行きません。 言葉足らずの内容もあるかと思いますが、宜しくお願い致します。

  • ACCESSクエリでの結合の仕方・・・SQL文かも

    ACCESS 2003を使用しています。 テーブルA テーブルB の2テーブルでクエリを作っています。 結合的には・・・ テーブルAのフィールドX ⇔ テーブルBのフィールドY です。 これで2テーブルに共通する一致データのみ抽出はできるのですが、 2テーブルに共通する一致データに加えて、 2テーブルの不一致データも一緒にクエリ表示されるようにしたいのです。 欲しいのは抽出イメージは、以下のような感じのクエリ結果です。 テーブルA:フィールドX|テーブルBのフィールドY a             |(空) (空)           |b c             |c d             |(空) (空)           |e f              |f  g             |(空) h             |h おそらく、SQL文を書く必要があるとは、想像できるのですが・・・ どなたか、ご教授いただけると助かります。 よろしくお願いします。

  • アクセス クエリ-について

    テーブルには、 フィールド1 ------------------ エクセルaaa aaaエクセルaaa aaaエクセル ------------------ というレコードが入っていて、 ------------------------------------------------------ UPDATE テーブル1 SET テーブル1.フィールド1 = "Excel" WHERE (((テーブル1.フィールド1) Like "*エクセル*")); ------------------------------------------------------ という更新クエリ作り、実行すると、テーブルのデータが フィールド1 ------------------ Excel Excel Excel ------------------ になってしまいます。 やりたい事は、 フィールド1 ------------------ Excelaaa aaaExcelaaa aaaExcel ------------------ にしたいのですが、更新クエリじゃ無理なのでしょうか? 手動でテーブルで検索ダイアログを開いてフィールドの一部分のみ置換するしかないのですか? 最終的には、 ------------------------------------------------------ Sub 更新クエリ() Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset Dim 置換前 As String Dim 置換後 As String Dim SQL As String cn.Open "Provider = Microsoft.ACE.OLEDB.12.0;" & "Data Source= " & CurrentProject.FullName rs.Open "T置換", cn, adOpenKeyset, adLockOptimistic For i = 1 To rs.RecordCount 置換前 = rs("置換前") 'エクセル 置換後 = rs("置換後") 'Excel SQL = "UPDATE テーブル1 SET テーブル1.フィールド1 = ""Excel"" WHERE (((テーブル1.フィールド1) Like ""*エクセル*""));" DoCmd.RunSQL SQL rs.MoveNext Next rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing End Sub ------------------------------------------------------ のようにして、置換用テーブルのレコードを一つ一つ取得して、 テーブル1の値を置換していきたいのです。 何か対策があればご回答よろしくお願いします。

  • アクセスVBA テーブル名を変数とするクエリ実行・エクスポート

    テーブル X(フィールド1~30)を対象とするクエリ Yがあります。 クエリ Yは、フィールド1の値が BBBであるレコードの、フィールド3、5、7を抽出します。 クエリ Yの実行結果をエクセルファイル Zにエクスポートします。 Xと同一の構成である X1~X10という複数のテーブルから一つを選択して、クエリYを実行し て、エクセルファイル Zにエクスポートしたいのですが、VBAでは、どのように記述するのでしょうか? フォーム Fのテキストボックス Tに入力して、テーブルを指定(変数)したいのです。 上記が可能な場合、続けて Zにエクスポートすることはできるのでしょうか? エクスポート用のテーブルを一時的に作成しなければならないのでしょうか? 説明下手で申し訳ございません。お手数ですが、ご教示ください。よろしくお願いします。

  • 一つのSQLで実行する方法

    SQL初心者です。以下のような商品テーブルの備考欄の文字列をアップデートするSQLですが、ひとつのSQL文で実行させるにはどのように記述すれば良いかお教えいただけませんでしょうか? UPDATE 商品テーブル SET 備考フィールド = replace(備考フィールド,'%明太子味',''); UPDATE 商品テーブル SET 備考フィールド = replace(備考フィールド,'のり味',''); UPDATE 商品テーブル SET 備考フィールド = replace(備考フィールド,'みそ味','');

  • ACCESS VBA クエリを開く

    ACCESS初心者です。 VBAはEXCELで独学した程度の知識です。 フォームから受注納期を入力し、クエリを抽出。 クエリでレコード毎に製品票の印刷枚数を計算し レポートで各レコード毎に求められた印刷枚数分を 印刷させたいのですが・・・ クエリを開く段階でつまずいており困っています。 Private Sub コマンド23_Click() Dim db As DAO.database Dim rs As DAO.Recordset Dim qdf As DAO.QueryDef Set db = CurrentDb() Set qdf = db.QueryDefs("受注クエリ") With qdf .Parameters("納期") = Format(Forms![受注データ一覧]![納期], "yyyy/mm/dd") Set rs = .OpenRecordset .Close End With MsgBox rs![注文番号] rs.Close End Sub パラメータクエリの開き方、上記コードで問題ないでしょうか? そしてこのコードを実行した際 実行時エラー3421 データ型の変換エラーが発生しましたと表示されます。 ローカルウィンドウで 変数rs = nothingとなっており クエリのレコードが読み込めていないようです。 (Msgbox rs!注文番号はデータが読み込めたかテストするために コードを書いています。) どうぞ宜しくお願いいたします。

  • ACCESSのクエリで同じSQL文だが結果が異なる

    ACCESS2003にて 選択クエリAをSQLビューで開きSQL文をコピー、 新規作成したクエリBのSQLビューに貼り付けて実行したところ、 AとBで結果の件数が異なりました。 そのままBを保存して終了。 BをSQLビューで開き、 SQL文の末尾の;を削除して実行すると、 Aと同じ件数の結果になりました。 再度Bを保存して終了し、 BをSQLビューで開き、 SQL文の末尾の;を削除して実行すると、 Aと異なる件数(元の結果)になりました。 何が原因なのでしょうか。 SQL文の内容は、サブクエリを含んでいて、サブクエリのFROMは SQLSERVERのリンクテーブルです。 よろしくお願いします。

  • エクセルからアクセスの更新クエリをVBAで実行したい

    こんばんは。たびたび失礼します。 http://oshiete1.goo.ne.jp/qa4909202.html の続きです。 アクセスの「テーブル1」の「フィールド」(Yes/No型)がFalseなら Trueにする更新クエリをエクセルから実行したいのですがうまく行きません。 Sub test1() Dim cn As New ADODB.Connection cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & "\\Users\ユーザーアカウント名です\Documents" & "\アクセス.mdb" cn.Execute "UPDATE テーブル1 SET フィールド = False WHERE フィールド='" & True & "'" Set cn = Nothing End Sub これを実行すると 実行時エラー2147217913 抽出条件でデータ型が一致しません。 となります。 どうすればいいでしょうか? ご教授よろしくお願いします。

  • SQLサーバーのテーブルに対してアクセスで更新クエリを行ないたい

    こんばんは。 ・vista ・アクセス2003 ・SQL Server 2005 です。 SQL ServerからテーブルをMDBへリンクしているのですが そのテーブルに対し、アクセス側で更新クエリを実行しようとすると 実行時エラー '3157': ODBC--リンク テーブル'テーブル名'での更新に失敗しました。 [Microsoft][ODBC SQL Server Driver]時間切れになりました。(#0) と言うエラーになり、更新クエリができません。 どうすればアクセスでSQLサーバーのテーブルに対して更新クエリを行えるのでしょうか? よろしくお願いします。

  • EXCEL→SQL VBAを簡略化したい

    EXCELのVBAを使って、SQLサーバーに接続し、 データテーブルを開き、データを200個(xが100個、yが100個) 書き込みさせたいプログラムを作っています。 強引に1つ1つ書き込みし、200個登録は出来たのですが、 もっとプログラムを簡略化したいと思います。 以下に内容をしめします。 ------------------------------------------- 'SQLデータベースに接続 Set rs = CreateObject("ADODB.RecordSet") Set CN = CreateObject("ADODB.Connection") CN.ConnectionString = "Driver={SQL Server};" & _ "server=○○○.○○.○○.○○; database=DB ; uid=ID; pwd=1234;" CN.Open '-----[Dataテーブル] ----- Set rs = New Recordset rs.Open "Data", CN, adOpenKeyset, adLockOptimistic '[Dataテーブル]に書込み rs.AddNew Worksheets("Sheet1").Select '☆☆☆ rs!x1 = Cells(10, 5).Value rs!x2 = Cells(11, 5).Value rs!x3 = Cells(12, 5).Value rs!x4 = Cells(13, 5).Value    ・    ・     ・    ・ rs!x100 = Cells(109, 5).Value rs!y1 = Cells(10, 7).Value rs!y2 = Cells(11, 7).Value rs!y3 = Cells(12, 7).Value rs!y4 = Cells(13, 7).Value    ・    ・     ・    ・ rs!y100 = Cells(109, 7).Value '☆☆☆ '保存 rs.Update MsgBox "追加しました" '後処理 rs.Close: Set rs = Nothing CN.Close: Set CN = Nothing '終了処理 Set rs = Nothing Set CN = Nothing ------------------------------------------- '☆☆☆で挟まれた部分を繰り返し文で簡潔にプログラミングしたいです。 自分が考えた以下の分では、エラーが出てしまいました。   i = 1   n = 10 Do While i < 100    rs!x"& i &" = Cells(n, 5)    rs!y"& i &" = Cells(n, 7)   i = i + 1   n = n + 1 Loop よりシンプルな構文にしたいと思います。 お手数おかけいたしますが、わかる方いらっしゃいましたら 教えて下さい。

専門家に質問してみよう