Access VBAでSQL文実行時にエラーが発生する原因とは?

このQ&Aのポイント
  • Access VBAの組み立てたSQL文を実行し、movelastするとエラーになります。エラー番号:3071
  • SQLは、対象のテーブルよりキーを指定して抽出していますが、そのテーブルにキーが2種類以上存在するとエラーになってしまいます。
  • テーブルのフィールドは全てテキスト型です。
回答を見る
  • ベストアンサー

access VBA

組み立てたSQL文を実行し、movelastするとエラーになります。 エラー番号:3071 SQLは、対象のテーブルよりキーを指定して抽出していますが、 そのテーブルにキーが2種類以上存在するとエラーになってしまいます。 なにが原因なのでしょうか。 STR_sql = "" STR_sql = STR_sql & " SELECT Mid([CM_KEY],2,2) AS A " & vbCrLf STR_sql = STR_sql & " , Mid(StrConv([NAIYO],8),31,3) AS B " & vbCrLf STR_sql = STR_sql & " FROM C_table " & vbCrLf STR_sql = STR_sql & "WHERE (((Left([CM_KEY],1))='K') " & vbCrLf STR_sql = STR_sql & " AND ((Len(Trim([CM_KEY])))=3)) " & vbCrLf STR_sql = STR_sql & " AND ((Mid(StrConv([NAIYO],8),45,8) <= " & STR_st_ymd & ")) " & vbCrLf STR_sql = STR_sql & " AND ((Mid(StrConv([NAIYO],8),53,8) >= " & STR_ed_ymd & ")); " & vbCrLf ※テーブルのフィールドは全てテキスト型です。

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

  • ベストアンサー
回答No.1

 こういう時は、段階を追ってSQL文を完成させるべきです。「急がば回れ!」と言うことです。で、私は、添付図のように4つの段階を追ってSQL文を完成させています。 >そのテーブルにキーが2種類以上存在するとエラーになってしまいます。  エラーにはなりませんでしたよ。 PS、ヌル対策はしておいたが吉! X Len([xxx])=3) O Len([xxx] & "")=3) Microsoftは下のを例示しれいる筈です。

mimi0106
質問者

お礼

ご回答ありがとうございました。 データの文字型が原因で、ダブルコーテーションをつけたら正常に動作しました。 SQLを分解して実行することで、原因を特定することができました。ありがとうございました。

関連するQ&A

  • SQL 条件付きDELETE文について

    SQLを見よう見まねでいじることになりました。。 AテーブルからBテーブルの以下の条件が当てはまるデータを削除する SQLを作りたいと考えています。  (1)Bテーブルの『DAT_FLG』が1  (2)A.テーブル『KNR_NO』 と Bテーブル『KNR_NO』が同じ  (3)Aテーブル『STR_YMD』 と Bテーブル『STR_YMD』が同じ  (4)Aテーブル『END_YMD』 と Bテーブル『END_YMD』が同じ 以下のようなSQLを考えましたがエラーとなってしまいました。 DELETE FROM A JOIN B ON A.KNR_NO = B.KNR_NO and A.STR_YMD = B.STR_YMD and A.END_YMD = B.END_YMD B.DAT_FLG = '1' DBはoracleを使っています。 どなたか教えてください。

  • Access 2000 VBA リンクテーブル

    Access 2000 VBAでシステム開発を行っております。 Oracle 7 と接続してリンクテーブルを作成しています。 通常は問題なく動作するのですが、 Access のフォーム上にボタンを配置して、あるボタンがクリックされたら、 リンクテーブルの参照先を変更して、リンクテーブルを再作成するといったことを 行おうと考えております。 しかし、ソース上でリンクテーブルの参照先を変更しても、 元の参照先でリンクテーブルが作成されてしまい、大変困っております。 どなたか本現象について分かられる方がいらっしゃいましたらご回答のほど 宜しくお願いいたします。 以下がリンクテーブル作成時のソースになります。 Function Create_odbc_table(str_OraTblName As String, str_mdbTblName As String) As Long On Error GoTo Create_odbc_table_Err Create_odbc_table = True Set DBS = CurrentDb DBS.TableDefs.Delete Trim(str_mdbTblName) DBS.TableDefs.Refresh Set tdfA = DBS.CreateTableDef(Trim(str_mdbTblName)) tdfA.Connect = "ODBC;DSN=" & DSN_NAME & ";UID=" & Oracle_UID & ";DBQ= " & Trim(TNS) & ";ASY=OFF;PWD=" & Oracle_PWD & ";TABLE=" & Trim(str_OraTblName) tdfA.SourceTableName = Trim(str_mdbTblName) DBS.TableDefs.Append tdfA DBS.Close end function

  • ADODBを使用してAccessのテーブルを操作する

    お世話になります。さっそくですが、質問です。 VB.NET 2008において、ADODBを使用して Microsoft AccessのテーブルにデータをINSERTしたいのですが、 トランザクション開始時に以下のエラーが発生します。 ----------------------------------------------------------- COMExceptionが発生しました。 {"オブジェクトが閉じている場合は、操作は許可されません。"} ----------------------------------------------------------- トランザクション開始前後の処理を以下に記します。 ----------------------------------------------------------- Private Function fcInsert_testTable(ByVal buff() As String) As Boolean '変数宣言 Dim _Connection As New ADODB.Connection Try 'トランザクションの開始 _Connection.BeginTrans() /* ←ここでエラー */ 'SQL文の作成 sql.Length = 0 sql.Append(" INSERT INTO ○○マスタ " & vbCrLf) sql.Append(" (項目1 " & vbCrLf) sql.Append(" ,項目2 " & vbCrLf) sql.Append(" ) " & vbCrLf) sql.Append(" VALUES ( " & vbCrLf) sql.Append(" NVL('" & buff(1) & "',' ')" & vbCrLf) sql.Append(" NVL('" & buff(2) & "',' ')" & vbCrLf) 'SQL文の発行 _Connection.Excecute(sql.ToString) ----------------------------------------------------------- 本現象の原因について、どなたかご存知の方がいらっしゃいましたら、 ご教授願えますでしょうか?

  • 【ASP.NET】MySQLのテーブルレコードの検索結果について

    お世話になります。ASP.NETおよびMySQLに関する質問です。 現在、ASP.NETで開発をおこなっております。 データベースにはMySQLを使用しており、以下の内容でSELECT文を 発行してテーブルレコードを取得しております。 ------------------------------------------------------ Private Function fcSelect_Table As DataTable Dim dt As New DataTable 'DB接続文字列の設定 Dim connectionString As String connectionString = "server=localhost;database=db01;user id=xxx; password=xxx;" 'DB接続 Dim _Connection As New MySqlConnection(connectionString) _Connection.Open() Dim cmd As MySqlCommand = _Connection.CreateCommand() Dim dr As MySqlDataReader = Nothing Try 'SQL文の作成 sql.Length = 0 'SELECT sql.Append(" SELECT " & vbCrLf) sql.Append(" ,AFFI_CODE " & vbCrLf) sql.Append(" ,REGIST_NUM " & vbCrLf) sql.Append(" ,KIND " & vbCrLf) 'FROM sql.Append(" FROM TBL_TEST " & vbCrLf) 'WHERE sql.Append(" WHERE " & vbCrLf) sql.Append(" AND AFFI_CODE = '" & Trim(tfx_所属.Text) & "'" & vbCrLf) sql.Append(" AND REGIST_NUM = '" & Trim(tfn_登録番号.Text) & "'" & vbCrLf) sql.Append(" AND KIND = '" & DropDownList_種別.SelectedIndex & "'" & vbCrLf) 'MySQLCommand作成 cmd.CommandText = sql.ToString 'SQL文実行 dr = cmd.ExecuteReader()       // 正常処理されることを確認済 // ここにDataTable型オブジェクトdt にdrの内容を格納する処理が必要? Catch ex As Exception End Try Return dt End Function ------------------------------------------------------ 上記で取得した結果をDataTableに格納し、それを画面に表示させたいのですが、DataTableへの格納方法がわかりません。 どなたかご教授いただけないでしょうか?

  • AccessVBAのADOでのコーディングにて

     AccessVBAにて、ADOでコーディングをしようとしております。  久方ぶりのコーディングとなっており、かなり古い知識しか持ち合わせていないのですが、下記の様相でUpdate機能を書きましたが、これとは別にopenメソッドを使用した方法がADOではありますが、一体何が異なるのでしょうか?。  共にレコードロックする仕組みなようですが、ロックのタイミングが異なるのでしょうか?。 ********************** Set ct = Application.CurrentProject.Connection ct.BeginTrans str_Sql = "UPDATE テーブル1 SET " str_Sql = str_Sql + "テーブル1.ポジション名 = '" & Trim(txt_ポジション名) & "'," If Trim(txt_備考) = "" Or IsNull(txt_備考) = True Then str_Sql = str_Sql + "テーブル1.備考 = ''" Else str_Sql = str_Sql + "テーブル1.備考 = '" & Trim(txt_備考) & "'" End If str_Sql = str_Sql + " WHERE (((テーブル1.ポジションコード)='" & Trim(txt_ポジションコード) & "'));" ct.Execute str_Sql 'この後にロック開始 ct.CommitTrans 'この後にロック解除 ct.Close Set ct = Nothing ************************  上記でUpdateはできております。  ちなみに環境ですが、Access2010、Windows7です。    よろしくお願いします。

  • ACCESSのVBAのSQLを教えてください。

    テーブル1とテーブル2があり、それをUNIONで結合して、リンクさせたOracleのテーブルキーと 結合し、Oracleのテーブルにないキーを検索したいのですが、うまく出来ません。 ACCESSのVBAで作りたいのですが・・どうかご教授願います。 構成  テーブル1   項目名  Key 顧客コード1   名前 テーブル2     項目名   Key 顧客コード1   Key 顧客コード2      名前 Oracleのテーブル  テーブルB     項目名  Key 管理コード  テーブル1の顧客コード1とテーブル2の顧客コード2をUNIONでまとめたものをA1としA1.顧客コードとします それとOracleのテーブルであるテーブルBの管理コードと結合して テーブルBにないA1の顧客コードを抽出するSQL文を作成したいと思います。 (管理コード,顧客コード1,顧客コード2は同じ属性、同じ桁数) SELECT A1.管理コード FROM ( SELECT T1.顧客コード1 as 顧客コード FROM テーブル1 T1 UNION SELECT T2.顧客コード2 as 顧客コード FROM テーブル2 T2 )A1, テーブルB WHERE A1.顧客コード = テーブルB.管理コード AND テーブルB.管理コード IS NULL; エラーにはなりませんが、実行結果は、管理コード 0件です。データ的には、テーブルB側にはテーブル1にはあるがテーブルB側にないデータはあります。

  • DLLを作成してVBAから使用する方法は?

    Visual Basic 2005 Express EditionでDLLを作成して,エクセルVBAから使用する方法を教えてください。 DLLで提供する関数は,仮に Public Function TRIM2(ByVal str1 As String) As String TRIM2 = trim(str1) End Function とします。 DLLの作り方とエクセルVBAでの利用のやり方が判りません。 一応,DLLらしきものを作りエクセルVBAから参照を試みましたが,「指定されたファイルへの参照は登録できません。」というエラーになります。

  • アクセス2010のVBAについて教えて下さい

    前回<http://okwave.jp/qa/q8035701.html>で2つのエラーを解消していただきましたが、新たにDoCmd.SendObject acSendNoObject, , acFormatTXT, RS!Email, "aaa@aaa.mil", , Subject, Body, TrueSetで「2498指定した式はいずれかの引数とデータ型が対応してません」というエラーで止まってしまいました。 「RS!Email」を消すと、メールを生成するので、ここが違っているのは分かりましたが、どう直せばいいのかがわかりません。。「Email」のデータ型はテキスト型になっています。、ハイパーリンク型も試しましたがダメでした。さらに記述を「RS![Email]」としてみましたが、それもダメでした。。 どうぞよろしくお願いします。 Private Sub EmailReminder_Click() Dim DB As DAO.Database Dim QD As DAO.QueryDef Dim RS As DAO.Recordset Dim Subject As String Dim Body As String Subject = "Audit Corrective Actions" Body = "Good Morning Sir/Ma'am," & vbCrLf _ & "This is an auto generated email." & vbCrLf _ & "Please advise when these actions are completed. If you have any questions please feel free to contact our office. Thank you for your help and cooperation in this matter. Have a nice day." & vbCrLf & vbCrLf _ & "Corrective Actions:" & vbCrLf _ Set DB = CurrentDb() Set QD = DB.QueryDefs("ReminderQuery") With QD .Parameters("[Forms]![fmReport]![ReportID]") = Forms!fmReport!ReportID Set RS = .OpenRecordset Do Until RS.EOF Body = Body & "------------------------------------------------------" & vbCrLf _ & "[Due Date: " & RS!DueDate & "] [Agency: " & RS!Agency & "] [Report: " & RS!ReportNumber & "]" & vbCrLf _ & "Corrective Action: " & RS!CorrectiveAction & vbCrLf _ & "Recommendation: " & RS!Recommendation & vbCrLf RS.MoveNext Loop DoCmd.SendObject acSendNoObject, , acFormatTXT, RS!Email, "aaa@aaa.mil", , Subject, Body, True .Close End With End Sub

  • VBAエクセルシートの値をIN句

    いつもお世話になっております。 エクセルで、オラクルDBから、特定の商品の販売数を取得するVBAを作ったのですが、集計したい商品がまれに変更になります。 出来れば、エクセルシート「抽出リスト(仮名)」のリストの値を抽出できるようにするにはどういったSQLを書けばよいでしょうか? 【テーブル構成(FRT_ITEM)】 ITM000:取消フラグ ITM050:販売日 ITM150:科目CD ITM160:科目名(商品名) ITM200:販売数量 現在のSQL文 stSQL = "SELECT " & vbCrLf stSQL = stSQL & "ITM050 AS 販売日," & vbCrLf stSQL = stSQL & "ITM150 AS 科目CD," & vbCrLf stSQL = stSQL & "ITM160 AS 科目名," & vbCrLf stSQL = stSQL & "SUM(ITM200)AS 個数" & vbCrLf stSQL = stSQL & "FROM FRT_ITEM" & vbCrLf  ’キャンセルフラグ除外 stSQL = stSQL & "WHERE ITM000 = 0" & vbCrLf ↓ここから科目CDによって商品抽出 '商品Aグループ stSQL = stSQL & "AND ITM050 = '" & DT & "'" & vbCrLf stSQL = stSQL & "AND ITM150 BETWEEN '1600' AND '1610'" & vbCrLf '商品B stSQL = stSQL & "OR ITM050 = '" & DT & "'" & vbCrLf ↑ ここまで stSQL = stSQL & "AND ITM150 BETWEEN '1521' AND '1521'" & vbCrLf stSQL = stSQL & "GROUP BY ITM050,ITM150,ITM160" & vbCrLf stSQL = stSQL & "ORDER BY ITM050,ITM150,ITM160" ※変数DT:販売日 この状態だと、抽出する商品が変わるごとに、SQL文を修正する必要があるため、別シート「抽出リスト(仮名)」に抽出する商品CD一覧を記載し抽出出来ないかと考えております。 多分、IN句を使い、抽出リストシートを呼べれば良いのではと考えておりますが、書き方が分かりません。 ※商品の数は、最大30種類程度となります。 また、テーブル(FRT_ITEM)は500万レコード以上あるため、IN句をつかってのテーブル総なめ抽出はDBへの負荷が心配です。 アドバイスを頂けましたら幸いです。

  • アクセスVBA 変数での抽出条件の書きかた

    顧客データテーブルからの抽出です。 変数を使った書き方がわかりません。 よろしくお願いします。 テーブルのレコードには [氏名]:鈴木 [telnum]:0123456789 が存在します。 Private Sub テキスト0_BeforeUpdate(Cancel As Integer) Dim db As DAO.Database Dim rs As DAO.Recordset Set db = CurrentDb Set rs = db.OpenRecordset("顧客マスタ", dbOpenDynaset) Dim str As String str = "0123456789" rs.Filter = "[telnum] = ' " & str & " ' " Set rs = rs.OpenRecordset MsgBox (rs!氏名) ’←エラーメッセージ”カレントレコードがありません。”が出ます End Sub

専門家に質問してみよう