• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:Access VBAでの構文エラー)

Access VBAでの構文エラー

このQ&Aのポイント
  • Access2003を使って画像DBを作成しています。VBAを利用して、AテーブルのidとBテーブルのidの一致を検索し、検索結果を表形式の「検索結果Form」に表示するプログラムを作成していますが、以下のコードをコンパイルすると「構文エラー」が出てしまいます。どなたか、解決策を教えてください。
  • Access VBAでの構文エラーについての解決策を教えてください。画像DBを作成している途中で、VBAを使ってAテーブルとBテーブルのidを一致させる検索プログラムを作成していますが、コンパイルすると構文エラーが出ます。
  • Access VBAでの構文エラーの解決策を教えてください。画像DB作成中に、AテーブルとBテーブルのidを一致させる検索プログラムを作成していますが、コンパイル時に構文エラーが発生してしまいます。どうすれば解決できますか?

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

  • ベストアンサー
  • 30246kiku
  • ベストアンサー率73% (370/504)
回答No.5

では、もう一度。 起動するフォーム名は「検索結果Form」「結果Form」どちらでしょう。 どちらでもいいのですが、起動されるフォーム(上記のフォーム)のレコードソースには、どのような設定がされているのでしょうか。 単純に、"SELECT * FROM B INNER JOIN A ON B.id = A.id " が設定されていれば DoCmd.OpenForm "検索結果Form" の記述だけで済みそうなものですが。 このフォームのレコードソースに指定しているものを教えてください。 また、どのような操作をするためのフォーム構成となっているか教えてください。 > ※※ OpenForm のパラメータ3つ目使ったことないので、ここについてはわかりません。 > なぜ指定しなくてはならないのか、裏付けを取ってください。 裏付けをとられた上で指定されているのですよね。

ejty110
質問者

お礼

返信が大変遅くなり申し訳ありません。 ご教授いただいた方法でtryしてみたのですが、 うまくいきませんでした。少し表示するフォームを 変更して強引に出すことにしました。 根本的な解決ではありませんが日程の関係でこのようにさせて いただきました。 たくさん返信してくださり、ありがとうございました。

その他の回答 (4)

  • 30246kiku
  • ベストアンサー率73% (370/504)
回答No.4

テーブルAとテーブルBの各idを確認してください。 としか言いようがありません。 テーブルAのid:1, 3, 5, 7, 9 テーブルBのid:4, 5, 6, 7 なら、5, 7 が対象になります。 ※ テーブル内のデータによるものと思われますので、これ以上私には無理です。

  • 30246kiku
  • ベストアンサー率73% (370/504)
回答No.3

> 全てのレコードが表示されてしまいます どのような検索(絞込み)をしようとしているのでしょうか。 ※※ OpenForm のパラメータ3つ目使ったことないので、ここについてはわかりません。 なぜ指定しなくてはならないのか、裏付けを取ってください。 ※ Access のヘルプ OpenForm に例が書かれていますが、   DoCmd.OpenForm "社員", , ,"氏名 = '山田 一郎'"  4つ目には、絞り込む条件を記述します。  呼ばれた側のフォームから見ると、Me.Filter に設定されるものになります。 ※ strSQL から見ると、 テーブルAとテーブルBは一対一構成になっており、すべてのフィールドを持ってくる ものと思われますが、。

ejty110
質問者

お礼

回答ありがとうございます。 やりたい絞込みはテーブルBにあるidと同じid(テーブルA)を 持つ、レコードを抽出してこようと考えています。 そこで、少し方針を変えて「inner join」を利用して、 それをOpenFormで表示しようと考え以下のようなコードにしました。 DoCmd.OpenForm "結果Form", , "SELECT * FROM B INNER JOIN A ON B.id = A.id " select以下のクエリをSQLビューで確認すると期待した結果が出ましたが、 上記のようなコードにすると、全てのレコードが表示されてしまいます。 少し、質問の方向性が変わってしまいましたが、ご教授のほどよろしく お願いいたします。

  • 30246kiku
  • ベストアンサー率73% (370/504)
回答No.2

> ちなみに、ご指摘いただいたところで実行時エラーが発生します。 いやいや。 そのまま私への報告ではなくて、 >> DoCmd.OpenForm "検索結果Form", , , strSQL > 実行時、上記部分でエラーとなりそうですが。 >(4つ目のパラメータは、WhereCondition でWHERE部分を指定するものです) >(VBEでのヘルプで、OpenForm について参照してみてください) これに関して何か確認/試されましたか。 (細かいところまで分からないので、ご自身がいろいろ動かないと)

ejty110
質問者

お礼

すいません。 これに関して以下のようにコードを変更してみました。 Dim strSQL As String strSQL = " select * " _ & " FROM A, B " _ & " where A!id = B!id" DoCmd.OpenForm "検索結果Form", , strSQL このようにすると、エラーはなくなりましたが、全てのレコードが 表示されてしまいます。うまくクエリが実行できていないようです。 再びお手数をおかけいたしますが、ご教授のほどよろしく お願いいたします。

  • 30246kiku
  • ベストアンサー率73% (370/504)
回答No.1

エラーが起きているのはどこでしょうか。 > DoCmd.OpenForm "検索結果Form", , , strSQL 実行時、上記部分でエラーとなりそうですが。 (4つ目のパラメータは、WhereCondition でWHERE部分を指定するものです) (VBEでのヘルプで、OpenForm について参照してみてください) ※ 余談 ご質問の処理では、フォームを呼ぶ前と、呼ばれたフォームで同じ抽出結果を取得しているのでデータ量が多くなれば遅くなる要因となります。 2度行っていたことを1度に集約する一例を以下に。 呼ばれるフォーム(ご質問では、検索結果Form)  フォームのレコードソースに以下を設定しておきます。  "SELECT * FROM A, B WHERE A.ID = B.ID" 呼ばれるフォームの「開く時」イベントで以下を記述しておきます。 (レコードソースに指定した内容の抽出は、このイベント前で終了しているようですので、件数が0ならCancel=True) Private Sub Form_Open(Cancel As Integer)   If (Me.Recordset.RecordCount = 0) Then     Cancel = True   End If End Sub ※ Cancel = True とすると、それ以降のイベントは発生せず表示もされません。 呼ぶ側の記述を以下に全部取り換え   On Error GoTo ERR_HAND   DoCmd.OpenForm "検索結果Form"   Exit Sub ERR_HAND:   MsgBox "見つかりませんでした", vbOKOnly, "結果" End Sub ※ OpenFormで起動したフォームが Form_Open で Cancel = True を返すとエラー扱いされます。

ejty110
質問者

お礼

補足までつけてくださりありがとうございます。 ちなみに、ご指摘いただいたところで実行時エラーが発生します。

関連するQ&A