• 締切済み

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 -------------------------------- 途中で何かのプロパティが変化しているからでしょうか? 解決方法わかる方いらっしゃいますか?

  • xespr
  • お礼率73% (61/83)

みんなの回答

回答No.4

[参考までに..] 1年前の質問に回答して良いものなのか、わかりませんが、自分も近い現象に何度か遭遇したことがありますので、そのときの解決方法を載せときます。 Me.Requery がなんらかの原因で使用できない場合は 以下の方法が有効となります。 ----------------------------- Dim strRS as String strRS = Me.RecordSource DoCmd.Echo False Me.RecordSource = "" <<各種クエリ操作>> Me.RecordSource = strRS DoCmd.Echo True ----------------------------

回答No.3

#1です。 結構複雑なことしていますね。こちらでも再現させてみようかと思いましたが、ちょっと断念しました。 ふとした思いつきなのですが、Me.requeryの代わりにMe.refreshでも駄目でしょうか。あるいはRefreshした後にRequeryではどうでしょうか。 簡単に試せるので試してみてください。

  • ganners
  • ベストアンサー率37% (3/8)
回答No.2

ついでに Private Sub 確定_Click() Dim ADOcmd As ADODB.Command Set ADOcmd = New ADODB.Command ADOcmd.ActiveConnection = CurrentProject.Connection ADOcmd.CommandText = "insert into 確定テーブル(X1,Y2,Z3) select A1,B2,C3 from 予約テーブル" ADOcmd.Execute ADOcmd.CommandText = "delete from 予約テーブル" ADOcmd.Execute Set ADOcmd = Nothing Me.Requery End Sub 上記であれば、動作確認済みです。現行のコードと見比べ違いを教えていただければ答えやすいです。

xespr
質問者

補足

nandarou-1011さん、gannersさん、ありがとうございます。 下のような感じで、結構こみいってます。 予約テーブルからSELECT 確定テーブルからSELECT 確定テーブルに追加 予約テーブルからSELECT   詳細テーブルに追加   商品オプションテーブルからSELECT     オプションテーブルに追加   ' 詳細処理終了で   ★予約テーブルからDELETE   ' 次の予約レコード(SELECTしたRecordset)を見る ' 全レコード(SELECTしたRecordset)終了(処理→削除)後、 Me.Requery ' <<<< 削除されていますエラー発生 ???なぜ(TT)???

回答No.1

一つ質問です。 >確定済みの予約レコードは、削除します。 この場合、削除方法はどのような方法ですか?できれば確定ボタン_Clickの内容を教えていただけますか。

xespr
質問者

補足

----------------------------------------- Sub kakutei() Dim cnn As New ADODB.Connection Dim rst As New ADODB.Recordset Dim rst2 As New ADODB.Recordset ''' DB接続 Set cnn = CurrentProject.Connection ''' 予約テーブルから、このユーザの最初の予約を取得 mySQL = "SELECT min(予約日) as 最少予約日 FROM 予約 WHERE uid=" & Me.uid rst.Open mySQL, cnn, adOpenKeyset, adLockReadOnly 最少予約日 = rst!最少予約日 rst.Close ''' 確定テーブルの主キー生成 mySQL = "SELECT max(sid) as sid_max FROM 確定;" rst.Open mySQL, cnn, adOpenKeyset, adLockReadOnly sid = rst!sid_max + 1 rst.Close '' 確定テーブルに追加 mySQL = "INSERT INTO 確定 (sid, 予約日, uid, 確定日) " _ & " VALUES( " & sid & ", #" & 最少予約日 & "#, " & uid & ", #" & Me.確定日 & "# ) ;" cnn.Execute mySQL ''' このユーザの全予約レコードを取得 mySQL = "SELECT * FROM 予約 WHERE uid=" & Me.uid rst.Open mySQL, cnn, adOpenKeyset, adLockReadOnly Dim i As Integer Do Until rst.EOF cid = rst!cid 単価 = rst!単価 数量 = rst!数量 値引額 = rst!値引額 ''' 詳細テーブルに追加 i = i + 1 scid = sid * 10 + i ' 詳細テーブルのシリアル番号生成 mySQL = "INSERT INTO 詳細 ( scid, sid, cid, 単価, 数量, 値引額 ) " _ & " VALUES( " & scid & ", " & sid & ", " & cid & ", " & 単価 & ", " & 数量 & ", " & 値引額 & ");" ' cidは商品コード cnn.Execute mySQL '' この商品のオプション内容登録 mySQL = "SELECT * FROM 商品オプション WHERE cid=" & cid rst2.Open mySQL, cnn, adOpenKeyset, adLockReadOnly Do Until rst2.EOF ''' オプションテーブルに追加 mySQL = "INSERT INTO オプション ( scid, ciid ) " _ & " VALUES( " & scid & ", " & ciid & ") ;" cnn.Execute mySQL rst2.MoveNext Loop rst2.Close ''' レコード削除 delete_rid Me.rid rst.MoveNext Loop rst.Close ' Me.Requery ' <<<<<<<< ここでrequeryするとエラーになる ''' 終了処理 cnn.Close: Set cnn = Nothing Set rst = Nothing ' Me.Requery ' <<<<<<<< ここでrequeryするとエラーになる End Sub ----------------------------------------- Private Sub delete_rid(rid) Dim cnn As New ADODB.Connection Dim rst As New ADODB.Recordset ''' DB接続 Set cnn = CurrentProject.Connection ''' 予約テーブルからレコード削除 mySQL = "DELETE FROM 予約 WHERE rid=" & rid ' ridは予約ID cnn.Execute mySQL ''' 終了処理 cnn.Close: Set cnn = Nothing Set rst = Nothing End Sub -----------------------------------------

関連するQ&A

  • アクセス Me.Requeryでダウン

    アクセス+VBAです。 Public Function sakujo() s = "DELETE FROM 予約TB WHERE 個人ID = 1 AND 予約科目= '算数'" CurrentDb.Execute s Me.Requery End Function のような関数を別フォーム[A]から Debug.Print Forms!フォーム1!サブフォーム1.Form.sakujo して呼出し使おうとしてます。 しかし Me.Requery のところで何のメーッセージも無くアクセス自体が終了してしまいます。 Me.Requeryで一時停止させてF5(実行の続き)をすると 「レコードは削除されています」 とメッセイージが出て、その後アクセス自体が終了です。 また、他フォーム[B]から呼出すと正常に動きます。 説明不足かもしれませんが、どうのような原因が考えられるでしょうか?

  • フォームで1レコード削除したのに表示は残ったまま更新されない

    Accessフォーム(表形式)に[削除]ボタンをつけました。 VBAで削除ボタン_Click()を書きました。 ADO接続 SQL発行し、該当レコード削除 (Delete from 予約 where 予約ID= me.予約ID ) というコードです。 削除後も、フォームにはレコードが見えたままなのですが、表示を更新するにはどうしたら良いのでしょうか? ----------------------------------- Set rs = Me.Recordset.Clone '' 予約テーブルからレコード削除処理 ... Me.Requery ----------------------------------- というやり方は、DAOだそうですね。 ADOではフォームのレコードソースを指定できないと参考書にありました。 しかし、DAOでは Delete SQL 発行の仕方がわからないので、できればADOで実現したいのです。 無理でしょうか?

  • 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

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

    サブフォーム(帳票)のレコード削除をしたいのですが、レコードセクレタをクリックして選んだレコードではなく、テーブルの最初のレコードから順番に削除されてしまいます。 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でレコードの複製

    Access2010を使用して入力フォームを作成しています。 メインフォームとサブフォームにそれぞれ顧客情報を表示させていて、 「複製」ボタンを押すと、 メインフォーム、サブフォームのレコードがコピーされるようにしています。 メインフォームの元テーブルはJIK サブフォームの元テーブルはREN です。 JIKおよびRENテーブルはほかからリンクさせているのですが、 これで「複製」ボタンを押すと、 "実行時エラー '3022': インデックス、主キー、またはリレーションシップで重複する値が生成されるためテーブルに要求した変更でした成功しました。フィールドまたは重複データが含まれている、インデックスを削除するフィールド内のデータを変更または重複するエントリを許可して、やり直してのインデックスを再定義します。このエラーは、レポートやレポートの生成に変更を保存するときに発生します。 が出てしまいます。 テーブルをインポートすると正常に動作します。 テーブルをリンクさせる場合、レコードの複製は不可能なのでしょうか? VBAは以下のように記述してみました。 Private Sub コマンド10_Click() On Error GoTo Err_コマンド10_Click Dim Result As Integer Result = MsgBox("このデータを複製しますか?", vbYesNo + vbDefaultButton2 + vbQuestion, "データの複製確認") If Result = vbYes Then Me!txtCopy事件ID = Me!事件ID Dim stDocName As String DoCmd.RunCommand acCmdSelectRecord 'カレントレコードの選択 DoCmd.RunCommand acCmdCopy '選択レコードのコピー DoCmd.GoToRecord , , acNewRec '新規レコードに移動 DoEvents ' (必要に応じて) DoCmd.RunCommand acCmdPasteAppend 'コピーレコードの追加貼り付け DoCmd.SetWarnings False ' システムメッセージ非表示 stDocName = "追加クエリ" DoCmd.OpenQuery stDocName, acNormal, acEdit DoCmd.SetWarnings True ' システムメッセージ表示 ' サブフォーム再クエリ Me!SREN.Requery ' 追加したレコードに移動 DoCmd.GoToRecord , , acLast Me.リスト31.Value = Me.リスト31.ItemData(0) MsgBox ("データを複製しました") Exit_コマンド10_Click: Exit Sub Err_コマンド10_Click: MsgBox Err.Description Resume Exit_コマンド10_Click Else MsgBox "データの複製をキャンセルしました" End If End Sub 追加クエリは以下のように作成してみました。 【追加クエリ】 INSERT INTO REN ( 事件ID, 氏名, フリガナ, ・・・ ) SELECT [Forms]![MAIN]![事件ID] AS 式1, REN.氏名, REN.[フリガナ], REN.報告書, ・・・ FROM REN WHERE (((REN.事件ID)=[Forms]![MAIN]![txtCopy事件ID]));

  • Access レコード削除時に「カレントレコードがありません」エラーが表示されてしまう

    いつもお世話になっております。 フォームに「レコードの削除」ボタンを作成して実行したところ、 「カレントレコードがありません」と表示されてしまいます。 削除そのものは、正しく行われている(削除したいレコードが削除されている)のですが、 なぜ、そのようなメッセージが出てしまうのか分かりません。 他のフォームでは、削除するレコードが最後のレコードで無い限り、 そのようなメッセージは出ません。 また、そのフォームのレコードソースになっているクエリでは、 問題なく削除が実行されます。 削除ボタンの作成は、コントロールウィザードを使って行いました。 ちなみにVBAでは下記のような記述になっています。 Private Sub 削除テスト_Click() On Error GoTo Err_削除テスト_Click DoCmd.DoMenuItem acFormBar, acEditMenu, 8, , acMenuVer70 DoCmd.DoMenuItem acFormBar, acEditMenu, 6, , acMenuVer70 Exit_削除テスト_Click: Exit Sub Err_削除テスト_Click: MsgBox Err.Description Resume Exit_削除テスト_Click End Sub メッセージを表示させないためには、どのようにしたら良いでしょうか?? また、最後のレコードを削除した場合にも、 「カレントレコードがありません」メッセージを表示させなくするには どのようにしたら良いでしょうか? 教えてください。

  • Access2000のレコード削除について

    Access2000のVBAにより、フォームに配置したコマンドボタンを押すことで、テーブルの全レコードを一度に削除したいのですが、どの様にすればよいのですか? 構文で教えて頂けると助かります。とても困っています。よろしくお願いします。

  • ACCESSとVBAとレコード

    こんにちわ。 このサイトは何回も利用させて頂いてるのですが、今回も宜しくお願い致します。 環境はOS:Xp・Access2000です。 フォームを開くときにレコードを並べ替えたいのですが、単に「顧客コード」を昇順で並べ替えるには Private Sub Form_Load() Me.OrderBy = "顧客コード" Me.OrderByOn = True End Sub というのは解ったのですが、 何の関連付けもしてない、指定のテーブルの内容を並べ替えるにはどのように記述したらよいのでしょうか? 「Me」の箇所をそのテーブル名 (例えば、顧客テーブル.OrderBy = "顧客コード") のようにすれば良いのでしょうか? 宜しくお願いします。

  • アクセスVBA 初心者 レコードの削除

    アクセス初心者 VBAに初挑戦です。 何度もこちらで助けていただき、あと一歩のところまできましたが、またつまづきました。 教えてください。 有給休暇の年次更新プログラムを作成中です。 一連の更新計算処理を行ったあと、サブフォームに入力すみの、消化履歴レコードをテーブルから削除する部分を作っています。 テーブルは、 社員コード、年月日、消化日数 で1レコードです。 下の記述で組んでおり、エラーも出ず、メッセージを確認する限りは、きちんと動いて、当該レコードの場合には”削除しました”のメッセージも出て、きれいに終わっているのですが、実際にはレコードが削除されていません。 チェックすべき点は、どこでしょうか? ご教示おねがいいたします。 '********************** '*** 消化履歴クリア *** '********************** '実行の確認ポーズ yn = MsgBox("有休の履歴をクリアしますか?", vbYesNo, "確認!") If yn <> vbYes Then Exit Sub End If '消化履歴(有給休暇:テーブル) 当該社員の全レコードを削除しクリアする Dim cnn As ADODB.Connection Dim rs As ADODB.Recordset Dim tbl As String Set cnn = CurrentProject.Connection Set rs = New ADODB.Recordset tbl = "有給休暇" Call rs.Open(tbl, cnn, adOpenForwardOnly, adLockBatchOptimistic) rs.MoveFirst Do While rs.EOF = False MsgBox "form社員コード= 【" & [Forms]![フォーム基本情報]![社員コード] & "】", , "確認" MsgBox "tbl社員コード= 【" & rs("社員コード").Value & "】", , "確認" If rs("社員コード").Value = [Forms]![フォーム基本情報]![社員コード] Then rs.Delete MsgBox "削除しました【" & rs("社員コード").Value & "】", , "確認" End If Call rs.MoveNext Loop Call rs.Close Set rs = Nothing Set cnn = Nothing

  • Access アクセス VBA レコード追加

    Access フォームからのレコードの追加方法を教えてください。 テーブル1 ・ID(主キー) ・窓口 ・コストセンター ---------- テーブル2 ・コストセンター(主キー) ・目的 ---------- リレーションシップ テーブル1のコストセンターとテーブル2のコストセンターを一対多 ---------- メインのフォームに”ID”を入力したときにテーブル1に一致するレコードがない場合、新規登録用のフォームが表示されるようになっています。 新規登録用のフォームにレコードを入力してもテーブルに反映されません。 新規登録用のフォームは下記のように作成しています。 また、フォームに”コストセンター”を入力したときに入力したレコードがテーブル2にあっても自動で”目的”が表示されません。 メインフォームにはサブフォームで各テーブルが表示されています。 フォーム ・ID(初期値•••メインで入力したID) ・窓口 ・コストセンター ・目的 ・コストセンター(非表示) 上から順に ・テーブル1 ・テーブル1 ・テーブル2 ・テーブル2 ・テーブル1