• ベストアンサー

アクセス2000(ADO)のレコード更新について

1件しかレコードがない[リスト連番T]テーブルのレコードを読みだして、(フィールド)リストNOをプラス1して更新したいです。 DOAが混ざっているのか、下記のようにエラーがでます。プラス1して更新する正しいプログラムを教えて下さい。 Private Sub リスト_Click() Dim DBS As Databasu Dim CNC As New ADODB.Connection Dim RST As New ADODB.Recordset Dim LISTNO As Intejer Set CNC = CurrentProject.Connection RST.Open "リスト連番T", CNC, adOpenKeyset,adLockOptimistic, adCmdTableDirect LISTNO = RST!リストNO RST.Close Set RST = Nothing CNC.Close Set CNC = Nothing Set DBS = CurrentDb Set RST = DBS.OpenRecordset("リスト連番T") With RST -----.Edit で コンパイルエラー-----   メソッドまたはデータメンバーがみつかりません .Edit !リストNO = LISTNO + 1 .Update .Close

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

  • ベストアンサー
  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.2

こんなではダメでしょうか?レコードが1個だけ、存在している事を前提にしています。 Sub ADORecordsetUpdate() Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Set cn = CurrentProject.Connection Set rs = New ADODB.Recordset rs.Open "リスト連番T", cn, adOpenKeyset, adLockOptimistic rs.Update "リストNO", rs!リストNO.Value + 1 rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing End Sub <参考> http://www.accessclub.jp/ado/10.html

zoro180
質問者

お礼

今回のにぴったりかと思います。 ありがとうございました。

その他の回答 (3)

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.4

下記でやってみてください・ Database Integer など雑な誤りも在る。 ーー Sub test24() Dim DBS As Database ' Dim CNC As New ADODB.Connection Dim RST As New ADODB.Recordset Dim LISTNO As Integer ' Set CNC = CurrentProject.Connection RST.Open "リスト連番T", CNC, adOpenKeyset, adLockOptimistic, adCmdTableDirect MsgBox RST!リストNO LISTNO = RST!リストNO RST.Close Set RST = Nothing CNC.Close Set CNC = Nothing '-------------- Dim DB As DAO.Database Set DB = CurrentDb Dim RS As DAO.Recordset Set RS = DB.OpenRecordset("リスト連番T") '-----.Edit で コンパイルエラー----- ' メソッドまたはデータメンバーがみつかりません RS.MoveFirst MsgBox RS!リストNO RS.Edit RS!リストNO = LISTNO + 1 MsgBox RS!リストNO RS.Update MsgBox RS!リストNO RS.Close End Sub ーー DBS,RSTなども別にしないと、重複したらダメではないかな。 なぜ前半はADOで後半はDAOなのかな。 どこかをコピーして告ぎ合わせ実行してエラーで投げ出したような感じ。

zoro180
質問者

お礼

見よう見まねで作成しているド素人でして・・・ ありがとうございました。

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

いろいろ間違いがあるようですが、 CurrentProject.Connection.Execute "UPDATE リスト連番T SET リストNO = リストNO +1;" でできそうですが。 ADOでするのなら Dim RST As New ADODB.Recordset RST.Open "リスト連番T", CurrentProject.Connection, adOpenKeyset,adLockOptimistic If (Not RST.EOF) Then ' 最低限レコードがあるかは判別した方が良いと思います   RST!リストNO = RST!リストNO + 1   RST.Update End If RST.Close かと思います。 (adCmdTableDirect の箇所は特に指定したことありませんので、削除していいものかわかりません) 間違い箇所) Dim DBS As Databasu → Dim DBS As Database Dim LISTNO As Intejer → Dim LISTNO As Integer 間違いを見つける手っ取り早い方法の1つに Option Explicit を先頭で指定しておく人もいます。 Explicit については、ヘルプを参照してください。

zoro180
質問者

お礼

Explicit などいろいろ丁寧にありがとうございました。

  • bin-chan
  • ベストアンサー率33% (1403/4213)
回答No.1

> With RST に対応するEnd Withは無くて大丈夫? 「参照」の順序を入れ替えてみるとか。 DAOよりもADOが上位にあるか、確認して見られては?

zoro180
質問者

お礼

早々に回答頂きましたが、「参照」の順序を入れ替える の意味がわかりませんでした。 ありがとうございました。

関連するQ&A

  • access2000VBAで、外部ファイルに書き込むには

    access2000 VBAで 「sample.htmlを作成、 tableテーブルのデータを書き込む」 をして、htmlファイルを自動作成したいのですが、 うまくVBAがかけません。 とりあえず、外部ファイルにデータを出力に取り組んでいます 外部ファイルの作成の仕方と、書き込みのところで、 どうしたらいいのか分からず、困っています。 アドバイスおねがいします。<(_ _)> Dim cnc As New ADODB.Connection Dim rst As New ADODB.Recordset Set cnc = CurrentProject.Connection rst.Open "table", cnc, adOpenKeyset, adLockOptimistic, adCmdTableDirect Open sample.html For Output As #1 If rst.EOF Then MsgBox "There are not recordset" GoTo db_Close End If Do Until rst.EOF Debug.Print rst!種類, rst!名前, rst!url Write #1, rst!種類, rst!名前, rst!url rst.MoveNext Loop Close #1 db_Close: rst.Close Set rst = Nothing cnc.Close Set cnc = Nothing End Sub

  • ADO1とADO2は意味は同じですか?

    Private Sub ADO1() Dim cn As New ADODB.Connection cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source= " & CurrentProject.FullName cn.Close: Set cn = Nothing End Sub Private Sub ADO2() Dim cn As ADODB.Connection Set cn = New ADODB.Connection cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source= " & CurrentProject.FullName cn.Close: Set cn = Nothing End Sub は、 Dim cn As ADODB.Connection Set cn = New ADODB.Connection を簡素化したものが Dim cn As New ADODB.Connection になるのでしょうか?

  • アクセス2000VBA DAOをADOに書き換えてください

    アクセス2000VBA DAOをADOに書き換えてください 下記プログラムをADOに書き換えてください。(DAT1、DAT2はモジュールにて定義してあります) Option Compare Database Dim DBS As Database Dim QDF As QueryDef Dim RST As DAO.Recordset Dim COUNT1 Private Sub Form_Load() On Error Resume Next DAT2 = [Forms]![伝票]![HAKKOU1] Set DBS = CurrentDb Set QDF = DBS.QueryDefs("発行") With QDF .Parameters("DAT1") = DAT2 ’もしかしたら DAT2 ではエラーがでるかもしれません。 Set RST = .OpenRecordset() ’正しい記述を教えてください .Close End With With RST COUNT1 = !指示書 .Close End With

  • 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しなくてもメモリの開放は行われているのでしょうか? アドバイスよろしくお願いいたします。

  • 帳票フォームに全レコードを表示できない

    アクセス初心者ですが宜しくお願いします。 アクセス2002を使って在庫DBを作っています。 レコードセットで抽出集計した全レコードを、「帳票形式」のフォームにすべて表示させたいのですがうまくいきません。フォームのテキストボックスは全て非連結にしてあります。 考えているのは次のような手順です。 1.表示したい期間の「開始日付=kaisi」と「終了日付=owari」を入力 2.「在庫場所」コンボボックスで表示したい在庫場所コードを選択 3.選択された在庫場所コードによって、SELECT~CASEステートメントで該当する在庫場所テーブルからデータを抽出集計し、フォームに表示させる コードは次の通りです。 Private Sub 在庫場所_AfterUpdate() Dim cnc As New ADODB.Connection Dim rst As New ADODB.Recordset Dim cmd As New ADODB.Command Dim zaiko As Variant Dim kaisi, owari As Date Set cnc = CurrentProject.Connection Set cmd.ActiveConnection = cnc kaisi = Me!期間開始 owari = Me!期間終了 zaiko = Me!在庫場所 Select Case zaiko Case "1" cmd.CommandText = "SELECT 物品ID, Sum(仕入) AS 仕入計, Sum(払出) AS 払出計 FROM T_薬局受払 " & "WHERE (日付) Between #" & kaisi & "# And #" & owari & "# " & "GROUP BY 物品ID;" Set rst = cmd.Execute Do Until rst.EOF  Me!物品ID = rst!物品ID  Me!受入計 = rst!仕入計  Me!払出計 = rst!払出計  rst.MoveNext Loop rst.Close: Set rst = Nothing Case "2"・・・・・・・・・・ End Select cnc.Close: Set cnc = Nothing End Sub 実行しますと、フォームには「最後のレコード」しか表示されません。 フォームプロパティの「規定のビュー」は帳票になっています。 よろしくお願いします。

  • ADOを使いDBへ読み書きしたい

    VB初心者です。よろしくお願いします。 今、VBのActiveXドキュメントを使い、ブラウザ上で利用できるシステムを作ろうと思っています。その際、Textboxに入力されたデータをADOを使いAccess2003に格納したいのですが、うまくいきません。DAOではうまくいきました。 コードは以下の通りです。 Private Sub Command1_Click() Dim db As ADODB.Connection Dim rst1 As ADODB.Recordset Set db = New ADODB.Connection db.ConnectionString= "Provider=Microsoft.Jet.OLEDB.4.0;" _ & "Data Source = 'データへのパス'\zaseki3.mdb" db.Open MsgBox ("接続成功") Set rst1 = New ADODB.Recordset ☆☆rst1.Open "T-利用者", db,adOpenForwardOnly,adLockOptimistic   With rst1 .AddNew .Fields("氏名") = Text1 .Update End With rst1.Close db.Close Set db = Nothing Set rst1 = Nothing End Sub ☆☆のところでエラーが発生します。エラー内容は次の通りです。  実行時エラー'-2147217900(80040e14)': SQLステートメントが正しくありません。'DELETE'などを使用してく ださい。 環境は Windows XP, VB6.0, Access2003  です。 よろしくお願いします。

  • Access2007 サブフォームのレコードを一括印刷する方法

    お世話になっております。 サブフォームは帳票型になっており、下記で表示されている全レコードのチェックが入ります。 これと平行して、各レコードを印刷したいのですが、カーソルがあるレコードのみがレコードの数だけ印刷されてしまいます。 これを各レコードごとに印刷したいと思います。 Dim dbs As Database Dim rst As Recordset Dim strSQL As String Set dbs = CurrentDb Set rst = Me.RecordsetClone With rst If .RecordCount > 0 Then .MoveFirst Do Until .EOF .Edit !チェック = True DoCmd.OpenReport "印刷", acNormal, , "コード=" & Me.コード .Update .MoveNext Loop End If .Close End With ご教授いただければ幸いです。よろしくお願いいたします。

  • アクセス ADO レコードの件数がおかしい

    アクセスADOでクエリの行数を取得したいのですが クエリが200行でも100行でも必ず12が返ります。 クエリ1は、一度12行の時にadoで数を取得し、その時は、正しく12が返ったのですが、 行数が変わっても12が返ります。 コードは、 Sub Sample() Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset Set cn = CurrentProject.Connection rs.Open "SELECT * FROM クエリ1", cn, adOpenStatic, adLockPessimistic Debug.Print rs.RecordCount rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing End Sub です。 Debug.Print DCount("*", "クエリ1") だと、正しいレコード数が取得されるのですが、ADOだとおかしいです。 クエリ1のSQL文は、 SELECT Q_作業用.* FROM Q_作業用; のように、別のクエリを持ってきています。 何が原因なのでしょうか? よろしくお願いします。

  • ADOでレコードを閉じるタイミング。。Access2000/VB6/Win2K

    レコードセットを返すFuncitonプロシージャーを作ってみたのですが。。。 下のGet_Recordsの方のレコードセットをCloseすると上の方のDisp_Dataでオブ ジェクトが閉じているといって怒られます。しかし、閉じないと下の方では開きっ ぱなしになると思うのですが。。。どのように処理すればいいのでしょうか? Public P_CN As ADODB.Connection Private Sub Disp_Date()   Dim RS As ADODB.Recordset   Dim SQL AS String    Set RS = Get_Records(SQL)     With RS      If .RecordCount > 0 Then       .MoveLast: .MoveFirst       .Debug.Print !顧客_ID        End If      End With      RS.Close     Set RS = Nothing End Sub Public Function Get_Records(pSQL As String) As ADODB.Recordset   Dim RS As ADODB.Recordset     Set RS = New ADODB.Recordset      RS.Open pSQL, P_CN, adOpenKeyset, adLockOptimistic     Set Get_Records = RS '''    RS.Close '''   Set RS = Nothing End Function

  • 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」は使ったほうがいいのでしょうか? よろしくお願いします。

専門家に質問してみよう