こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

Access VBAでの構文エラー

Access2003を使って画像DBを作成しています。
VBAを利用して、AテーブルのidとBテーブルのidの一致を検索し、
検索結果を表形式の「検索結果Form」に表示するプログラムを
作成していますが、以下のコードをコンパイルすると
「構文エラー」が出てしまいます。
どなたか、解決策を教えてください。よろしくお願いいたします。

Dim objCon As DAO.Database
Dim objRs As DAO.Recordset
Dim strSQL As String

Set objCon = Application.CurrentDb

strSQL = " select * " _
& " FROM A, B " _
& " where A!id = B!id"

Set objRs = objCon.OpenRecordset(strSQL, dbOpenDynaset)

'他のフォームに検索結果を表示する方法
'もし検索結果が見つかった場合
If objRs.EOF = False Then
MsgBox "見つかりました!", vbOKOnly, "結果"
DoCmd.OpenForm "検索結果Form", , , strSQL

'検索結果が見つからなかった場合
Else
'Me.txtAge.Value = vbNullString
MsgBox "見つかりませんでした", vbOKOnly, "結果"
End If

objRs.Close

投稿日時 - 2009-04-04 23:10:27

QNo.4853235

すぐに回答ほしいです

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

では、もう一度。

起動するフォーム名は「検索結果Form」「結果Form」どちらでしょう。
どちらでもいいのですが、起動されるフォーム(上記のフォーム)のレコードソースには、どのような設定がされているのでしょうか。

単純に、"SELECT * FROM B INNER JOIN A ON B.id = A.id " が設定されていれば
DoCmd.OpenForm "検索結果Form"
の記述だけで済みそうなものですが。

このフォームのレコードソースに指定しているものを教えてください。
また、どのような操作をするためのフォーム構成となっているか教えてください。


> ※※ OpenForm のパラメータ3つ目使ったことないので、ここについてはわかりません。
> なぜ指定しなくてはならないのか、裏付けを取ってください。

裏付けをとられた上で指定されているのですよね。

投稿日時 - 2009-04-08 01:59:35

お礼

返信が大変遅くなり申し訳ありません。

ご教授いただいた方法でtryしてみたのですが、
うまくいきませんでした。少し表示するフォームを
変更して強引に出すことにしました。

根本的な解決ではありませんが日程の関係でこのようにさせて
いただきました。

たくさん返信してくださり、ありがとうございました。

投稿日時 - 2009-04-13 20:25:01

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(5)

ANo.4

テーブルAとテーブルBの各idを確認してください。
としか言いようがありません。

テーブルAのid:1, 3, 5, 7, 9
テーブルBのid:4, 5, 6, 7

なら、5, 7 が対象になります。

※ テーブル内のデータによるものと思われますので、これ以上私には無理です。

投稿日時 - 2009-04-07 10:34:33

ANo.3

> 全てのレコードが表示されてしまいます

どのような検索(絞込み)をしようとしているのでしょうか。


※※ OpenForm のパラメータ3つ目使ったことないので、ここについてはわかりません。
なぜ指定しなくてはならないのか、裏付けを取ってください。

※ Access のヘルプ OpenForm に例が書かれていますが、
  DoCmd.OpenForm "社員", , ,"氏名 = '山田 一郎'"
 4つ目には、絞り込む条件を記述します。

 呼ばれた側のフォームから見ると、Me.Filter に設定されるものになります。

※ strSQL から見ると、
テーブルAとテーブルBは一対一構成になっており、すべてのフィールドを持ってくる
ものと思われますが、。

投稿日時 - 2009-04-06 12:06:15

お礼

回答ありがとうございます。

やりたい絞込みはテーブルBにあるidと同じid(テーブルA)を
持つ、レコードを抽出してこようと考えています。

そこで、少し方針を変えて「inner join」を利用して、
それをOpenFormで表示しようと考え以下のようなコードにしました。

DoCmd.OpenForm "結果Form", , "SELECT * FROM B INNER JOIN A ON B.id = A.id "

select以下のクエリをSQLビューで確認すると期待した結果が出ましたが、
上記のようなコードにすると、全てのレコードが表示されてしまいます。

少し、質問の方向性が変わってしまいましたが、ご教授のほどよろしく
お願いいたします。

投稿日時 - 2009-04-06 21:36:04

ANo.2

> ちなみに、ご指摘いただいたところで実行時エラーが発生します。

いやいや。
そのまま私への報告ではなくて、

>> DoCmd.OpenForm "検索結果Form", , , strSQL
> 実行時、上記部分でエラーとなりそうですが。
>(4つ目のパラメータは、WhereCondition でWHERE部分を指定するものです)
>(VBEでのヘルプで、OpenForm について参照してみてください)

これに関して何か確認/試されましたか。
(細かいところまで分からないので、ご自身がいろいろ動かないと)

投稿日時 - 2009-04-05 21:30:57

お礼

すいません。

これに関して以下のようにコードを変更してみました。

Dim strSQL As String

strSQL = " select * " _
& " FROM A, B " _
& " where A!id = B!id"

DoCmd.OpenForm "検索結果Form", , strSQL

このようにすると、エラーはなくなりましたが、全てのレコードが
表示されてしまいます。うまくクエリが実行できていないようです。
再びお手数をおかけいたしますが、ご教授のほどよろしく
お願いいたします。

投稿日時 - 2009-04-06 10:39:45

ANo.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 を返すとエラー扱いされます。

投稿日時 - 2009-04-05 10:44:27

お礼

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

投稿日時 - 2009-04-05 18:30:39

あなたにオススメの質問