こんにちは、Accessブロガーのなかぜんです!
「Accessのフォームに入力したのに、レコードが保存されない…」こんな経験、ありませんか?
せっかく入力したデータが消えてしまうと、がっかりしますよね。でも大丈夫!この記事では、レコードが保存されないときにありがちな原因と、その対処法をわかりやすく解説します。
業務でAccessを使っている方はもちろん、これから勉強していきたい方にも役立つ内容になっていますので、ぜひ参考にしてくださいね!
レコードが保存されない主な原因
1. 入力内容が保存トリガーを満たしていない
Accessのフォームは、「フォーカスが移動したとき」や「保存命令を明示的に出したとき」にデータを保存します。つまり、フォームを開いて入力したまま閉じると、保存されないことがあります。
2. 必須フィールドが未入力
テーブル側で「必須」に設定されたフィールドが空欄だと、レコードは保存されません。エラーメッセージが表示される場合もあれば、無言で保存がキャンセルされる場合もあります。
3. データ型の不一致
例えば「日付型」のフィールドに「文字列」を入力しようとすると、保存できません。フォーム上で入力チェックを入れることで、防ぐことができます。
4. VBAやマクロの影響
VBAでデータ処理をしている場合、うまく保存できない原因がコードにあることも。保存処理が明示的に書かれていない、あるいはエラーで止まっているなどが考えられます。
レコード保存を確実にする方法
【例】保存ボタンで強制的に保存するVBAコード
Private Sub btn保存_Click()
If Me.Dirty Then
Me.Dirty = False '変更を確定して保存
MsgBox "保存しました!", vbInformation
Else
MsgBox "変更はありません。", vbExclamation
End If
End Sub
【解説】
Me.Dirty
は「フォームに未保存の変更があるか」をチェックするプロパティです。Me.Dirty = False
で、保存処理が実行されます。- 保存が完了したら、メッセージボックスでユーザーに通知しています。
【補足】フォームのBeforeUpdateイベントで保存チェックも可能
レコード保存直前に確認したいときは、Form_BeforeUpdate
イベントを使うのもおすすめです。
Private Sub Form_BeforeUpdate(Cancel As Integer)
If IsNull(Me.氏名) Then
MsgBox "氏名を入力してください。", vbExclamation
Cancel = True '保存をキャンセル
End If
End Sub
これで「必須項目が空欄のまま保存される」ミスを防げます。
注意点とよくあるミス
- フォームを終了するときに保存確認を入れていない
→意図せずデータが保存されないことがあります。 - オートナンバー型のフィールドを手動入力しようとしている
→このフィールドはAccessが自動で管理するので、直接入力しないようにしましょう。 - サブフォームで親テーブルのキーが空欄
→リレーションシップのキーが未設定だと、保存できません。
中級者向け:応用ポイント
トランザクション処理で保存の確実性を高める
複数のテーブルにデータを書き込むときは、トランザクション処理を使うと便利です。
Dim db As DAO.Database
Set db = CurrentDb
db.BeginTrans
On Error GoTo ErrHandler
' 複数のレコード追加処理
db.Execute "INSERT INTO T_受注 (...) VALUES (...)", dbFailOnError
db.Execute "INSERT INTO T_明細 (...) VALUES (...)", dbFailOnError
db.CommitTrans
MsgBox "すべてのデータが保存されました。", vbInformation
Exit Sub
ErrHandler:
db.Rollback
MsgBox "保存中にエラーが発生しました。", vbCritical
これで、途中でエラーが出たときも安全にロールバック(元に戻す)できます。
まとめ:保存されないときは、焦らず確認を!
Accessでレコードが保存されないときは、
- 保存トリガーが働いているか?
- 必須フィールドが入力されているか?
- VBAで明示的に保存しているか?
このあたりをチェックすれば、大体の問題は解決できます。
まずはこの記事で紹介した方法を実践してみてくださいね!
それでは、今日もAccess開発を楽しんでいきましょう♪
