VBAでAccessのパラメータクエリを実行する方法

このQ&Aのポイント
  • Access2007でのPG開発を行っている際に、VBAを使用してパラメータクエリを実行する方法について質問です。
  • Insertのパラメータクエリを作成し、VBA側でパラメータをセットして実行するとエラーが出てしまいます。具体的には、実行時エラー3265が発生し、要求された名前、またはオブジェクトが見つかりませんというエラーメッセージが表示されます。
  • ADODB.Commandをあまり使ったことがなく、エラーの原因や対処方法が分からない状況です。今まではSELECTやINSERT、UPDATE文をdbCon.Execute(strSQL)で実行していました。エラーの対処方法についてご教授いただけると助かります。
回答を見る
  • ベストアンサー

Access パラメータクエリーをVBAで実行

初めての質問になります、宜しくお願いします。 Access2007でのPG開発を行っています。 Insertのパラメータクエリーを作成してました(以下Q_Inst)。 VBA側でパラメータをセットして実行するとエラーが出てしまいます。 実行時エラー3265 要求された名前、または・・・ dbCmd.CommandText = "Q_Inst" dbCmd.CommandType = adCmdStoredProc dbCmd.Parameters.Refresh dbCmd.Parameters("[ID]") = 1 ' ←ここでエラー dbCmd.Parameters("[Name]") = TanakaTarou dbCmd.Parameters("[Birth]") = "1980/12/01" ADODB.Command をあまり使わないので勝手がいまいち分かりません。 SELECT、INSERT、UPDATEは今までdbCon.Execute(strSQL)でstrSQLの中にべた書きしてました。 エラーの対処方法をご教授お願い致しますm( _ _ )m

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

  • ベストアンサー
  • piroin654
  • ベストアンサー率75% (692/917)
回答No.6

以下もみてください。 ADOでのパラメータクエリの使用例 http://www.accessclub.jp/ado/createparameter.html http://www.accessclub.jp/ado/refresh.html

kazuya-1980
質問者

お礼

ありがとうございます。 どのパターンも試してみたのですが 同じエラーで跳ね返されてしまうので VBE側でINSERT分をコツコツ書くことにしました。

その他の回答 (5)

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.5

No3の続きで、 >dbCmd.Parameters.Refresh これをコメントアウトしてみてください。

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

ローカルでの話になりますが、 > dbCmd.Parameters.Refresh この前に、 dbCmd.ActiveConnection = CurrentProject.Connection のような記述が必要かと思います。 ローカルの場合でも、上記をコメントにすると、 値を設定しようとした際に 3265 のエラーとなります。 また、dbCmd.Parameters で指定される文字列を一度確認されてみてはいかがでしょうか。   Dim prm As ADODB.Parameter を宣言しておいて、Refresh 後に   For Each prm In dbCmd.Parameters     Debug.Print prm.Name   Next 余談) クエリの抽出条件に ・・・ WHERE ID = [DAT1] ・・・ のように、 [DAT1] をパラメータにしている時、 ADOでは、dbCmd.Parameters("[DAT1]") = 1 のように記述します。 dbCmd.Parameters("DAT1") = 1 ではまた 3265 のエラーになったと思います。 なお、DAO では、"[DAT1]" / "DAT1" どちらでも大丈夫みたいです。 ※ adCmdStoredProc は使ったことが無いので、 VBE 側のヘルプで adCmdStoredProc を検索され、 「Command を使ってストアド プロシージャを呼び出す」部分を参照してみてください

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.3

>dbCmd.CommandType = adCmdStoredProc を dbCmd.CommandType = adCmdText にしてみてください。 あるいは、上記に dbCmd.Prepared = True をついかしてみてください。

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.2

No1です。No1は他のパラメータの設定 も同様です。 >dbCmd.Parameters("[Name]") = TanakaTarou >dbCmd.Parameters("[Birth]") = "1980/12/01" たとえば、フィールドの順番が[ID]、[Name]、「Birth]ならば dbCmd.Parameters(1) = TanakaTarou dbCmd.Parameters(2) = "1980/12/01" あるいは、 dbCmd.Parameters("[Name]に設定したパラメータ名") = TanakaTarou dbCmd.Parameters("[Birth]に設定したパラメータ名") = "1980/12/01"

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.1

>dbCmd.Parameters("[ID]") = 1 ' ←ここでエラー において、 dbCmd.Parameters("パラメータクエリで設定しているパラメータ名") = 1 で、フィールド名を書き入れるのではありません。 たとえば、IDに[AAA]と設定しているならば、 dbCmd.Parameters("AAA") = 1 あるいは、フィールドが0から始まるので、 IDが一番最初のフィールドならば、 dbCmd.Parameters(0) = 1 のようにして設定します。

kazuya-1980
質問者

お礼

ご返答ありがとうございます。 dbCmd.Parameters(0) = 1 でも同じエラーがでます。 [ ]の中はフィールド名ではなく、クエリー内のパラメータで宣言した名前にしてあります。 dbCmdのParameters Countが0になっているのは関係ありますか・・・?

関連するQ&A

  • ACCESSでパススルークエリにパラメータを使用したい

    毎度お世話になっております。 WindowsXP、Access2003、SQLServer2000を使用しております。 ADOでSQLServerからデータを抽出したいのですが、 パラメータを使用したいと考えております。  SELECT CODE FROM テーブル1  WHERE CODE = ? とし  adoCmd.CommandTimeout = 0  With adoCmd   .CommandText = strSQL   .CommandType = adCmdUnknown   .Prepared = False   .Parameters.Refresh  End With  adoCmd.Parameters(0).Value = InputBox(Trim(strBuf))  Set adoSet = adoCmd.Execute とすることで動作しました。 しかしSQL文を下記に変更したところエラーになりました。  SELECT t1.CODE FROM  (SELECT CODE FROM テーブル1 WHERE CODE = ? ) as t1  LEFT JOIN  (SELECT CODE FROM テーブル2 WHERE CODE = ? ) as t2  ON t1.CODE = t2.CODE のようにすると、  .Parameters.Refresh の部分で 実行時エラー -21474672595(80004005) 構文エラーまたはアクセス違反です。 となってしまいました。 2つの?の内、片方を定数に、片方を?にしてもエラーになりました。 ?を両方とも定数にすれば実行できました。 JOIN句がある場合に?を使ってはいけないのでしょうか。 何がエラーの原因かわからない状態です。 ご教授お願いいたします。

  • ADOでパラメタクエリを実行する方法で混乱してます。

    VBからACCESSのクエリを実行したいのですが、 うまくいきません。 1:cmd.Properties("Jet OLEDB:Stored Query") = True←?? 2:cmd.CommandText = "qryKokyaku_UPD"←クエリをセット 3:cmd.Parameters(0).Value = txt.Text←パラメタセット 4:cmd.Execute (cmdはADODB.COMMANDオブジェクトです) 上記のコードでクエリを実行できますが、1行目の 意味が全然分かりません。1行目を除くと、パラメタをセットする(2行目)でエラーがでます。(SQLステートメントが正しくありません)なぜか分かるかた居られましたら、アドバイスお願いします! 分からないまま使用するのはいやなので現在は 1:cmd.CommandText = "qryKokyaku_UPD"←クエリをセット 2:cmd.Execute ,Array(パラメタ1,パラメタ2) という感じで作っています。 しかし、この方法では更新クエリを実行しても、更新したり、しなかったり、(ほとんど更新してくれない)です。 ですが、Executeはエラーなく通ります。 ADD、デリート等のクエリは問題ないのですが。 現在の状況はこんな感じです。 『cmd.Properties("Jet OLEDB:Stored Query") = True』 が何を意味しているのか理解できれば、無事解決です! アドバイスよろしくお願いします。 かなり低レベルな質問かもしれませんが。

  • ACCESS VBAについて

    初歩的な質問かと思いますが、よろしくお願いします。 strSQL = "SELECT shain_cd,shime_ym FROM 社員マスター" strSQL = strSQL & " WHERE shain_cd = '" & work_shain_cd & "'" strSQL = strSQL & " AND shime_ym = '" & Me.shime_ym & "'" Set cn = CurrentProject.Connection Set rs = New ADODB.Recordset rs.Open strSQL, cn, adOpenKeyset, adLockOptimistic 上記を実行したところ、最終行にて エラーメッセージ: 「1つ以上の必要なパラメータの値が設定されていません。」 となります。 何が問題でしょうか? ※質問文に不足があれば、補足欄にて追記させていただきます。

  • 【Access2003】クエリで動作するSQLがVBAで動作せず困っています。

    下記のソースを実行したところ、「パラメータが少なすぎます。2を指定してください。」というエラーが表示されました。 エラーが発生する箇所は「db.Execute strsql」です。 しかし、このstrsqlに書かれているSQL文をクエリで実行した所、問題なく動作しました。 なんとなく、クエリでは書けるものの、VBAでは書きない所があるのかなと思ったのですが、どのように修正すればよいか分かりませんでした。 その為、上記の現象について、ご教示いただける方がいらっしゃいましたら、よろしくお願いします。 【VBA】 Private Sub btn_Click() Dim db As DAO.Database Dim ws As DAO.Workspace Dim str As String Set ws = DBEngine.Workspaces(0) Set db = CurrentDb ' トランザクション開始 ws.BeginTrans strsql = "INSERT INTO T_W ( W_DAY )" strsql = strsql & "SELECT T_M.M_DAY" strsql = strsql & " FROM T_M" strsql = strsql & " WHERE (((Left([T_M].[M_DAY],4) & Mid([T_M].[M_DAY],6,2) & Right([T_M].[M_DAY],2))" strsql = strsql & " Between IIf(Nz([Forms]![F_1]![text_str])='',0,[Forms]![F_1]![text_end])" strsql = strsql & " And IIf(Nz([Forms]![F_1]![text_str])='',99999999,[Forms]![F_1]![text_end])))" strsql = strsql & " ORDER BY T_M.M_DAY" db.Execute strsql ws.CommitTrans End Sub 【フォーム:F_1】 テキストボックス:text_str テキストボックス:text_end コマンドボタン:btn 【データベース:T_M】 フィールド名:M_DAY    値  :2001/01/01    値  :2001/01/02    値  :2001/01/03 (以下略) 【データベース:T_W】 フィールド名:W_DAY    値  :なし よろしくお願いします。

  • <>&などを保存する方法をおしえてください。

    <>&などを保存する方法をおしえてください。 NameTextBox CommentTextBox 保存ボタン があり保存ボタンを押すと 下記コードが実行されるようにしました。 これで、保存はできるようになったのですが <>&などを使用するとエラーとなってしまします。 <>&を使用するにはどのようにしたらいいのでしょうか? 教えてください。 Dim strSQL As String = "INSERT INTO tableA (Name,Comment) VALUES (@Name,@Comment)" Using con As New SqlConnection(conStr) Dim command As New SqlCommand(strSQL, con) con.Open() Using cmd1 As SqlDataReader = con.CreateCommand() cmd1.CommandType = CommandType.Text Try with cmd1 .Parameters.Add("@Name", SqlDbType.NVarChar) .Parameters.Add("@Comment", SqlDbType.NVarChar) .Parameters("@Name").Value = NameTextBox .Parameters("@Comment").Value = CommentTextBox End With cmd1.CommandText = strSQL cmd1.ExecuteNonQuery() Catch er As Exception Finally con.Close() Catch ex As Exception Finally con.Close() End Try End Using End Using

  • 実行時エラー3061 パラメーターが少なすぎます

    顧客情報を入力したフォームで顧客情報を入力した際 実行時エラー3061 パラメーターが少なすぎます。 1を指定してください。 と表示されましたが、これはどう処理すればよろしいでしょうか? デバックを表示で Set Rst = CurrentDb.OpenRecordset(strSQL) が黄色くなりました。 Access2010を使用しています。 よろしくお願い致します。

  • DataAdapter使用時のパラメータ設定について

    SQL文に@hogeのようにパラメータを指定して DataAdapterのFillを実行させようとしているのですが エラーでスカラ変数@hogeを宣言してくださいと出ます。 何かご存知の方が居ましたらご教授お願いいたします ソースは簡単に書くと '■SELECT文の設定 Command.CommandText = "SELECT 社員名 FROM 社員マスタ WHERE 社員番号 = @hoge" Command.Parameters.Add("@hoge", Data.SqlDbType.Int) Command.Parameters.Item("@hoge").Value = 10 '■DataAdapterのインスタンス生成 DataAdapter = New SqlClient.SqlDataAdapter(Command.CommandText, Connection) '■SQL実行 Adapter.Fill(dsSELECT)

  • ADOでアクセスからエクセルシートの件数を取得した

    ADOでアクセスからエクセルシートの件数を取得したいのですが、うまく行きません。 アクセスの標準モジュールに Sub ADO_TEST1() Const StrFileName = "D:\My Documents\検索.xls" Dim dbCon As ADODB.Connection Dim dbRes As ADODB.Recordset Dim i As Long Dim strSQL As String ' Connection生成 Set dbCon = New ADODB.Connection With dbCon .Provider = "Microsoft.Jet.OLEDB.4.0" .Properties("Extended Properties") = "Excel 8.0" .Open StrFileName End With ' SQL文作成 strSQL = "SELECT * FROM [Access接続用$];" Set dbRes = New ADODB.Recordset dbRes.Open strSQL, dbCon, adOpenDynamic, adLockOptimistic, adCmdText i = dbRes.RecordCount MsgBox "エクセルのAccess接続用シートの最終行は、" & i & "行です。" dbRes.Close: Set dbRes = Nothing dbCon.Close: Set dbCon = Nothing End Sub ************************************************************* を貼り付けて実行すると、エラーにはならないのですが-1が返ってきます。 実際の行は、200行あります。 ここで、エクセルの最終行を取得して、いづれエクセルのデータをアクセスのテーブルに転記したいのですが まずここで躓いてしまったので、 ・dbRes.RecordCountで、-1が返ってくる原因 ・エクセルの該当のシートの最終行の取得の仕方 をご教授ください。 ご回答よろしくお願いします。

  • Access 「パラメータが足りません」のエラー

    Access2003 初心者です、よろしくお願いします。 閲覧者に<form>の<textarea>から名前と性別とコメントを書いて実行してらうものを作っています。 コメント内容を受け取るPHPファイルで、AccessのデータベースにINSERTする際、  $sql = "INSERT INTO table ( 名前,性別,コメント ) VALUE ( '$name','$sex',\"$comment\" )"; としたら、「パラメータが足らない」のエラーがでました。 \"~\"は、Accessでは使えないのですか?コメントの中に ’ や” を使われ際、どのように逃げられますか?

  • ExcelVBAでACCESSのクエリに接続したい

    Excel、ACCESSの2003を使用しています。 Excelで、指定した期間の情報をmdb上よりExcel側に出力する処理を考えています。 mdbファイルの接続先がテーブルならうまく処理できます。 しかし今回の接続先がクエリの為か、処理を動かしてもエラーは出ないのですが値が無い扱いになっています。 mdbのテーブルにはリンクテーブルで2つのテーブルがあります。 クエリ側で2つのテーブルをリレーションしており、クエリで表示している内容をExcel側に返したいのです。 下記の処理はクエリに接続をしていないのでしょうか? Option Explicit Const cnsADO_CONNECT1 = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" Dim dbCon As New ADODB.Connection Dim dbRes As New ADODB.Recordset Dim dbCol As ADODB.Field Dim strSQL As String, strStartDate As String, strEndDate As String Dim lngGyo As Long, lngCol As Long Dim strRootPath As String, strFileName As String, strPath As String Dim intField As Integer, i As Integer, j As Integer Public Sub ACCESS接続() strRootPath = "\\11.111.11.1\00_テストフォルダ\"  'IPアドレスとフォルダ選択 strPath = "00_環境設定\01_テスト用\" 'パス先 strFileName "テスト.mdb" 'mdb名 dbCon.Open cnsADO_CONNECT1 & strRootPath & strPath & strFileName  'mdb接続 strStartDate = "#09/01/2014# AND " strEndDate = "#09/23/2014#)" '''''SQLビューの内容をそのまま''''' strSQL = "SELECT テーブルA.年月日, テーブルA.実績No., テーブルB.依頼数, テーブルA.略号, テーブルA.作成No., テーブルA.数値No., テーブルA.名称, テーブルA.CD, テーブルA.長さ, テーブルA.場所, テーブルA.フラグ, " strSQL = strSQL & "Format([年月日],""yyyy/mm/dd"") AS 作成年月日" strSQL = strSQL & vbNewLine & "FROM テーブルB INNER JOIN テーブルA ON テーブルB.依頼No.=テーブルA.実績No." strSQL = strSQL & vbNewLine & "WHERE (((テーブルA.年月日) Between " strSQL = strSQL & strStartDate strSQL = strSQL & strEndDate strSQL = strSQL & " AND ((テーブルA.CD) Not Like ""%KN%"") AND ((テーブルA.場所) Like ""*IO*"") AND ((テーブルA.フラグ) Is Null))" strSQL = strSQL & vbNewLine & "ORDER BY テーブルA.年月日;" '''''SQLビューの内容をそのまま''''' dbRes.Open strZisseki_SQL, dbCon, adOpenKeyset, adLockReadOnly 'レコードセット intField = dbRes.Fields.Count lngGyo = 1 dbRes.MoveFirst Do Until dbRes.EOF lngGyo = lngGyo + 1 lngCol = 0 For Each dbCol In dbRes.Fields lngCol = lngCol + 1 Cells(lngGyo, lngCol) = dbCol.Value Next dbCol dbRes.MoveNext Loop dbRes.Close: Set dbRes = Nothing End Sub