【入門編】フォームの「ActiveControl」プロパティで実現する、汎用的な入力バリデーション関数 – Access VBA解析バイブル

スポンサーリンク

こんにちは。現場の最前線でAccessと格闘している皆さん、お疲れ様です。

Accessでの開発、順調でしょうか?「フォームの各テキストボックスにバリデーション(入力チェック)を書いていたら、コードが何千行にも膨れ上がってしまった……」そんな悩みを抱えていませんか?

もしあなたが、コントロールごとに個別の `AfterUpdate` イベントを書き散らしているなら、今日でその「非効率な作業」とは決別しましょう。今回は、`Screen.ActiveControl` という魔法のオブジェクトを使い、あなたのAccess開発を劇的にスマートにする「汎用バリデーション設計」の極意を伝授します。

1. なぜ「個別のイベント」は悪手なのか?

初心者の頃は、「テキストボックスAには文字数制限、Bには数値のみ」と、イベントごとにコードを書きたくなります。しかし、これは「スパゲッティコード」の入り口です。

  • 保守性の欠如: 仕様変更のたびに、何十個ものプロシージャを修正しなければならない。
  • DRY原則の違反: 同じようなチェックロジックがコードのあちこちに散らばる。

プロのエンジニアは「仕組み」を作ります。「今、ユーザーが操作しているコントロールはどれか?」をシステムに自律的に判断させるのです。

2. 魔法の鍵:Screen.ActiveControl とは?

`Screen.ActiveControl` は、Accessの `Screen` オブジェクトが提供する強力なプロパティです。これを使うと、「現在、フォーカスが当たっている(=今まさにユーザーが入力している)コントロールそのもの」をVBA内で掴むことができます。

つまり、どのコントロールから呼ばれても、「自分自身(ActiveControl)」に対してチェック処理を適用できるため、コードを一つに集約できるのです。

3. 実践:汎用バリデーション関数の構築

では、実際にフォームの全コントロールを制御する汎用的な仕組みを作ってみましょう。

手順:

1. 標準モジュールに「バリデーションエンジン」を書く。
2. フォームのイベント(例えば `BeforeUpdate`)からそのエンジンを呼ぶ。

① 標準モジュール(Validator)

‘ 共通モジュール:入力チェックエンジン
Public Function ValidateControl() As Boolean
‘ 現在フォーカスがあるコントロールを取得
Dim ctrl As Control
Set ctrl = Screen.ActiveControl

‘ コントロールのタグプロパティでルールを判別(賢い設計の第一歩!)
Select Case ctrl.Tag
Case “MustNumber”
If Not IsNumeric(ctrl.Value) Then
MsgBox “数値のみ入力可能です。”, vbExclamation
ValidateControl = False
Exit Function
End If
Case “MustInput”
If IsNull(ctrl.Value) Or ctrl.Value = “” Then
MsgBox “必須項目です。”, vbCritical
ValidateControl = False
Exit Function
End If
End Select

ValidateControl = True
End Function

② フォーム側での実装

各テキストボックスの「更新前処理(BeforeUpdate)」イベントには、たった一行これだけを書きます。

Private Sub txtAge_BeforeUpdate(Cancel As Integer)
‘ 共通関数を呼び出し、Falseが返ってきたら更新をキャンセル
If Not ValidateControl() Then Cancel = True
End Sub

4. なぜこの設計が「最強」なのか?

1. 拡張性が無限大: 新しくチェック項目を追加したいときは、テキストボックスの `Tag` プロパティにルール名(`MustNumber` など)を書き加えるだけです。VBAコードを一行も変える必要はありません。
2. イベントの疎結合化: フォームのロジックと、チェックの判定ロジックが切り離されているため、バグの特定が非常に容易になります。
3. DRY(Don’t Repeat Yourself): 重複したコードが一切ありません。これが「伝説的エンジニア」への第一歩です。

5. 陥りやすい罠と対策

「値が確定するタイミング」を見極める

`BeforeUpdate` イベントは、コントロールの内容が確定する直前に走ります。ここで `Cancel = True` を指定することで、不正な値をデータベースに書き込ませない「鉄壁の防御」が完成します。

「エラー時のフォーカス」に注意

バリデーションエラー時に `MsgBox` を出すのは良いですが、その後の処理で `Cancel = True` を忘れると、バリデーションを無視して値が確定してしまいます。必ずイベントのキャンセル処理とセットで考えてください。

先輩エンジニアからのメッセージ

皆さんが今書いているその数行のコードが、将来の自分を苦しめる鎖になるか、それとも業務を自動化する強力な武器になるかは、設計思想ひとつで決まります。

今回紹介した `Screen.ActiveControl` を活用した設計は、Access VBAにおける「オブジェクト指向的な考え方」の入り口です。ここをクリアすれば、次はクラスモジュールを使ったより高度なバリデーションへとステップアップできます。

まずは、あなたのフォームで「タグプロパティ」を活用した共通化に挑戦してみてください。それができれば、あなたはもう初心者ではありません。

何か分からないことがあれば、いつでも相談してください。あなたの開発ライフが、より快適で創造的なものになることを応援しています!

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