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を一致させる検索プログラムを作成していますが、コンパイル時に構文エラーが発生してしまいます。どうすれば解決できますか?
回答を見る
  • ベストアンサー

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

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

  • ベストアンサー
  • 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

  • ACCESSでレコード数の取得の仕方

    Aテーブルのレコード数を取得しようと思い、次のPGを考えました。(Aテーブルには10件のデータが入っています。)ですが、「-1」という数値が返ってきます。なぜでしょうか? Dim objADOCON As ADODB.Connection Dim objADORS As ADODB.Recordset Dim strSQL As String Set objADOCON = Application.CurrentProject.Connection strSQL = "SELECT * FROM Aテーブル" Set objADORS = objADOCON.Execute(strSQL) MsgBox objADORS.RecordCount , vbOKOnly, "レコード数"

  • VBscriptでAccessに接続。PCで結果が異なる。

    VBscriptでAccessに接続。 PC1ではDBの検索結果が表示されますが PC2では表示されません。 PC1はWindows XP Pro IIS Access 2000 PC2はWindows server 2003 IIs Access 2000 当然ながらソースは同じです。 プログラムの問題でしょうか。 それともなにか設定の問題でしょうか。 VBscript 部分 <% '========================================================================================================== Dim objCon Dim objRS Dim strSQL '======================================= dim objfs dim strFDIRNAME Set objFS = Server.CreateObject("Scripting.FileSystemObject") strFDIRNAME = Server.MapPath(".") 'フォルダー名取得 '======================================= '##### コネクションオブジェクトの生成 ##### Set objCon = Server.CreateObject("ADODB.Connection") '##### 接続用パレメータの設定 ##### objCon.Provider = "Microsoft.Jet.OLEDB.4.0" Set objRS = Server.CreateObject("ADODB.Recordset") '##### MDBの絶対パス指定 ##### objCon.ConnectionString =strFDIRNAME & "\" & "meibo.mdb" '##### コネクションのオープン ##### objCon.Open '##### SQLの作成 ##### strSQL = "select DISTINCT 社員名 from TABLE " '##### レコードセットのオープン ##### objRS.Open strSQL, objCon, 3 Recnm=objRS.RecordCount Do Until objRS.EOF %> <OPTION value="<%=objRS("社員名").value%>"><%=objRS("社員名").value%></OPTION> <% '##### 次のレコードを参照 ##### objRS.MoveNext Loop end if %> <% '##### コネクションのクローズ ##### objCon.Close '##### コネクションオブジェクトの解放 ##### Set objCon = Nothing '================ %>

  • access2000の構文エラー

    みなさんこんにちは。access2000で会社の住所録を作っているんですが、vbaでプログラムを作っているときにどうしても分からない構文エラーがでるので教えてください・・・ 以下の & "ORDER BY 姓カナ,名カナ;" がどうしてもひっかかります。 ちなみに全体は下です。 よろしくお願い致します。 '概要:サブフォームに個人リストを表示する Private Sub SetSubIndividual() Dim strSql As String Dim frm As Form_個人情報入力 Set frm = Form_個人情報入力 If IsNull(frm.TXT姓カナ) Then Exit Sub strSql = "SELECT 個人ID AS 番号, [姓] & ' ' & [名] & '(' & [姓カナ] & ' ' & [名カナ] & ')' AS 名前 " _ & "FROM 個人情報 " _ & "WHERE 姓カナ Like '" & frm.TXT姓カナ & "*' " & "ORDER BY 姓カナ,名カナ;" frm.FRM名簿SUB.Form.RecordSource = strSql frm.FRM名簿SUB.Requery frm.GRP選択 = fncGetHeader(frm.TXT姓カナ) End Sub

  • ASPでボタンクリック時にフォームのリフレッシュ

    こんばんわ。 質問です。 ASPで作成した質問ページに表示されている質問の回答と、テキストボックスに入力されている文字列をリフレッシュしたいです。 質問の回答は、ラジオボタンをチェックしてあります。 そして、このあと、ADO接続で、SQLサーバーに接続して、テキストボックスに入力されていた文字列を選択し、文字列がDB内にあれば、その文字列をテキストボックスに再表示します。 以下のようなコードを書きましたが、何も表示されません。 <% Dim objCon Dim objRS Dim strSQL Dim strUserID Dim strOCD 'フォーム内のリフレッシュを行いたい ' コネクションオブジェクトの生成 Set objCon = Server.CreateObject("ADODB.Connection") Set objRS = Server.CreateObject("ADODB.Connection") ' コネクションストリングの設定 objCon.ConnectionString = "Provider=SQLOLEDB;" & _ "User ID=id;" & _ "Password=pw;" & _ "Data Source=server1;" & _ "Initial Catalog=data1" ' コネクションのオープン objCon.Open strUserID = obj.uerID.value set strSQL = "Select ID, dnum from emp Where CorpId='"& obj.userID.value &"'" 'レコードセットのオープン objRS.Open strSQL, objCon, 3 'EOF が True になるまで繰り返し Do Until objRS.EOF if objrs.RecordCount=0 then Msg "正しいIDを入力してください! Insert correct ID ! " else obj.ID.value = strSQL("txtid") obj.dnum.value = strSQL("txtdnum") end if '次のレコードを参照 objRS.MoveNext Loop 'コネクションのクローズ objCon.Close ' コネクションオブジェクトの解放 Set objCon = Nothing %> ご教示いただけると、幸いです。

  • access一部のフィールドを他のテーブルへVBA

    先日 https://okwave.jp/qa/q10245651.html において > table2の新しいデータとして > table1のデータをコピーしたい、 単に追加で ということであれば、という 御回答: Sub Test() Dim StrSQL As String StrSQL = "INSERT INTO table2 SELECT table1.* FROM table1;" DoCmd.SetWarnings False DoCmd.RunSQL StrSQL DoCmd.SetWarnings True End Sub ---------------------- 上記の 回答をいただき うまく稼働しました 部分的にフィールドを別テーブルに 移動するとき ここでは table1のフィールド名 IDに table2のフィールド名 bに 入っている数値 にい 1を加えた数値を 移動したいのですが Public Function Test() Dim tb1 As Table Dim tb2 As Table tb1 = table1 tb2 = table2 Dim strSQL As String strSQL = "INSERT INTO table2![ID]SELECT"("[b]"FROM tablel)+1" (table1のフィールド[b]の数値に1を加えた数値を table2のフィールド[ID]に移行する、というつもりです) DoCmd.SetWarnings False DoCmd.RunSQL strSQL DoCmd.SetWarnings True End Function 稼働しません すみません 宜しくお願い致します (ついでながら ここで でてくるb というのは テーブル table3 の IDの総和 すなわち SELECT Count(table3.ID) AS b FROM table3; 要は table3の最後のレコードの次のレコードの 番号の数値を table2のIDに移動したい というわけであります) (いずれのIDや bについても 数値型 長整数型 重複あり です)

  • EXCELでSQL構文利用の方法

    EXCEL-VBAで、WHERE文での、コンボボックスの値の取得方法がよく分かりません。回答集に似たような質問がありましたが、基礎が無い為、前に進めません。都合のよい事を申しますが教えてください。 Sub テスト2( ) Dim objcon As ADODB.Connection Dim objrs As ADODB.Recordset Dim i As Integer Set objcon = New ADODB.Connection Set objrs = New ADODB.Recordset objcon.Open _ "Provider=Microsoft.Jet.OLEDB.4.0;" & _ "Data Source=" & ThisWorkbook.Path & "\process.mdb" With objrs .ActiveConnection = objcon .Source = "select * from 002顧客名 where 県名 = Worksheets[sheet1!].ComboBox1.Text;" 'コンボボックスの値の取得ができません .Open End With For i = 1 To objrs.Fields.Count Cells(1, i).Value = objrs.Fields(i - 1).name Next Range("a30").CopyFromRecordset objrs objrs.Close objcon.Close End With これ以下で、変数宣言するには、何が足りないのか教えてください objcon.Open _ "Provider=Microsoft.Jet.OLEDB.4.0;" & _ "Data Source=" & ThisWorkbook.Path & "\process.mdb" Dim name As Variant name = Worksheets("sheet1").ComboBox1.Text With objrs .ActiveConnection = objcon .Source = "select * from 002顧客名 where 県名 = name;" .Open End With 以上、なにとぞご指示をお願いします。

  • ACCESS VBA 2つのテーブルから抽出

    ACCESS VBA初心者です 見よう見まねで作成してみたのですが、デバックになってしまい先に進めません どなたか、どこがどう違うのか教えてください テーブル1とテーブル2の15項目ほどをぶつけて 一致しないレコードを抽出し、その抽出したレコードを既存のテーブル3にコピーをしたいのですが、その方法がわかりません Sub QQ() Dim DB As DAO.Database Set DB = CurrentDb() DB.Execute "DELETE * FROM テーブル3;" Dim strSQL As String strSQL = "INSERT INTO テーブル3 ( AAA, BBB, CCC, DDD, EEE, FFF, GGG, HHH, III, JJJ ) " strSQL = strSQL & " SELECT テーブル1.AAA, テーブル1.BBB, テーブル1.CCC, テーブル1.DDD, テーブル1.EEE, テーブル1.FFF, テーブル1.GGG, テーブル1.HHH, テーブル1.III, テーブル1.JJJ, FROM AAA;" DB.Execute strSQL Dim TB_テーブル2 As DAO.Recordset Dim TB_テーブル3 As DAO.Recordset Set TB_テーブル2 = DB.OpenRecordset("Select * from テーブル2;") While TB_テーブル2.EOF = False Debug.Print TB_テーブル2![AAA] Debug.Print TB_テーブル2![BBB] Debug.Print TB_テーブル2![CCC] Debug.Print TB_テーブル2![DDD] Debug.Print TB_テーブル2![EEE] Debug.Print TB_テーブル2![FFF] Debug.Print TB_テーブル2![GGG] Debug.Print TB_テーブル2![HHH] Debug.Print TB_テーブル2![III] Debug.Print TB_テーブル2![JJJ] strSQL = "SELECT テープ3.* FROM テーブル3 " strSQL = strSQL & "WHERE (((テーブル3.AAA)='" & TB_テーブル2![AAA] & "') " ←デバックヵ所 strSQL = strSQL & " AND ((テーブル3.BBB)='" & TB_テーブル2![BBB] & "') " strSQL = strSQL & " AND ((テーブル3.CCC)='" & TB_テーブル2![CCC] & "') " strSQL = strSQL & " AND ((テーブル3.DDD)='" & TB_テーブル2![DDD] & "') " strSQL = strSQL & " AND ((テーブル3.EEE)='" & TB_テーブル2![EEE] & "') " strSQL = strSQL & " AND ((テーブル3.FFF)='" & TB_テーブル2![FFF] & "') " strSQL = strSQL & " AND ((テーブル3.GGG)='" & TB_テーブル2![GGG] & "') " strSQL = strSQL & " AND ((テーブル3.HHH)='" & TB_テーブル2![HHH] & "') " strSQL = strSQL & " AND ((テーブル3.III)='" & TB_テーブル2![III] & "') " strSQL = strSQL & " AND ((テーブル3.JJJ)=" & TB_テーブル2![JJJ] & "));" Set TB_テーブル3 = DB.OpenRecordset(strSQL) Debug.Print "COUNT=" & TB_テーブル3.RecordCount If TB_CCC.RecordCount > 0 Then Debug.Print "削除" TB_テーブル3.Delete Else Debug.Print "追加" TB_テーブル3.AddNew TB_テーブル3![AAA] = TB_テーブル2![AAA] TB_テーブル3![BBB] = TB_テーブル2![BBB] TB_テーブル3.Update End If TB_テーブル3.Close TB_テーブル2.MoveNext Wend TB_テーブル2.Close DB.Close End Sub

  • access2007 VBA データの抽出SQLがわかりません。

    access2007 VBA データの抽出SQLがわかりません。 下記のように記述しているのですが、Aテーブルから必要なデータが抽出できません。どなたかご教授いただけますか。 ※ 「Me.txtSEQ前.Value」「Me.txtSEQ後.Value」はテキストコントロールです。プロパティでの書式設定は何もしていません。 ========================================= Dim intSEQ前 As Long Dim intSEQ後 As Long 'テキストコントロールなので、数値型にする。 '分かりやすくするために、ここで定義しています。 intSEQ前 = CLng(Me.txtSEQ前.Value) intSEQ後 = CLng(Me.txtSEQ後.Value) 'データを抽出します 'intSEQ前からintSEQ後に入力された数値を抽出する。 strSQL = "SELECT " strSQL = strSQL & "* " strSQL = strSQL & "FROM Aテーブル " strSQL = strSQL & "WHERE 県コード=1 " strSQL = strSQL & "AND (SEQ >= intSEQ前 OR SEQ <= intSEQ後) " strSQL = strSQL & "ORDER BY SEQ " Set objRs = myDB.OpenRecordset(strSQL, dbOpenSnapshot) ※下記をコメントアウトするとデータは正しく抽出されているようです。 strSQL = strSQL & "AND (SEQ >= intSEQ前 OR SEQ <= intSEQ後) " 以上。よろしくお願い致します。

  • Access2000のVBAについて

    下記のプログラムだと挿入が可能になります。 Private Sub 削除_コマンド_Click() If IsNull(Me.社員コード) Then MsgBox ("社員コードが入力されていません") Else Dim strSQL As String strSQL = "INSERT INTO 社員情報テーブル(社員コード,作成日) " _ & " VALUES ('" & Me.社員コード & "', now());" DoCmd.RunSQL strSQL End If End Sub しかし、下記のプログラムだとinsert文の『Me.社員コード』で エラーが発生します。 エラーメッセージは 『メソッドまたはデータメンバが見つかりません』 と表示されます。 上と下とどう違うのでしょうか。 Private Sub 削除_コマンド_Click() If IsNull(Me.社員コード) Then MsgBox ("社員コードが入力されていません") Else Dim strSQL As String strSQL = "INSERT INTO 社員情報テーブル(社員コード,氏名(氏),作成日) " _ & " VALUES ('" & Me.社員コード & "','" & Me.氏名(氏) & "', now());" DoCmd.RunSQL strSQL End If End Sub

  • Visual Basic SQL INSERT ADO

    VisualBasic6.0 を使用しています。 SQLのINSERT文についての質問なのですが、 フォームのテキストに記入された内容を新規のレコードとしてデータベースに登録する場合、どのようなプログラムを組めばよいのでしょうか? 下記のように組んでみたのですが、エラー(実行時エラー'-2147217904(80040e10)':一つ以上の必要なパラメータの値が設定されていません)がでてしまいます。 以下のプログラムでは、 Form4の.Text1~7にユーザーが記入した情報をデータベースのM_USERというテーブルの新レコードとして追加しようとしています。 Private Sub Command1_Click() Dim objcon As ADODB.Connection Dim objrec As ADODB.Recordset Dim strConnectString As String Dim strMDBFilePath As String Dim strSQL As String strMDBFilePath = "C:\Documents and Settings\Watanabe Ryota\デスクトップ\新ダイエット\diet.mdb" strConnectString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & strMDBFilePath & ";" Set objcon = New ADODB.Connection objcon.Open strConnectString strSQL = "INSERT INTO M_USER(U_ID,U_NAME,U_PASS,U_SIZES1,U_SIZES2,U_CAL,U_IKIGOMI) VALUES(Form4.Text1,Form4.Text2,Form4.Text3,Form4.Text4,Form4.Text5,Form4.Text6,Form4.Text7)" Set objrec = objcon.Execute(strSQL) End Sub おねがいします。

専門家に質問してみよう