【入門編】フォームの「BeforeUpdate」イベントで実装する、複雑な入力値妥当性チェック – Access VBA解析バイブル

スポンサーリンク

Access VBAの極意:BeforeUpdateイベントで「データの城壁」を築く

こんにちは。業務自動化の世界へようこそ。
Accessを使っていて、「とりあえず動くもの」から「壊れないシステム」へステップアップしたいなら、今日解説する「BeforeUpdate(更新前処理)」こそが、その分かれ道です。

多くの人が、ボタンを押した時にチェックを行おうとしますが、それは「穴だらけのザル」です。Accessには、データが保存される直前の「最後の砦」があります。そこを掌握すれば、あなたのデータベースは一気にプロの品質へ近づきます。

1. なぜ「ボタン」ではなく「BeforeUpdate」なのか?

初心者のうちは、「登録ボタンを押した時にチェックを走らせる」という発想になりがちです。しかし、Accessには他にも「フォームを閉じる」「レコード移動する」など、データを保存する方法が山ほどあります。

`BeforeUpdate`イベントは、「保存される直前」に必ず発動する、OSレベルの監視カメラのようなものです。ここでチェックをかけ、条件を満たさなければ「Cancel = True」と宣言するだけで、Accessは物理的に保存を拒否します。これこそが、不正なデータの混入を確実に防ぐ唯一の解なのです。

2. 複雑な妥当性チェックの実装例

例えば、「開始日」と「終了日」があり、「終了日は必ず開始日より後でなければならない」というルールを実装してみましょう。

Private Sub Form_BeforeUpdate(Cancel As Integer)
‘ 【解説】
‘ Cancel引数にTrueを代入すると、保存処理そのものが中断されます。

‘ 1. 空白チェック(必須入力の検証)
If IsNull(Me.txtStartDate) Or IsNull(Me.txtEndDate) Then
MsgBox “開始日と終了日は必須です。”, vbExclamation
Cancel = True ‘ 保存を中断
Me.txtStartDate.SetFocus ‘ 該当箇所へフォーカスを戻す
Exit Sub
End If

‘ 2. 期間の整合性チェック(複数フィールドにまたがるロジック)
If Me.txtEndDate < Me.txtStartDate Then MsgBox "終了日は開始日より後の日付を指定してください。", vbCritical ' ユーザーに再入力を促すためにキャンセル Cancel = True ' フォーカスを戻して入力をやり直させる Me.txtEndDate.SetFocus End If ' ここまで到達すれば、データは安全だと判断できる End Sub

このコードの「賢いポイント」

  • Cancel = True: これが魔法の呪文です。これがないと、どんなにエラーメッセージを出してもデータは強引に保存されてしまいます。
  • SetFocus: ユーザーに「どこがダメだったか」を即座に知らせる親切心です。UX(ユーザー体験)の観点からも重要です。

3. 陥りやすい「落とし穴」を回避せよ

中級者への道で、多くの人がここで躓きます。

① 「Cancel」と「Undo」の混同

エラーが出た時、`Me.Undo`を使いたくなるかもしれません。しかし、`Undo`はフォーム上の変更をすべてリセットします。「一部だけ直したいのに全部消えた!」という事態を防ぐため、まずは`Cancel = True`で留めるのが、現場での大人の対応です。

② CurrentDbの多用を控える

`CurrentDb.Execute`などのSQL実行を、この`BeforeUpdate`の中で多用しないでください。バリデーション(妥当性チェック)は、あくまで「フォーム上の値」をチェックする場所です。データベースの書き換えは、保存が確定した後の`AfterUpdate`で行うのが、Accessのオブジェクトライフサイクルにおける「正しい作法」です。

4. プロの視点:コードを綺麗に保つコツ

チェック項目が増えてくると、`BeforeUpdate`の中身が「if文の迷宮」になります。そんな時は、ロジックを関数として切り出しましょう。

‘ 判定ロジックを外に出すことで、コードが驚くほどスッキリします
Private Function IsValidData() As Boolean
If Me.txtEndDate < Me.txtStartDate Then IsValidData = False Exit Function End If ' 他の複雑なチェックもここに追加可能 IsValidData = True End Function Private Sub Form_BeforeUpdate(Cancel As Integer) If Not IsValidData() Then MsgBox "入力内容に不備があります。" Cancel = True End If End Sub ---

最後に:完璧を目指さず、まずは「守り」から

Access VBAの世界へようこそ。最初は難しく感じるかもしれませんが、この`BeforeUpdate`をマスターするだけで、あなたのシステムは「動く」から「使える」へと進化します。

まずは今日紹介した「Cancel = True」を自分のフォームで試してみてください。そこから、あなたのエンジニアとしての城壁作りが始まります。

何か分からないことがあれば、いつでも質問してください。共に最高のシステムを構築していきましょう!

タイトルとURLをコピーしました