- ベストアンサー
Accessでレコードの保存をせずにフォームを閉じたい
Accessでデータベースのレコード追加を行うフォームを作成しています。 コマンドボタン(1)をクリック→新しいレコードの追加 コマンドボタン(2)をクリック→フォームを閉じる としています。(ウィザードを使用して、埋め込みマクロ?を設定しています。) コマンドボタン(1)でレコードが追加されるのは問題ないのですが、 コマンドボタン(2)をクリックした場合も、レコードが追加されていることに気がつきました。 一般的に入力する人は、 データを追加しようと思って入力していたけれど、 途中でやめてフォームを閉じることってありますよね? そういう場合にレコードが追加されてしまったら問題だと思ったのです。 ですが、どうしたらレコードの追加をせずにフォームを閉じられるかがわかりません。 それって可能でしょうか? Access初心者です。難しいVBAとかはまだよくわかりません。 何か方法、アドバイス等ありましたら よろしくお願いします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
フォームを閉じたときに保存されるのは仕様です それ以外にAccessを終了したとき、レコードを移動したときにも保存されます これらを完全にカバーするには、非連結のフォームにし ボタンクリックでデータをテーブルに書き込むようにするか 作業用のテーブルから作ったフォームで入力し ボタンクリックで本テーブルに転記するようにします どちらにしてVBAが必要ですね、しかもへんなレコードを書き込もうとすると コードが止まってしまいますから 転記前にデータの整合性を完全にチェックする必要があります という訳でかなりきちんとしたコードが書けるスキルが必要ですね
その他の回答 (1)
完全な対策はVBAでないと不可能です。 全く、VBA を書かないとすれば、コマンドボタンを増やすという手があります。 もちろん、{ESC}を2度押すようにしてもいいです。 Private Sub コマンド_フォームを閉じる_Click() On Error Resume Next DoCmd.Close End Sub Private Sub コマンド_レコードを復元_Click() On Error Resume Next DoCmd.DoMenuItem acFormBar, acEditMenu, acUndo, , acMenuVer70 End Sub Private Sub コマンド_レコードを保存_Click() On Error Resume Next DoCmd.DoMenuItem acFormBar, acRecordsMenu, acSaveRecord, , acMenuVer70 End Sub これらのコマンドボタンをウィザードで生成すればいいです。 ただ、上の例では冗長なコードを消しているだけです。 これを応用して、 Private Sub コマンド_最後に編集したレコードを保存しないでフォームを閉じる_Click() On Error Resume Next DoCmd.DoMenuItem acFormBar, acEditMenu, acUndo, , acMenuVer70 DoCmd.Close End Sub しかし、これもレコード移動されていたんじゃどうしようもないです。 <tbl1> ID___fld1___fld2 1____aaa1___bbbb 2____aaa2___null しかし、こういうnull値を持つレコードの発生を完全に阻止するには、チェックして削除するしかないです。 Private Sub Form_Close() On Error Resume Next DoCmd.RunSQL "DELETE FROM tab1 WHERE LEN(fld2 & '')=0" End Sub VBと言っても、SQLの DELETE文を書くだけです
お礼
お礼がおそくなりました。 やはり簡単にはいきそうにないですね。 ありがとうございました。
お礼
お礼がおそくなりました。 Accessがそういうものだということで、 入力する人に周知しておくのがいいような気がしてきました。 ありがとうございました。