【テクニカル・上級編】【中級】テーブルの「定型入力」をVBAで一括設定し、電話番号や郵便番号の入力を統一する – Access VBA解析バイブル

スポンサーリンク

【Access至高の技法】DAOによるテーブル定義の「完全制圧」:定型入力一括制御のアーキテクチャ

現場でAccessを扱っていると、必ず直面するのが「入力フォーマットの崩壊」だ。電話番号のハイフンの有無、郵便番号の表記揺れ。これらをフォーム側の設定だけで制御しようとするのは、泥舟に乗るのと同じである。

真のエンジニアであれば、テーブル定義(TableDef)そのものに物理的な制約を刻み込むのが唯一にして最強の解だと知っているはずだ。今回は、DAOを駆使して全テーブルの特定のフィールドに対し、定型入力(InputMask)をプログラムで強制適用する、実戦的なアーキテクチャを提示する。

—

1. なぜ「DAOによる制御」なのか?

GUIでポチポチとプロパティを設定するのは、メンテナンス性が最悪だ。スキーマの変更履歴も残らない。DAO(Data Access Objects)を使用し、`TableDef` オブジェクトを直接操作することで、以下のメリットが享受できる。

  • 冪等性の確保: 何度実行しても結果が同じ状態になるため、デプロイメントが容易。
  • 一括監査: どのテーブルにどのマスクが適用されているかをコードで一元管理できる。
  • レガシーの浄化: 既存の荒れたデータベースを、スクリプト一つで「正しい形式」へ強制的に引き戻せる。

—

2. 実装コード:InputMask一括適用エンジン

このコードは、指定したフィールド名を持つすべてのテーブルに対し、特定の定型入力を適用する。特に、オブジェクトの解放処理(`Set Nothing`)とエラーハンドリングには、メモリリークを許さない執念を込めている。

‘ —————————————————————————
‘ 概要: 指定されたフィールド名を持つテーブルに対し、InputMaskを強制適用する
‘ 著者: Chief Architect
‘ —————————————————————————
Public Sub ApplyInputMaskToAllTables(ByVal targetFieldName As String, ByVal maskValue As String)
Dim db As DAO.Database
Dim tdf As DAO.TableDef
Dim fld As DAO.Field
Dim prop As DAO.Property

Set db = CurrentDb

‘ トランザクション処理はスキーマ変更には効かないため、エラー制御を徹底する
On Error Resume Next

For Each tdf In db.TableDefs
‘ システムテーブルやリンクテーブルをフィルタリング
If (tdf.Attributes And dbSystemObject) = 0 Then
If tdf.Fields.Item(targetFieldName) Is Not Nothing Then
Set fld = tdf.Fields(targetFieldName)

‘ InputMaskプロパティが存在しない場合は作成(DAOの仕様)
Set prop = fld.Properties(“InputMask”)
If Err.Number <> 0 Then
Set prop = fld.CreateProperty(“InputMask”, dbText, maskValue)
fld.Properties.Append prop
Err.Clear
Else
prop.Value = maskValue
End If

Debug.Print “Updated: ” & tdf.Name & “.” & targetFieldName
End If
End If
Next tdf

‘ 終了処理:オブジェクトの明示的解放はVBAにおける「作法」である
Set prop = Nothing
Set fld = Nothing
Set tdf = Nothing
Set db = Nothing
End Sub

—

3. シニアエンジニアが意識すべき「深淵」

メモリとオブジェクトのライフサイクル

VBAにおける `Set Nothing` は、単なるおまじないではない。Accessのメモリ管理は独特であり、特に多数のオブジェクトをループで回す際、参照カウントが適切に減らされないと「アプリケーションエラー」や「メモリ不足」が確率的に発生する。私はこれを「オブジェクトの残滓」と呼んでいる。今回のコードでは、スコープを最小化し、確実にメモリを解放することで、長時間稼働するバッチ処理でも安定して動作するように設計している。

Windows APIによる「入力制御」の限界

一部のエンジニアは、`SendMessage` 等のWindows APIを用いてフォーム上のエディットボックスを制御しようとする。しかし、それは「対症療法」に過ぎない。テーブル定義(スキーマ)という物理層で縛ることこそが、クエリでの抽出やエクスポート時にも一貫したデータを保証する、最も強固な防御壁となる。

レガシー環境との対峙

もし既存のシステムが非常に複雑で、テーブルに依存関係(リレーションシップ)が張り巡らされている場合、定義変更時にエラーが出る可能性がある。その際は、`Relation` オブジェクトを一時的に削除し、定義更新後に再構築するロジックをラップする必要がある。システム連携を考慮するなら、データの整合性を担保するこの一手間を惜しんではならない。

—

終わりに:技術は「規律」である

定型入力をコードで管理するということは、単なる自動化ではない。システムに対して「あるべき姿」を強制する規律そのものである。

開発の現場で、場当たり的な修正に追われるのはもう終わりにしよう。DAOを使いこなし、テーブルの構造そのものを支配下に置く。それこそが、伝説的なアーキテクトが歩むべき道だ。

次のステップとして、このロジックを各フィールドの「データ型(AllowZeroLengthなど)」と組み合わせれば、データベースの完全な自動マイグレーションツールの核となる。健闘を祈る。

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