• ベストアンサー

Access を×ボタンで閉じる時、レコード保存したくない。

Accessで最後の1レコード分のデータ入力を行ってから、レコードの更新をせず、レコードを移動せず、更新ボタンも押さず、いきなりフォームを閉じると、この1レコードが保存されてしまいます。 Me.Undo DoCmd.GoToRecord , , acNewRec を読込み解除時のイベントに入れても、しっかり保存されてしまいます。 閉じる時のイベントに入れるとエラーが出て保存されます。 ×ボタンで閉じる時、入力途中のレコードを保存せずに閉じるにはどうしたら良いでしょう。 初心者ですので、何か簡単で良い方法がありましたら、ご教授願います。

  • mmac
  • お礼率94% (64/68)

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

  • ベストアンサー
回答No.1

Form_BeforeUpdate イベントに MsgBox "BeforeUpdate" Form_Unload イベントに MsgBox "Unload" と入れてやってみるとわかると思いますが、 BeforeUpdate → Unload の順でイベントが発生します。つまり、Unload イベントが起きたときには既に更新済みです。 ( ちなみに、Form_Close は Form_Unload の後です。) BeforeUpdate で Cancel = True としてやれば更新しなくなりますが、これだと、フォームを閉じようとした時以外のときも更新しなくなってしまいます。また、BeforeUpdate の中では、フォームが閉じられようとしているのどうか判定できません。 というわけで、Form_Unload、または Form_Close の中で、登録された新規レコードを削除してやるくらいしかないように思います。 具体的には、 Private mblnNewRecord As Boolean Private Sub Form_BeforeUpdate(Cancel As Integer) If Me.NewRecord Then mblnNewRecord = True Else mblnNewRecord = False End If End Sub Private Sub Form_Unload(Cancel As Integer) If mblnNewRecord Then DoCmd.RunCommand acCmdDeleteRecord End If End Sub という感じです。( Access 2000 では確認しましたが、それ以外のバージョンは未確認です。)

mmac
質問者

お礼

なるほど、Unload イベントが起きたときには既に更新済みなんですね。 登録された新規レコードを削除の方法で試したら出来たので、これで進めようと思います。 分かりやすい説明ありがとうございました。 (初心者なので具体例が助かりました)

関連するQ&A

  • Accessレコードの削除(VBA)

    Accessで入力フォームを使用して入力をしていますが、 全項目の入力がされていない場合そのレコードを削除したいのです。 閉じるときに消そうと思い DoCmd.RunCommand acCmdDeleteRecord を入れてみたのですが、レコードの削除はできません、とメッセージが出てしまい消せません。 次のレコードを選択すれば消せるかと思い DoCmd.GoToRecord , , acNewRec を足してみたりしてみたのですが、やっぱりダメでした。 この場合はどのようにすればいいのでしょうか?

  • サブフォームの新規レコードに移動したい アクセス

    親フォームのコマンドボタンをクリックしたら 親フォームにはまっているサブフォームの新規レコードに移動したいのですが、 うまくできません。 サブフォームのオブジェクト名は、"F_SubForm"です。 サブフォームはデータシートビューです。 VBAコードは Private Sub cmd_test_Click() DoCmd.SelectObject acForm, "F_SubForm" DoCmd.GoToRecord , , acNewRec End Sub です。 上記コードを実行すると DoCmd.SelectObject acForm, "F_SubForm" の部分で、 「実行時エラー 2489  オブジェクトが開いていません。」 となります。 だからと言って、 DoCmd.GoToRecord , , acNewRec だと、何も起こりません。(新規レコードに移動しません) 解決方法をご教授ください。

  • アクセス enterで次ページ(レコード)移動

    アクセスでformを使い最後の入力”失効有無”が終わったら次のレコードにenter keyで 移動したいのですがうまくいきません。 プロパティの更新後処理 イベントプロシージャのところに下記を書いています。 Private Sub 失効有無_AfterUpdate() DoCmd.GoToRecord , , acNewRec DoCmd.GoToControl "ID" End Sub 以前はこれでうまくいったと思います。。。 おかしいですか? よろしくお願いします、

  • Accessで一件の新規レコードのみを登録する方法

    OS: win xp Access Version: 2003 フォームを使って新規レコード入力できるように   Private Sub Form_Load() Docmd.GoToRecord,, acNewRec End Sub として、開いています。 ここの際、問題なのですが、ホイールマウスを使っているとデータ入力中に誤ってホイールを回すことにより次の新規レコードに移ってしまいます。 これを制限したいと思います。 この類の過去で検索しましたが、解決に至っていません。 ご意見をください。

  • Access レコード移動時イベントでサブフォーム

    お世話になります。 親フォーム Aがあります。(データソースが存在します) その中にサブフォームBがあります。(データソースが存在します) 親フォームのレコード移動時のイベントで、いつもサブフォームのレコードの最後を表示したいのです。そこで・・・ 親フォームAの レコード移動時イベントに Private Sub Form_Current() Me.B.SetFocus DoCmd.GoToRecord , , acLast End Sub 上記を記述すると、一番初めはきちんとサブフォームBのレコードは最後を表示するのですが、以後、親フォームのレコードを動かすと、親フォームの最後のレコードをさしっぱなしになってしまいます。 Me.B.SetFocus DoCmd.GoToRecord , , acLast これの後にどんな記述をすれば、親フォームのレコードを動かすと同時にサブフォームBも最後の行に移るようにできますでしょうか? 何卒よろしくお願いいたします。

  • レコードを保存するコード アクセスvba

    アクセスですが DoCmd.Save acForm, Me.Name このコードはフォームを保存するコードですよね? フォームではなく、レコードを保存するコードはありますか?

  • レコードの保存について

    Access2002,WinXP Proで受注管理システムを開発しているのですが メインフォームにて、「請求書発行ボタン」なるものを作成し ボタンをクリックすると、請求書発行ウィザードが立ち上がるように しています。 (ウィザードといっても、請求書に記載する為の備考入力欄と プレビューボタンがあるダイアログなだけですが) ここで、たとえば備考入力欄に何か入力しプレビューボタンを クリックすると請求書レポートが開き、備考欄には 今しがた入力した備考がちゃんと反映されている。という事を 実現させたいのですが、うまくいきません。 どうやら備考入力欄に入力した備考内容が レコードとして保存されていないという事が原因と思うのですが・・・ ちなみに、プレビューボタンのクリック時のイベントプロシージャには ---- [Forms]![F_売上情報編集]![請求書備考].Value = Me![請求書備考].Value DoCmd.RunCommand acCmdSaveRecord DoCmd.OpenReport "R_請求書(プレビュー)", acViewPreview, , "受注ID = " & [Forms]![F_売上情報編集]![受注ID] & "" DoCmd.Close acForm, "F_請求書発行ウィザード" ---- のように記述していますが、DoCmd.RunCommand acCmdSaveRecordは カレントフォーム?上のレコードしか保存しないのでしょうか。 だとしたら、他フォームのレコードの保存はどのようにして 行うのでしょうか。

  • アクセスVBAにて登録ボタン押下時の動作記述

    顧客登録フォームで登録ボタンの押下時、更新前処理にて「はい/いいえ」の選択をしています。 ×ボタンでも更新前処理が実行されるため処理の記述に困っています。 下記が希望動作です。 -----登録ボタン はい  → レコードを保存する  顧客登録フォームを閉じる 顧客照会フォームを開く    いいえ → レコードを保存しない 顧客登録フォームに留まる -----×ボタン はい  → レコードを保存する  顧客登録フォームを閉じる いいえ → レコードを保存しない 顧客登録フォームを閉じる -----現在のソース Private Sub Form_BeforeUpdate(Cancel As Integer)   Ret = MsgBox("登録しますか", vbYesNo)   Select Case Ret     Case vbNo     Me.Undo   End Select End Sub Private Sub 登録_Click()   DoCmd.RunCommand acCmdSaveRecord End Sub どのように記述したらよいのでしょうか。 以上宜しくお願いします。

  • Access2003にて、メインフォーム上に設置した「コピー」ボタンを

    Access2003にて、メインフォーム上に設置した「コピー」ボタンをクリックすると、メインフォームとサブフォーム9個のレコードを一括で新規レコードにコピーするVBAを作成しています。 ですが、ボタンをクリックすると、 「3164  フィールドを更新できません」 とメッセージが表示されて、メインとサブ1だけがコピーされ、サブ2~9はコピーされません。 テーブルの構成は以下のようになっています。 メイン(テーブル名:00メイン)  ・計画書番号(オートナンバー型)※主キー  ・コピーフラグ(数値型)  ・コピー実行日(日付型)  ・作成フラグ(数値型)  ・作成日(日付型)  ※この他40程フィールドがあります。 サブ1~9(テーブル名:01~09サブ)  ・計画書番号(長整数型)※インデックスは「はい(重複なし)」  ・レコード作成用番号(長整数型)  ※この他各サブテーブルごとに、20~40程のフィールドがあります。 サブ1~9の計画書番号はメインの計画書番号とリレーションシップしています。 サブフォームに計画書番号を表示するようにしてみると、コピーボタンをクリックしたときサブ2だけがメインで取得した新しい計画書番号が表示されていて、サブ2~9はコピー元の計画書番号が表示されています。 以下にコピーボタンをクリックした時のコードとBeforeUpdate時のコードを記載します。 また、「Forms!メイン!サブ1.Form.レコード作成用番号 = Me.txt計画書No」の箇所はメインの新規作成時にサブ1~9にレコードを作成するようにしています。 (メイン作成と同時にサブにもレコードを作成したかったので・・・) サブ2~9までのコピーができるようにするにはどうしたらよいのでしょうか? よろしくお願いいたします。 Private Sub cmdコピー_click() DoCmd.RunCommand acCmdSelectRecord DoCmd.RunCommand acCmdCopy DoCmd.GoToRecord , , acNewRec DoCmd.RunCommand acCmdPasteAppend Me!コピーフラグ = 1 Me!コピー実行日 = Date Me!サブ1.SetFocus DoCmd.RunCommand acCmdSelectRecord DoCmd.RunCommand acCmdCopy DoCmd.GoToRecord , , acNewRec DoCmd.RunCommand acCmdPasteAppend Me!サブ2のサブフォーム.SetFocus DoCmd.RunCommand acCmdSelectRecord DoCmd.RunCommand acCmdCopy DoCmd.GoToRecord , , acNewRec DoCmd.RunCommand acCmdPasteAppend ※以下サブ3~9までサブ2と同じコードを記述しています。 MsgBox "レコードのコピーが完了しました。" End Sub Private Sub Form_BeforeUpdate(Cancel As Integer) Dim dlgret As Integer dlgret = MsgBox("編集内容を保存しましすか?", vbQuestion + vbOKCancel, "保存確認") If dlgret = vbCancel Then Cancel = True Else '新規作成の場合、作成日フラグは既定値0のため1に変更 If Me!作成フラグ = 0 Then Me!作成フラグ = 1 Me!作成日 = Date If Me!コピーフラグ = 1 Then Forms!メイン!サブ1.Form.Requery Forms!メイン!サブ2.Form.Requery ※サブ3~9も同様にRequeryを行ないます。 Else MsgBox "コピーフラグは" & Forms!メイン!コピーフラグ & "です。" & Chr(13) & _ "新規作成を実行します。""" Forms!メイン!サブ1.Form.レコード作成用番号 = Me.txt計画書No Forms!メイン!サブ2.Form.レコード作成用番号 = Me.txt計画書No ※サブ3~9も同様に処理します。 End If Else End If End Sub

  • トグルスイッチをVBAでコントロール

    マイクロソフトアクセス2000で作成しています。 メインフォームとサブフォームを使っています。 メインフォームにあるトグルスイッチを押した時に、サブフォームの最新レコードに移動したいと 考えています。 ボタンを押したときに、VBAの命令は動くのですがトグルスイッチが押した状態になりません。 VBAで押した状態にしようとしても命令言語がわかりません。 ご教授をお願い致します。 Me.トグルスイッチ1=true <- ここが動きません。 DoCmd.GoToControl "サブフォーム名" DoCmd.GoToRecord , , acNewRec

専門家に質問してみよう