【入門編】フォームのActiveControlプロパティを活用した、汎用的な入力チェック関数の構築 – Access VBA解析バイブル

スポンサーリンク

Access VBAを掌握する:`Screen.ActiveControl`で実現する「神」入力チェック関数

こんにちは。Accessの迷宮を探索するエンジニアの皆さん。
今日は、多くの開発者が陥る「フォームごとに似たようなチェックコードを何度も書く」という悪癖から卒業し、「たった一つの関数ですべてを制する」ための極意を伝授します。

Access VBAにおいて、フォーム上のコントロールを一つずつ参照してバリデーション(入力チェック)をするのは、新人時代の通過儀礼のようなものです。しかし、真のアーキテクトはそんな非効率なことはしません。

今回は、`Screen.ActiveControl`という魔法のプロパティを使い、「どのコントロールから呼ばれても、自律的に自分自身をチェックする」汎用関数を構築しましょう。

なぜ「汎用関数」なのか?

もし、10個のテキストボックスがあり、それぞれに「空欄チェック」を書いたとします。もし仕様変更で「エラー時の色を赤から黄色に変えたい」と言われたら?……10箇所修正するのは地獄の始まりです。

汎用関数は、あなたの保守コストをゼロに近づけるための「投資」です。

1. 魔法の入り口:`Screen.ActiveControl` とは

Accessには、現在ユーザーが操作している(フォーカスがある)コントロールを指し示す `Screen.ActiveControl` というオブジェクトがあります。

これを使うと、「いま、どこのボタンを押したか?」「いま、どのテキストボックスに入力したか?」を、コード側でわざわざ指定しなくても自動で特定できるのです。

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

標準モジュール(例:`modValidator`)を新規作成し、以下のコードを貼り付けてください。

Option Compare Database
Option Explicit

‘ 汎用的な入力チェック関数
‘ 戻り値:Trueなら正常、Falseなら異常(チェック失敗)
Public Function ValidateCurrentControl() As Boolean
Dim ctrl As Control
Set ctrl = Screen.ActiveControl ‘ 今、操作しているコントロールを特定

‘ 1. 空白チェック
If IsNull(ctrl.Value) Or ctrl.Value = “” Then
MsgBox ctrl.Name & ” は必須入力です!”, vbExclamation, “入力エラー”
ctrl.SetFocus ‘ エラー箇所にカーソルを戻す
ValidateCurrentControl = False
Exit Function
End If

‘ 2. 数値型チェック(コントロール名に”Num”が含まれる場合のみ実行する例)
If InStr(ctrl.Name, “Num”) > 0 Then
If Not IsNumeric(ctrl.Value) Then
MsgBox “数値のみ入力可能です。”, vbCritical, “型エラー”
ctrl.SetFocus
ValidateCurrentControl = False
Exit Function
End If
End If

‘ 全チェックを通過したら成功
ValidateCurrentControl = True
End Function

3. どうやって使うのか?

使い方は拍子抜けするほど簡単です。
フォーム上の各テキストボックスの「更新後処理(AfterUpdate)」プロパティに、以下の一行を書くだけです。

=ValidateCurrentControl()

これだけで、ユーザーが値を入力するたびに、この関数が「自分自身が誰なのか」を判断し、適切なバリデーションを自動実行してくれます。

4. 陥りやすい罠と解決策

初学者がよくやるミスは、「フォームが閉じる時のチェック」と「入力時のチェック」を混同することです。

  • 罠: `AfterUpdate`(更新後処理)は、値が変更された時にしか走りません。空欄のまま放置されるとチェックが働かないことがあります。
  • 対策: フォームの「更新前処理(BeforeUpdate)」イベントにも、同様の汎用チェックロジックを組み込むことで、保存ボタンを押す直前の砦を築くことができます。

まとめ:ここをクリアすれば、あなたは中級者です

今回お伝えした `Screen.ActiveControl` は、Access VBAにおける「動的プログラミング」の第一歩です。

1. 疎結合にする: コントロール名に依存しないコードを書く。
2. イベントを使いこなす: `AfterUpdate`と`ActiveControl`の組み合わせで、コード量を劇的に減らす。
3. 再利用性を高める: 標準モジュールにロジックを隔離する。

これができるようになれば、あなたはもう「マクロの記録」に頼るだけのユーザーではありません。Accessという巨大なシステムを、あなたの手の中で自由に操れるようになっているはずです。

さあ、次はどんな機能を自動化しましょうか?
困ったことがあれば、いつでもこの場所へ戻ってきてくださいね。あなたのコードが、より美しく、より堅牢になることを応援しています!

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