脱・コピペ地獄!ActiveControlで実現する「究極の汎用バリデーション」術
こんにちは。Accessの迷宮に足を踏み入れ、日々クエリやフォームと格闘している皆さん。
「テキストボックスが10個あるから、それぞれの『更新後処理』に10回同じチェックコードを書く……」そんな作業をしていませんか?
それは、いわゆる「ボイラープレート(定型文)の奴隷」です。今日でその鎖を断ち切りましょう。
今日は、Access VBAの心臓部である`Screen.ActiveControl`を使い、コードを劇的にスマートにする「魔法の関数」を伝授します。
—
1. なぜ「イベントごとの記述」が罪なのか?
初心者が陥りやすい最大の罠は、「コントロールごとに個別のプロシージャを作る」ことです。
もし仕様変更で「入力チェックのルールを変えてくれ」と言われたら、10個のプロシージャをすべて書き換える必要がありますよね? 修正漏れが発生し、バグの温床になります。
「賢いエンジニアは、自分自身をコードの中に書かない」。
今、フォーカスが当たっている場所がどこであれ、その情報を自動的に取得できれば、コードは一つで済むのです。
—
2. 魔法の鍵:Screen.ActiveControl とは?
`Screen.ActiveControl`は、VBAにおける「今、ユーザーが操作しているそのコントロール」を指し示すポインタのようなものです。
これを使うと、以下のことが可能になります。
- どのコントロールでも、たった一つの関数を呼び出すだけでよい。
- コントロールの名前を意識せず、値を取得・評価できる。
さあ、実装を見てみましょう。
—
3. 実践:汎用バリデーション関数の構築
標準モジュールを一つ作成し、以下のコードを貼り付けてください。
‘ 標準モジュール:modValidator
Option Compare Database
Option Explicit
‘ @brief 汎用バリデーション関数
‘ @param vRule チェックルール(1:必須, 2:数値のみ)
‘ @return Boolean 成功ならTrue
Public Function ValidateControl(ByVal vRule As Integer) As Boolean
Dim ctrl As Control
Set ctrl = Screen.ActiveControl ‘ 現在フォーカスがあるコントロールを捕捉
ValidateControl = True ‘ 初期値はTrue
Select Case vRule
Case 1 ‘ 必須チェック
If IsNull(ctrl.Value) Or ctrl.Value = “” Then
MsgBox ctrl.Name & “は必須入力です。”, vbExclamation
ValidateControl = False
End If
Case 2 ‘ 数値のみチェック
If Not IsNumeric(ctrl.Value) Then
MsgBox ctrl.Name & “には数値を入力してください。”, vbCritical
ValidateControl = False
End If
End Select
End Function
—
4. フォームへの適用:コードは一行だけ
次に、フォームの各コントロールのイベント(例えば「更新後処理」)に、以下のたった一行を書くだけです。
Private Sub txtUserName_AfterUpdate()
‘ 必須チェック(ルールID: 1)を呼び出す
If ValidateControl(1) = False Then
‘ エラー時は入力を無効化してフォーカスを戻す等の処理
Me.Undo
End If
End Sub
どうですか? 今後、テキストボックスが100個になろうと、コードを追加するのはこの一行だけ。ルールが変わっても、標準モジュールの `Select Case` を修正するだけで全フォームに適用されます。
—
5. ここをクリアすれば一人前!注意すべきエラーの落とし穴
この手法を使う上で、一つだけ覚えておくべき「作法」があります。
- フォーカスの罠: `Screen.ActiveControl` は、当然ながら「フォーカスが当たっているもの」を参照します。ボタンを押した瞬間に実行すると、ボタン自体が `ActiveControl` になり、エラーになることがあります。
- 解決策: 入力チェックは、必ずコントロールの `BeforeUpdate`(更新前処理)で行ってください。このイベントは、値が確定する直前に発生するため、対象のテキストボックスが確実に `ActiveControl` として存在しています。
—
最後に:エンジニアとしての視点
Access VBAにおいて、オブジェクトのプロパティを「直接」触りに行くのではなく、`Screen`オブジェクトを介して「動的に」操作する――。
この考え方が身につくと、単なる「Accessの作業者」から、システムを設計する「アーキテクト」へと一段階上のステージに上がれます。
「もっと楽に、もっと美しく」。
この原則を忘れずに、これからもコードの海を楽しんでください。皆さんのAccessライフが、今日から少しだけスマートになることを願っています。
ここをクリアすれば、あなたはもう立派なAccess VBAエンジニアの仲間入りです!
