• ベストアンサー

【AccessVBA】レコードセットOpen時の引数について

AccessVBAで、以下のように記述して実行したらOpen時にエラーが出てしまいました。 エラーは、「SQLステートメントが正しくありません。'DELETE'、'INSERT'、'PROCEDURE'、'SELECT'、または'UPDATE'を使用してください。」というものでした。 Dim cn As ADODB.Connection Dim rs1 As ADODB.Recordset Set cn = CurrentProject.Connection Set rs1 = New ADODB.Recordset rs1.Open "Q_F_新規契約登録_定期取引ヘッダ内容抽出", cn, adOpenForwardOnly, adLockReadOnly いろいろと調べて、Open時の引数を一つ加えて、Openの行を以下のように書いたのですが、またエラーが出てしまいました。 エラーは、「一つ以上の必要なパラメータが設定されていません。」というものです。 rs1.Open "Q_F_新規契約登録_定期取引ヘッダ内容抽出", cn, adOpenForwardOnly, adLockReadOnly, adCmdTable この記述はどこが間違っているのでしょうか。 足りないパラメータとは、何のことなのか、教えていただけないでしょうか。

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

  • ベストアンサー
  • bonaron
  • ベストアンサー率64% (482/745)
回答No.2

VBA の記述には問題ありません。 問題があるのはクエリの記述です。 クエリ単独では正しく動作するんですよね。 この場合考えられるのは、 (1)パラメータクエリであること。 (2)抽出条件などで、フォームのコントロールを参照したものがあること などです。 (1)なら、「一つ以上の必要なパラメータが設定されていません。」というエラーメッセージでピンとくるでしょうから、この先(2)として話を進めます。 例として、クエリの[ID]フィールドに 抽出条件 [Forms]![フォーム名]![ID]が書かれているものとします。 標準モジュールにフォームの[ID]の値を返すプロシージャを作成します。 例えば   Public Function GetFormID() As Variant     GetFormID=[Forms]![フォーム名]![ID]   End Function クエリの抽出条件を   =GetFormID() とします。 DAO に限られますが、Qerydef の Parameter を使う方法もあります。

stolichnaya
質問者

お礼

ご回答を読み、さらにいろいろと調べて エラーを回避できました。 ありがとうございました。 根本的な原因は、私が「Openするクエリには条件指定が存在してはいけない」ということを知らなかったことです。 Openで指定しているクエリには、ご指摘の通りフォーム上のコントロールを抽出条件として設定していました。 ご回答ありがとうございました!

その他の回答 (1)

  • nekotaru
  • ベストアンサー率50% (22/44)
回答No.1

念のためですが、"Q_F_新規契約登録_定期取引ヘッダ内容抽出"が存在することを確認してください。 半角全角のチェックもしてください。

関連するQ&A

  • AccessVBAで「このフィールドに入力した値が正しくありません」というエラー

    以下のようなコードを書いて実行しているのですが、 下から5行目のところで 「このフィールドに入力した値が正しくありません」というエラーが出てしまいます。 いろいろと調べたのですが、原因が全く分かりません。 どこを直せばいいのか、 又は、どんなところを調べるべきか、知識のある方、教えていただけないでしょうか。 Private Sub cboF_新規契約登録_ヘッダ管理番号選択_Change() Dim cn As ADODB.Connection Dim rs1 As ADODB.Recordset Dim rs2 As ADODB.Recordset Dim MySQL As String '接続 Set cn = CurrentProject.Connection '定期取引ヘッダ レコードセット取得 Set rs1 = New ADODB.Recordset ' '画面上にデータをフィル 'SQL作成 MySQL = "select * from Q_F_新規契約登録_定期取引ヘッダ内容抽出" MySQL = MySQL & " where 会社コード = '" & [Forms]![F_TOP]![会社選択] & "'" MySQL = MySQL & " and ヘッダ管理番号 = " & Me!txtF_新規契約登録_ヘッダ管理番号 MySQL = MySQL & " and LOCAL_補助科目マスタ.科目コード = '3311'" 'Open rs1.Open MySQL, cn, adOpenStatic, adLockReadOnly rs1.Find "ヘッダ管理番号 = " & Val(txtF_新規契約登録_ヘッダ管理番号) 'フィル Me!txtF_新規契約登録_引落額 = rs1!引落額 '<=ここでエラー rs1.Close: Set rs1 = Nothing 'コネクションクローズ cn.Close: Set cn = Nothing End Sub

  • ADO 「Set」は使ったほうがいいのでしょうか?

    Sub test1() Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Set cn = New ADODB.Connection Set rs = New ADODB.Recordse End Sub Sub test2() Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset End Sub この二つは同じ意味ですか? 「Set」は使ったほうがいいのでしょうか? よろしくお願いします。

  • オープンしているレコードセットの中の最大値

    VB6でAccess2000です Dim RS As ADODB.Recordset Dim SQL,CN As String RS.Open SQL, CN, adOpenStatic という形で一度オープンしてしまったレコードセットにIDフィールドがあり、その最大値を取得したい場合、どのような方法を用いればいいのでしょうか?

  • ACCESSADOについて

    ACCESSでADO接続でEOFとBOFがともにTUREでうまく動作しません どなたか回避する方法を教えてください。 Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Set cn = CurrentProject.Connection Set rs = New ADODB.Recordset rs.Open "Q_発生原価合計", cn, adOpenForwardOnly, adLockReadOnly rs.MoveFirst Do Until rs.EOF Debug.Print rs!決算年月, rs!金額の合計, rs!科目CD rs.MoveNext Loop '終了 rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing クエリーにはデータは存在します。

  • ACCESS VBA

    ACCESSで検索フォームを作りたいと思っています。 VBAを使って行きたいと思うのですが、うまくいきません。 希望としては、該当するレコードのデータを抽出したいです。 よろしくお願いいたします。 ※現段階でのソースを書いてみました。 最終的に行いたい処理とは違うのですが、根本的に間違っているようなので簡略化しました。 /------------------------------------------------/ Private Sub コマンド1_Click() Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Dim sql As String '接続 Set cn = CurrentProject.Connection 'レコードセットを取得 Set rs = New ADODB.Recordset sql = "SELECT * FROM 従業員データ " & _ "WHERE 年齢=30" rs.Open sql, cn, adOpenDynamic, adLockReadOnly rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing End Sub /------------------------------------------------/

  • ADO 英語を含むレコードを抽出したい

    テーブルに保存されてるフィールド1の英語が含まれているレコード(ABC株式会社 など)を抽出したいのですが 方法がわかりません。 *[a-z]* を使うんだなと思いますが、フィルタのかけかたがわかりません。 Sub test() Dim CN As New ADODB.Connection Dim RS As New ADODB.Recordset CN.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & ファイル名 RS.Open "テーブル1", CN, adOpenStatic, adLockOptimistic RS.Filter = "フィールド1 = " '←ここをどうすればいいでしょうか? RS.Close: Set RS = Nothing CN.Close: Set CN = Nothing End Sub サンプルを作ってみたのですが ご教示頂けないでしょうか? よろしくお願い致します。

  • Access ADOについて質問です。

    Access ADOについて質問です。 以下コードでレコードセットを返す関数を使用しています。 動作的には問題ないのですが、標準モジュール内のレコードセットをClose及びNothingしていないのが気になります。 Private Sub Form_Open(Cancel As Integer) Dim rs2 As ADODB.Recordset Set rs2 = New ADODB.Recordset Set rs2 = CreateRecordSet("SELECT * FROM T_Standard;") Set Me.Recordset = rs2 rs2.Close: Set rs2 = Nothing end sub '標準モジュール Public Function CreateRecordSet(strSQL As String) As ADODB.Recordset Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Set cn = New ADODB.Connection cn.ConnectionString = "provider=Microsoft.Jet.OLEDB.4.0;" _ & "Data Source=O:\標準DB\StandardBackEnd.mdb" cn.Open Set rs = New ADODB.Recordset rs.Open strSQL, cn, adOpenStatic, adLockReadOnly Set CreateRecordSet = rs ' rs.Close: Set rs = Nothing   ←この部分 ' cn.Close: Set cn = Nothing   ←この部分 End Function 標準モジュール内ではCloseやNothingしなくてもメモリの開放は行われているのでしょうか? アドバイスよろしくお願いいたします。

  • ADONull以外のレコ-ドの件数を取得するには

    こんばんは。アクセス2007です。 フィールド1がnullになっているレコードがあり、 それをADOで抽出したいのですが、エラーになってしまいます。 コードは下記です。 ---------------------------------------------------------------- Option Compare Database Option Explicit Sub test() Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset Dim MyFileName As String MyFileName = CurrentProject.FullName cn.Open "Provider = Microsoft.ACE.OLEDB.12.0;" & "Data Source= " & MyFileName rs.Open "テーブル1", cn, adOpenForwardOnly, adLockOptimistic ' rs.Filter = "IsNull(フィールド1) = False" 'ダメ ' rs.Filter = "フィールド1 Is Not Null" 'ダメ MsgBox rs.RecordCount rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing End Sub ---------------------------------------------------------------- Filter の部分で、 「実行時エラー 3001 引数が間違った型、許容範囲外、又は競合していますとのエラーが発生します。」 になります。 null以外のレコードを読み取った後、addnewで追加していきたいので、 adLockReadOnlyは使わない方がいいですよね? ご回答よろしくお願いします。

  • ADO+ODBCでテーブルに接続する時のエラー

    VB6.0(SP6)から、ADOとODBCでMySQLに接続しました。 '-------------------------------------------- Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Dim strCn As String Set cn = New ADODB.Connection strCn = "dsn=MySQL;uid=user;pwd=" cn.CursorLocation = adUseClient cn.Open strCn Set rs = New ADODB.Recordset rs.Open "select * from tbl;", cn, adOpenDynamic, adLockPessimistic Set DataGrid1.DataSource = rs '-------------------------------------------- データグリッドコントロールにテーブルの内容を表示させようとしているのですが、rs.Openの行でエラーが出てしまいます。エラーメッセージは「複数ステップの操作でエラーが発生しました。各状態の値を確認してください」です。 SQL文を変えて試してみると、何故かデータ型がDECIMALのカラムが含まれているとエラーになります。 DECIMALだといけないかと思うと、挿入は問題なく出来ます。 cn.Execute "insert into tbl (id,decimal_clm) values (10,900);" ご存知の方がいらっしゃいましたら宜しくお願いします。

    • ベストアンサー
    • MySQL
  • ADOでRecordsetオブジェクトをレコードソースに設定したい

    Access2000を使っています。リンクテーブルを使わずに、ODBCで繋いだDBのテーブルをフォームのレコードソースにセットしたいのですが、可能でしょうか。 宜しくお願いします。 Private Sub FormNoKansu() Dim cn as New ADODB.Connection Dim rs as New ADODB.Recordset Dim strSql as String 'ODBCでサーバーに接続 cn.ConnectionString = "ODBCでMySQLに..." ... strSql = "SELECT * FROM ..." rs.Open strSql, cn 'ここに[rs]を入れられたらと思っています Me.Recordset = "" End Sub

専門家に質問してみよう