【入門編】フォームのActiveControlプロパティを活用した汎用的な入力バリデーション関数の構築 – Access VBA解析バイブル

スポンサーリンク

脱・コピペ地獄!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エンジニアの仲間入りです!

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