• ベストアンサー

Access カレントレコードがありません

フォーム社員情報からレコードを削除するボタンを作成してレコードの削除を行いたいのですが、全て削除をして1件もなくなった場合にデータベースを閉じる時に「カレントレコードがありません」というエラーが出てしまいます。OKをクリックすると閉じる事は閉じれるのでこのエラーが出ないようにしたいのですが。。。 よろしくお願いします。 'エラー開始 On Error GoTo err_RTN: '接続 Set cnADO = CurrentProject.Connection 'レコードセットを取得 Set rsADO = New ADODB.Recordset rsADO.Open "T社員情報", cnADO, adOpenKeyset, adLockOptimistic '削除 ret = MsgBox(Me!txt氏名.Value & Chr(13) & "を削除しますか?", vbYesNo + vbQuestion, "削除") Select Case ret Case vbYes rsADO.Delete Me.Requery Case vbNo Exit Sub End Select '終了 rsADO.Close: Set rsADO = Nothing cnADO.Close: Set cnADO = Nothing

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

  • ベストアンサー
  • maruru01
  • ベストアンサー率51% (1179/2272)
回答No.4

再びmaruru01です。 うーん、ちょっと分からないですね。 なので、別の方法を。 やりたいことは、フォームのtxt社員No.と一致する社員No.のレコードを削除するということですね。 なのでレコードセットを開かずに直接SQLを実行します。 (確認のIf文の中に) mySQL = "DELETE * FROM T社員情報 " & "WHERE 社員No. =" & Me!txt社員No. DoCmd.RunSQL mySQL ただし、アクションクエリの確認メッセージが出ますので、 Accessのメニュー[ツール]→[オプション]→[編集/検索]タブ→[確認]→[アクション クエリ]のチェックは外しておきます。 なお、この「アクション クエリの確認」はVBAから次のように変更出来ます。 '確認オフ Application.SetOption "Confirm Action Queries", False '確認オン Application.SetOption "Confirm Action Queries", True これを、一番最初のフォームの読み込み時にオフにして、一番最後のフォームを閉じる時にオンすればいいでしょう。 ところで、フィールド名などに"."(ピリオド)を使用するのはやめた方がいいですよ。 では。

その他の回答 (3)

  • maruru01
  • ベストアンサー率51% (1179/2272)
回答No.3

こんにちは。maruru01です。 Me.Requeryを削除してみたらどうなりますか。 Requeryを行うと、レコードセットが更新され、先頭のレコードにカレントを移動しようとしますが、その時レコードが1件もないので、エラーが出るかもしれません。 というか、何故ここにRequeryメソッドを置いているのでしょう。 ちなみに残り1件で削除してレコードが無くなった場合にエラーが出るなら、No.1の方のやり方では意味がありません。 これはすでにレコードが1件もないかどうかを判定しているので。 では。

t-tomo
質問者

補足

1つ書き忘れていましたが、 mySQL = "SELECT * FROM T社員情報 " _ & "WHERE 社員No. =" & Me!txt社員No. rsADO.Open , mySQL , cnADO, adOpenKeyset, adLockOptimistic という所を間違っていました。すいません。 Me.Requeryを削除したところ、#Deleted という表示が出てしまいます。 Me.Requeryのままで実行すると、フォームを開いたり閉じたりする時にエラーは出ないのですが、アクセスを終了する時に Docmd.Quit で終了しているのですが、この時にエラーが出てしまいます。 エラーが出てOKをクリックすれば問題なく終了は出来るのですが、出来ればこのエラーを表示したくありません。よろしくお願いします。

  • oka123
  • ベストアンサー率31% (69/219)
回答No.2

すいません あまり、知識がないもので。 ------------------------------- エラーメッセージから推測すると 0件レコードを読んだ時のエラーと 思いましたのでEOFやBOF命令で 解決することが経験上ありましたもので EOF命令を紹介した次第です あと参考までですが私の場合は DAO命令で処理を書いてモジュールを 作成しています SQL命令では必要かもしれないのですが 閉じるときには rs.Close は書きますが Set rs = Nothingは 書いていません 参考になるかどうかは自信がありませんが とりあえずのご連絡まで。

  • oka123
  • ベストアンサー率31% (69/219)
回答No.1

>Set rsADO = New ADODB.Recordset >rsADO.Open "T社員情報", cnADO, adOpenKeyset, >adLockOptimistic の後に IF rsADO.EOF GOTO OWARI(CLOSEの手前にラベルを) とすればいかがでしょうか

t-tomo
質問者

補足

ご返事ありがとうございます。 早速、oka123さんのご指示の通り(勘違いをしているかもしれません。) 書いたつもりなのですが、やはりデータベースを閉じる時にエラーが出てしまいます。 '接続 Set cnADO = CurrentProject.Connection 'レコードセットを取得 Set rsADO = New ADODB.Recordset rsADO.Open "T社員情報", cnADO, adOpenKeyset, adLockOptimistic If rsADO.EOF Then GoTo OWARI: '削除 ret = MsgBox(Me!txt氏名.Value & Chr(13) & "を削除しますか?", vbYesNo + vbQuestion, "削除") Select Case ret Case vbYes rsADO.Delete Me.Requery Case vbNo Exit Sub End Select OWARI: '終了 rsADO.Close: Set rsADO = Nothing cnADO.Close: Set cnADO = Nothing

関連するQ&A

  • サブフォームのレコード削除

    サブフォーム(帳票)のレコード削除をしたいのですが、レコードセクレタをクリックして選んだレコードではなく、テーブルの最初のレコードから順番に削除されてしまいます。 Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Dim ret As Integer '接続 Set cn = CurrentProject.Connection 'レコードセットを取得 Set rs = New ADODB.Recordset rs.Open "T支店", cn, adOpenKeyset, adLockOptimistic '削除 ret = MsgBox("表示中のレコードを削除しますか?", vbYesNo + vbQuestion, "削除") Select Case ret Case vbYes rs.Delete Me!sub支店.Form.Requery Case vbNo Exit Sub End Select '終了 rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing WINDOWS98、ACCESS2000をしようしています。よろしくお願いします。

  • Accessフォームで更新確認

    ACCESSで管理台帳を作成しています。 不用意なデータ上書きがないよう下記のようなプロシージャで確認を行っています。 Private Sub 更新確認() Dim ret, cancel Beep ret = MsgBox("変更内容を保存しますか?", vbYesNoCancel + vbQuestion, "現レコード更新保存") Select Case ret Case vbYes Case vbNo Me.Undo Case vbCancel cancel = True End Select End Sub このプロシージャはBeforeUpdateで動作させています。 メインフォームではうまく動作するのですが、サブフォーム(帳票形式)に記載すると 値が変わらなくても違うセル(レコード)を選択すると動作してしまいます。 なにかうまく動作させられないでしょうか? ご教授お願いします

  • Access VBA Me.Requery レコードは削除されています エラー

    Me.Requery すると「レコードは削除されています」エラー 予約テーブル → 確定テーブルにデータ移し、予約テーブルのレコードは削除 という処理をしています。 予約詳細というクエリを作り、フォームで開きました。 [確定]ボタンを設置し、フォームの値を確定テーブルに追加できるようにしました。 確定済みの予約レコードは、削除します。 ここまでは成功したのですが、フォームには、確定済みの予約レコードが表示されたままです。 Me.Requery というコードを追加しましたが、エラーになります。 「レコードは削除されています」エラーです。 単純に[削除]ボタンで1レコード削除した後、 Me.Requery した場合には、問題なく、きれいに再表示されます。 -------------------------------- Private Sub 削除ボタン_Click() Dim ADOcmd As ADODB.Command Set ADOcmd = New ADODB.Command ADOcmd.ActiveConnection = CurrentProject.Connection ADOcmd.CommandText = "Delete from 予約 where 予約ID=" & me.予約ID ADOcmd.Execute Set ADOcmd = Nothing Me.Requery ' <<<< これは成功します。gannersさん感謝<(_ _)> End Sub -------------------------------- 途中で何かのプロパティが変化しているからでしょうか? 解決方法わかる方いらっしゃいますか?

  • 強制終了になってしまいます

    Windows98 ACCESS2000を使用しています。 よく強制終了になったり、"2486 現在このアクションは実行出来ません"などのエラーが頻繁に出て困っています。 削除をした後にエラーになる事が多いので、多分これが原因なのではと思います。 顧客情報フォームというメインフォームに、支店、事業概要、賃金…などの複数のタブがあり、それぞれにサブフォームとサブフォームに対して登録ボタンと削除ボタンが貼り付けてあります。 Private Sub cmd支店削除_Click() Dim rs As DAO.Recordset If Me!sub支店.Form.Recordset.recordcount = 0 Then MsgBox ("削除するレコードはありません。") Exit Sub End If Set rs = Me!sub支店.Form.Recordset.Clone rs.Bookmark = Me!sub支店.Form.Bookmark ret = MsgBox("表示中のレコードを削除します。よろしいですか?", _ vbOKCancel + vbQuestion + vbDefaultButton2, "削除") Select Case ret Case vbOK rs.Delete Me!sub支店.Form.Requery Case vbCancel End Select rs.Close: Set rs = Nothing End Sub Private Sub cmd支店登録_Click() If IsNull(Me!cbo顧客.Value) Then MsgBox "顧客名を選択して下さい。" Exit Sub Else DoCmd.OpenForm "F支店登録", acNormal End If End Sub という風に書いてあるのですが、たくさんサブフォームがあるのでブックマークのつけ方がおかしいのでは?と思うのですがさっぱり分かりません。よろしくお願いします。

  • 2回目に画面のレコードセットの値が読めない

    メインフォームとサブフォームの画面゛て レコードソースは、ワークテーブルを参照し メインフォームの保存ボタンの処理で、 Private Sub 保存ボタン_Click()  Set mySubFm = Me![テーブル子].Form  Set myParFm = Forms(Me.name) '<== 親フォーム  Set Rec1 = myParFm.RecordsetClone  Set Rec2 = mySubFm.RecordsetClone  Lng受注ID = Rec1.Fields("受注ID").Value  Dim Rtn As Integer  ・レコードセットのデータを、本テーブルに更新する処理  ・自動採番した番号を、レコードセットのIDのフィールドにセット   Rec1.Edit   Rec1.Fields("ID").value = newID   Rec1.Update  ・Me.Requery '<== メインフォームの画面を更新  ・mySubFm.Requery '<==サブフォームの画面を更新  Set Rec1 = Nothing   Set Rec2 = nothing End Sub この処理を一度行い、更に、画面のサブレコードの値を変更して、保存ボタンを再度押すと、 Lng受注ID = Rec1.Fields("受注ID").Value の行で、 「オブジェクトが正しくないか、現在設定されていません」というエラーになります。 この原因はどうしたら解決出来ますでしょうか? よろしくお願いします。

  • レコード単位にトランザクションかけられる?

    Access2003 Win-XP です。 下記コーディングで現象は・・・ ・2つのPCで同じレコードを編集すると、あとから編集する人は待機中になる。 ・しかしながら、同じテーブルで最初にレコード編集中の人がいたとき、別PCの人が別レコードを編集することは可能で待機することはない(これは正常)。そして正常に更新されたかのように終了する。しかしながら、更新はされていない。   (更新されないのにエラーハンドリングできない) これはいったいどういうことでしょうか? 何か対策はないでしょうか? Dim ret_value As Variant Dim wsp As Workspace Dim dbs As Database Dim rsA Set wsp = DBEngine.Workspaces(0) Set dbs = CurrentDb wsp.BeginTrans Set rsA = dbs.OpenRecordset("在籍表", dbOpenDynaset, dbSeeChanges, dbPessimistic) Do Until rsA.EOF If rsA.[出席番号] = Me.[出席番号] Then rsA.Edit rsA.[氏名] = Me.[氏名] rsA.Update rsA.MoveLast End If rsA.MoveNext Loop rsA.Close ret_value = MsgBox("Commit ?", vbYesNo) If ret_value = vbYes Then wsp.CommitTrans Me.Requery Else wsp.Rollback End If Exit_コマンド34_Click: Set wsp = Nothing Exit Sub Err_コマンド34_Click: MsgBox Err.Description Resume Exit_コマンド34_Click  

  • ACCESS レコードセット

    非連結フォーム(frm_B)のOPEN時にADOレコードセットでデータを表示させ、更新ボタンを押すと、追加クエリでそのフォーム上で表示されたデータをテーブル(tbl_B)に新規登録させ、さらにその非連結フォームには別のフォームの内容を表示させるVBAを書きましたが、最後に別のフォームの内容で非連結フォームにデータをセットしたとき?にテーブルのデータも更新されてしまいます。最初にテーブルに追加したデータとは切り離したいのですがどうすればうまくいくのでしょうか。 ・フォームfrm_BをOPEN 'DAOレコードセット Dim dbDAO As DAO.Database Dim rsDAO As DAO.Recordset Dim stSQL As String stSQL = "SELECT No.,規格No.,改訂No. FROM tbl_B " _ & "WHERE 規格No. ='" & Forms![frm_A].[規格No.] & "'" _ & "AND 改訂No. =" & Forms![frm_A].[改訂No.] & "" 'DAOレコードセット Set dbDAO = CurrentDb Set rsDAO = dbDAO.OpenRecordset(stSQL) Set Me.Recordset = rsDAO Me![No.].ControlSource = "No." Me![規格No.].ControlSource = "規格No." Me![改訂No.].ControlSource = "改訂No." 'DAOレコードセットクローズ Set rsDAO = Nothing Set dbDAO = Nothing ・更新ボタンクリック Private Sub cb_kaitei_Click() Dim stDocName As String   '追加クエリ stDocName = "q_B" DoCmd.OpenQuery stDocName, acNormal, acEdit Forms![frm_B].SetFocus Me![No.] = Forms![frm_A].[No.] Me![規格No.] = Forms![frm_A].[規格No.] Me![改訂No.] = Forms![frm_A].[改訂No.] ・ このときにレコードセットで追加したレコードのほうも更新されてしまいます。これを別のレコードと判断させたいのです。よろしくお願いします。

  • アクセスADO 複数のレコードがあるのに-1が返る

    アクセスのADOを作っています。 テーブルにレコードは複数あるのですが、Filterをすると必ず-1が返ります。 どうしてでしょうか? エラーになってるのでしょうか? ---------------------------------------------------- Set cn = CurrentProject.Connection myStr = "test" rs.Open "Tテーブル", cn, adOpenForwardOnly, adLockReadOnly rs.Filter = ("フィールド1=" & "'" & myStr & "'") MsgBox rs.RecordCount ’マイナス-1になる rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing ---------------------------------------------------- rs.Open の下に、MsgBox rs.RecordCountを置いても、-1になることから、Filter のせいではないと思うのですが 原因がわかりません。 ご教授よろしくお願いします。

  • レコードセットのオープン

    修行中のものです。。。 エラーが発生してしまします。 間違いの点をお教え下さい。 自分的には”レコードセットのオープン”がいまいち分かりません。 【 objCon.Open 】 Dim objCon Dim objRS '##### コネクションオブジェクトの生成 ##### Set objCon = Server.CreateObject("ADODB.Connection") '##### レコードセットオブジェクトの生成 ##### Set objRS = Server.CreateObject("ADODB.Recordset") '##### 接続用パレメータの設定 ##### objCon.Provider = "Microsoft.Jet.OLEDB.4.0" '##### MDBの絶対パス指定 ##### objCon.ConnectionString = (Server.MapPath("/") & "データベース") '##### コネクションのオープン ##### objCon.Open '##### データ参照 ##### objRS = "select [ID],[NAME],[URL],[CM1],[CM2],[CM3] from SITE_DATA" %> レコード件数 <%=objRS.RecordCount%> <hr> <% '##### レコードセットのクローズ ##### objRS.Close Set objRS = Nothing '##### コネクションのクローズ ##### objCon.Close Set objCon = Nothing %> お願いします

  • DAO エクセルvbaからアクセスのレコードの件数

    DAOで、エクセルvbaからアクセスのレコードの件数を取得したいのですが Dim ac As Object Dim db As DAO.Database Dim rs As DAO.Recordset Set ac = CreateObject("Access.Application") Set db = ac.DBEngine.OpenDatabase("D:\あああ.accdb", False, True) Set rs = db.OpenRecordset("SELECT * FROM Tマスタ WHERE masterkey like '*四*';") i = rs.RecordCount Debug.Print rs("masterkey") rs.Close: Set rs = Nothing db.Close: Set db = Nothing ac.Quit: Set ac = Nothing をすると、抽出するレコードが1000件でも、必ず1が返ります。 masterkeyフィールドは文字列型です。 なぜ実際はたくさんのレコードがあるのに、1が返るのでしょうか?